Cấu hình định tuyến và cách ly mạng VLAN cho IoT công nghiệp
Thiết lập VLAN riêng biệt (VLAN 100) để cách ly lưu lượng dữ liệu IoT khỏi mạng quản trị (Management Plane), đảm bảo tính bảo mật vật lý và logic.
Chúng ta sẽ cấu hình giao diện logic trên máy chủ Core Network (CUPS) để nhận traffic từ RAN và định tuyến vào VLAN riêng.
Bước 1: Cấu hình giao diện VLAN trên Linux
Định nghĩa giao diện VLAN100 trên cổng vật lý kết nối với Switch IoT (giả sử cổng là enp1s0).
ip link add link enp1s0 name enp1s0.100 type vlan id 100
ip addr add 10.100.1.1/24 dev enp1s0.100
ip link set enp1s0.100 up
Kết quả mong đợi: Giao diện enp1s0.100 xuất hiện trong danh sách ip link với trạng thái UP và có địa chỉ IP 10.100.1.1.
Bước 2: Cấu hình định tuyến (Routing Policy) để tách luồng
Sử dụng ip rule để định tuyến traffic từ thiết bị IoT (subnet 10.100.1.0/24) đi qua bảng định tuyến riêng, không đi qua gateway mặc định.
ip route add default via 192.168.1.254 dev enp1s0.100 table 100
ip rule add from 10.100.1.0/24 table 100
Kết quả mong đợi: Traffic từ IoT sẽ được định tuyến riêng biệt, không bị trộn lẫn với traffic quản trị. Kiểm tra bằng lệnh ip rule list sẽ thấy rule mới được thêm vào.
Bước 3: Bật chuyển tiếp IP (IP Forwarding)
Cho phép hệ thống hoạt động như một router để chuyển tiếp gói tin giữa RAN và mạng IoT.
sysctl -w net.ipv4.ip_forward=1
Kết quả mong đợi: Giá trị trả về là net.ipv4.ip_forward = 1. Để cấu hình này tồn tại sau khi khởi động lại, cần thêm vào file /etc/sysctl.conf.
Triển khai Firewall (nftables) cho lưu lượng IoT
Sử dụng nftables (thay thế cho iptables hiện đại) để tạo chính sách bảo mật chặt chẽ, chỉ cho phép các giao thức và cổng cần thiết cho IoT công nghiệp.
Bước 1: Xóa cấu hình cũ và tạo bảng mới
Khởi tạo bảng iot_security với chuỗi (chain) forward và input có chính sách mặc định là DROP (chặn mọi thứ).
nft flush ruleset
nft add table iot_security
nft add chain iot_security forward { type filter hook forward priority 0\; policy drop\; }
nft add chain iot_security input { type filter hook input priority 0\; policy drop\; }
Kết quả mong đợi: Bảng iot_security được tạo, mặc định chặn mọi traffic đi vào và đi qua.
Bước 2: Cho phép lưu lượng Loopback và Traffic đã thiết lập
Luôn cho phép traffic nội bộ (loopback) và các gói tin thuộc kết nối đã tồn tại (stateful filtering) để đảm bảo hoạt động ổn định.
nft add rule iot_security input iif "lo" accept
nft add rule iot_security input ct state established,related accept
nft add rule iot_security forward ct state established,related accept
Kết quả mong đợi: Các quy tắc cho phép traffic hợp lệ được thêm vào, không làm gián đoạn kết nối hiện tại.
Bước 3: Mở cổng cho giao thức IoT (MQTT, HTTPS, UDP)**
Chỉ cho phép traffic từ subnet IoT (10.100.1.0/24) vào các cổng dịch vụ cụ thể (1883 cho MQTT, 443 cho HTTPS, 8883 cho MQTT over TLS).
nft add rule iot_security input ip saddr 10.100.1.0/24 tcp dport { 1883, 443, 8883 } accept
nft add rule iot_security input ip saddr 10.100.1.0/24 udp dport { 5683, 53 } accept
Kết quả mong đợi: Các thiết bị IoT trong mạng 10.100.1.0/24 có thể kết nối đến các dịch vụ trên Core Network qua các cổng được chỉ định, các cổng khác sẽ bị chặn.
Bước 4: Cấu hình cho phép định tuyến từ RAN sang IoT
Cho phép traffic từ giao diện RAN (ví dụ: enp2s0) đi vào giao diện IoT (enp1s0.100).
nft add rule iot_security forward iif "enp2s0" oif "enp1s0.100" ip daddr 10.100.1.0/24 accept
nft add rule iot_security forward iif "enp1s0.100" oif "enp2s0" ip saddr 10.100.1.0/24 accept
Kết quả mong đợi: Lưu lượng từ RAN có thể đi xuyên firewall đến mạng IoT và ngược lại.
Cách verify: Chạy lệnh nft list ruleset để xem toàn bộ cấu hình, sau đó thử ping từ máy IoT vào máy chủ Core và ngược lại. Nếu ping thông và truy cập cổng MQTT được nhưng cổng SSH (22) bị chặn là thành công.
Cấu hình QoS (Quality of Service) cho dữ liệu thời gian thực
Áp dụng QoS để ưu tiên băng thông cho các gói tin điều khiển (Control Plane) và dữ liệu cảm biến thời gian thực (Real-time), tránh nghẽn mạng gây trễ (latency) cho các thiết bị công nghiệp.
Bước 1: Cài đặt bộ lọc và module tc
Cần đảm bảo kernel module sch_htb và cls_fw đã được tải. Sau đó cấu hình giao diện đầu ra (uplink) của Core Network.
modprobe sch_htb
modprobe cls_fw
tc qdisc add dev enp1s0.100 root handle 1: htb default 30
Kết quả mong đợi: Qdisc HTB được gắn vào giao diện enp1s0.100 với default class là 30 (lớp ưu tiên thấp).
Bước 2: Tạo các lớp ưu tiên (Classes)
Định nghĩa các class: Class 10 (Critical/Real-time - 50% băng thông), Class 20 (Business - 30%), Class 30 (Best Effort - 20%).
tc class add dev enp1s0.100 parent 1: classid 1:10 htb rate 50mbit ceil 100mbit prio 1
tc class add dev enp1s0.100 parent 1: classid 1:20 htb rate 30mbit ceil 60mbit prio 2
tc class add dev enp1s0.100 parent 1: classid 1:30 htb rate 20mbit ceil 40mbit prio 3
Kết quả mong đợi: Các lớp lưu lượng được tạo với tốc độ giới hạn và ưu tiên (prio) khác nhau.
Bước 3: Tạo Filter để phân loại traffic
Sử dụng tc filter để đánh dấu gói tin dựa trên DSCP hoặc cổng, sau đó đưa vào class tương ứng. Ví dụ: Traffic UDP trên cổng 5683 (CoAP) hoặc 1883 (MQTT) được ưu tiên cao nhất.
tc filter add dev enp1s0.100 parent 1: protocol ip prio 1 u32 match ip dport 1883 0xffff flowid 1:10
tc filter add dev enp1s0.100 parent 1: protocol ip prio 1 u32 match ip dport 5683 0xffff flowid 1:10
tc filter add dev enp1s0.100 parent 1: protocol ip prio 2 u32 match ip dport 443 0xffff flowid 1:20
Kết quả mong đợi: Khi có traffic MQTT hoặc CoAP, nó sẽ tự động được phân vào class 1:10 (ưu tiên cao nhất), đảm bảo độ trễ thấp nhất.
Cách verify: Sử dụng lệnh tc -s qdisc show dev enp1s0.100 để xem thống kê. Tạo traffic giả (ví dụ: iperf3) trên các cổng khác nhau và quan sát xem liệu traffic trên cổng 1883 có được ưu tiên gửi đi trước khi mạng bị tải cao hay không.
Cấu hình bảo mật IPsec cho giao diện F1 và NG
Thiết lập đường hầm IPsec (IKEv2) để mã hóa traffic giữa các thành phần mạng (CU-DU trên F1, CU-UP/CU-CP trên NG), ngăn chặn nghe trộm và giả mạo gói tin.
Bước 1: Cài đặt StrongSwan
Triển khai StrongSwan trên các máy chủ Core Network và RAN để quản lý IPsec.
apt update && apt install strongswan libstrongswan-pkcs11 -y
systemctl enable strongswan && systemctl start strongswan
Kết quả mong đợi: Dịch vụ strongswan chạy và trạng thái là active (running).
Bước 2: Cấu hình IPsec.conf cho giao diện NG (N1/N2)
File cấu hình /etc/ipsec.conf định nghĩa các kết nối. Dưới đây là ví dụ cho kết nối giữa AMF (Control Plane) và gNB (RAN).
conn gnb-amf-ng
type=tunnel
auto=add
left=192.168.10.5
leftid=@amf.core.local
leftcert=amf.pem
leftsubnets=10.100.1.0/24
right=192.168.10.10
rightid=@gnb.ran.local
rightcert=gnb.pem
rightsubnets=10.200.1.0/24
ike=aes256gcm16-sha256-modp2048!
esp=aes256gcm16-sha256!
dpddelay=30s
dpdaction=clear
keylife=1h
rekeymargin=3m
rekeyfuzz=50%
ikelifetime=1h
lifetime=24h
forceencaps=yes
Kết quả mong đợi: Cấu hình được lưu, StrongSwan sẽ tự động thiết lập tunnel khi khởi động hoặc khi có kết nối.
Bước 3: Cấu hình chứng chỉ (IPsec.secrets)
Định nghĩa đường dẫn đến private key và CA certificate để xác thực lẫn nhau.
@amf.core.local : /etc/ipsec.d/certs/amf.pem
@gnb.ran.local : /etc/ipsec.d/certs/gnb.pem
Kết quả mong đợi: StrongSwan có thể tìm thấy chứng chỉ để bắt tay (handshake).
Bước 4: Cấu hình cho giao diện F1 (CU-DU)
Tương tự như trên, tạo một connection mới trong /etc/ipsec.conf cho giao diện F1, thay đổi địa chỉ IP và subnet tương ứng với giao diện F1.
conn cu-du-f1
type=tunnel
auto=add
left=192.168.10.20
leftid=@cu.core.local
leftcert=cu.pem
leftsubnets=10.100.1.0/24
right=192.168.10.25
rightid=@du.ran.local
rightcert=du.pem
rightsubnets=10.200.1.0/24
ike=aes256gcm16-sha256-modp2048!
esp=aes256gcm16-sha256!
Kết quả mong đợi: Tunnel F1 được thiết lập, traffic giữa CU và DU được mã hóa.
Cách verify: Chạy lệnh ipsec statusall. Nếu thấy trạng thái INSTALLED hoặc CONNECTED cho các connection gnb-amf-ng và là thành công. Sử dụng wireshark để chụp packet, bạn sẽ thấy traffic giữa các node đã được gói trong ESP (IP protocol 50).
Triển khai chứng chỉ số (CA) cho xác thực thiết bị và mạng
Xây dựng một Private CA (Certificate Authority) để cấp phát chứng chỉ số cho từng thiết bị IoT và các node mạng, thay thế cho cơ chế chia sẻ key tĩnh không an toàn.
Bước 1: Cài đặt OpenSSL
Chuẩn bị công cụ để tạo CA.
apt install openssl ca-certificates -y
Kết quả mong đợi: Các công cụ OpenSSL được cài đặt.
Bước 2: Tạo thư mục và cấu hình CA
Tạo cấu trúc thư mục tiêu chuẩn cho CA và file cấu hình openssl.cnf.
mkdir -p /etc/iot-ca/{certs,crl,newcerts,private}
touch /etc/iot-ca/index.txt
echo 1000 > /etc/iot-ca/serial
Tạo file cấu hình /etc/iot-ca/openssl.cnf với nội dung:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /etc/iot-ca
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
private_key = $dir/private/ca.key
certificate = $dir/certs/ca.crt
default_md = sha256
default_days = 3650
default_crl_days = 30
policy = policy_loose
[ policy_loose ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
string_mask = utf8only
default_md = sha256
x509_extensions = v3_ca
[ req_distinguished_name ]
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
Kết quả mong đợi: Cấu trúc thư mục và file cấu hình đã sẵn sàng để tạo chứng chỉ gốc.
Bước 3: Tạo Private Key và Self-Signed Certificate cho CA
Đây là chứng chỉ gốc (Root CA) dùng để ký cho tất cả các thiết bị IoT.
cd /etc/iot-ca
openssl genrsa -out private/ca.key 4096
openssl req -new -x509 -key private/ca.key -out certs/ca.crt -days 3650 -config openssl.cnf -extensions v3_ca -subj "/C=VN/ST=Hanoi/L=Hanoi/O=Industrial IoT Dept/CN=IoT-Root-CA"
Kết quả mong đợi: File ca.crt được tạo. Đây là file cần được tin cậy (trust) bởi toàn bộ hệ thống Core Network và RAN.
Bước 4: Tạo CSR và cấp chứng chỉ cho thiết bị IoT mẫu
Giả sử ta có một thiết bị IoT với ID là sensor-001.
openssl genrsa -out /etc/iot-ca/private/sensor-001.key 2048
openssl req -new -key /etc/iot-ca/private/sensor-001.key -out /etc/iot-ca/sensor-001.csr -subj "/C=VN/ST=Hanoi/O=Industrial IoT Dept/CN=sensor-001.iot.local"
openssl ca -batch -config openssl.cnf -in sensor-001.csr -out certs/sensor-001.crt -extensions usr_cert
Kết quả mong đợi: File sensor-001.crt được tạo trong thư mục certs. Chứng chỉ này đã được ký bởi Root CA.
Bước 5: Phân phối và cấu hình (Trust)
Copy ca.crt vào thư mục /etc/ssl/certs/ của các máy chủ Core và RAN để chúng tin tưởng các chứng chỉ con.
cp /etc/iot-ca/certs/ca.crt /usr/local/share/ca-certificates/iot-ca.crt
update-ca-certificates
Kết quả mong đợi: Hệ thống Linux đã tin tưởng chứng chỉ của IoT. Khi thiết bị IoT kết nối qua TLS/MQTT, server sẽ xác thực thành công dựa trên chứng chỉ sensor-001.crt.
Cách verify: Chạy lệnh openssl verify -CAfile /etc/iot-ca/certs/ca.crt /etc/iot-ca/certs/sensor-001.crt. Nếu trả về sensor-001.crt: OK thì chuỗi xác thực đã đúng.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Private 5G Network (Open RAN) với OAI, srsRAN và CUPS trên hạ tầng Proxmox để kết nối IoT công nghiệp an toàn
« Phần 4: Xây dựng Radio Access Network (RAN) với srsRAN và OAI
Phần 6: Triển khai thiết bị IoT và kiểm tra kết nối thực tế »