So sánh các giải pháp kiến trúc Virtual Router
Đó là lúc 2:15 sáng của một ngày thứ Ba thì toàn bộ tủ rack tại nhà tôi tắt lịm. Các cảnh báo giám sát gửi tới tấp về điện thoại từ 15 node tự vận hành. Các truy vấn DNS liên tục time out, còn tiến trình đồng bộ lưu trữ Ceph thì bị đình trệ hoàn toàn.
Tệ hơn nữa, máy ảo firewall chính bị kernel panic trong một đợt đẩy backup off-site đột biến sau khi ngốn sạch 6 GB RAM. Đứng nhìn màn hình console đơ cứng trong bóng tối, tôi buộc phải xem xét lại toàn bộ mô hình định tuyến mạng của mình. Vận hành một appliance ảo hóa cồng kềnh ngay tại lớp biên của homelab sẽ tạo ra những điểm nghẽn nghiêm trọng (single point of failure) mà bạn chỉ phát hiện ra khi sự cố ập đến.
Khi ảo hóa hệ thống định tuyến mạng trên Proxmox VE, bạn thường sẽ đứng trước ba lựa chọn:
- Firewall FreeBSD hạng nặng (pfSense / OPNsense): Bộ giải pháp bảo mật phong phú tính năng với khả năng kiểm tra gói tin sâu (DPI) và bảng trạng thái kết nối lớn. Tuy nhiên, chúng thường đòi hỏi tối thiểu 2 vCPU chuyên dụng cùng 4 GB RAM. Đây là mức tiêu hao tài nguyên không cần thiết nếu bạn chỉ cần định tuyến inter-VLAN tốc độ cao, DHCP và NAT.
- Router phần cứng vật lý (MikroTik / Ubiquiti EdgeRouter): Tách biệt rạch ròi giữa hypervisor và gateway lớp biên. Chúng vẫn hoạt động bình thường khi máy chủ khởi động lại. Điểm đánh đổi là số cổng cố định, thông lượng xử lý của CPU thấp hơn trên các dòng giá rẻ và không thể rollback snapshot tức thì khi một cấu hình thử nghiệm làm sập mạng.
- Virtual Router Linux tinh gọn (OpenWrt trên KVM): Loại bỏ toàn bộ thành phần dư thừa và chạy trên nhân Linux hiện đại. OpenWrt khởi động chỉ mất khoảng 3 giây, tiêu thụ chưa tới 70 MB RAM ở trạng thái nghỉ và giao tiếp trực tiếp với các Linux bridge của Proxmox. Hệ thống xử lý mượt mà tính năng lọc 802.1Q VLAN chuẩn của Linux mà không gặp các lỗi tương thích driver đặc thù như trên BSD.
Ưu và nhược điểm khi ảo hóa OpenWrt trên Proxmox
Việc đặt gateway lên cùng phần cứng đang lưu trữ các test container và storage pool luôn đi kèm những đánh đổi thực tế.
Ưu điểm
- Chiếm dụng tài nguyên cực thấp: OpenWrt chạy mượt mà chỉ với 1 vCPU và 512 MB RAM. Trên node Intel N100 của tôi, CPU chỉ dao động ở mức 0.3% khi tải rảnh rỗi dù đang định tuyến lưu lượng gigabit.
- Hỗ trợ Native Linux Bridge VLAN: OpenWrt xử lý dot1q tagging ngay khi xuất xưởng. Kết hợp với tính năng
vlan-awarebridge của Proxmox, việc trunk các subnet cho thiết bị IoT, khách và mạng tin cậy chỉ tốn vài dòng cấu hình. Bạn không bao giờ cần phải chỉnh sửa profile cổng trên switch uplink. - Khôi phục Snapshot siêu tốc: Nếu một chính sách firewall vô tình khóa quyền truy cập SSH của bạn, bạn có thể khôi phục lại snapshot Proxmox chỉ trong 10 giây trực tiếp từ giao diện dòng lệnh (CLI) của host.
- Thông lượng VirtIO đạt tốc độ dây (Wire-Speed): Driver bán ảo hóa VirtIO dễ dàng đẩy lưu lượng lên hơn 940 Mbps trên các đường uplink 1 Gbps tiêu chuẩn và vượt 9.2 Gbps trên các virtual bridge 10 Gbps với mức tải CPU không đáng kể, không cần đến PCIe pass-through chuyên dụng.
Nhược điểm
- Thời gian gián đoạn khi khởi động lại Host: Khi host Proxmox cập nhật nhân PVE mới và reboot, toàn bộ mạng gia đình sẽ mất kết nối Internet trong khoảng từ 45 đến 90 giây để máy chủ POST và khởi động lại các máy ảo.
- Bẫy mất quyền quản trị: Nếu bạn gán IP quản trị Proxmox vào một subnet được định tuyến độc quyền bởi máy ảo OpenWrt, một quy tắc firewall sai hoặc một bridge bị lỗi có thể cắt đứt hoàn toàn khả năng truy cập web GUI vào chính máy chủ host.
Kiến trúc đề xuất cho hệ thống mạng Homelab kiên cố
Tuyệt đối không bao giờ phụ thuộc vào interface của router ảo hóa để kết nối đến IP quản trị Proxmox. Thay vào đó, hãy cấu hình một địa chỉ quản trị độc lập ngay trên bridge nền tảng bên dưới.
Dưới đây là mô hình kiến trúc chuẩn tôi áp dụng cho các mini PC nhiều cổng mạng và máy chủ 1U:
- WAN Bridge (vmbr1): Gắn trực tiếp vào card mạng vật lý WAN (ví dụ:
enp2s0) nối với modem hoặc converter quang ONT. Giữ bridge này hoàn toàn không gán IP trên Proxmox—không cấu hình địa chỉ IP lẫn gateway trên host. - LAN & Trunk Bridge (vmbr0): Gắn vào card mạng vật lý LAN (ví dụ:
enp1s0) với thiết lậpbridge-vlan-aware yes. Gán cho Proxmox một địa chỉ IP tĩnh trực tiếp trên bridge này (chẳng hạn192.168.1.2/24) để kết nối tới host luôn thông suốt ngay cả khi OpenWrt đang tắt. - Thông số cấu hình máy ảo OpenWrt: 1 vCPU (loại
hostđể tận dụng tập lệnh mã hóa AES-NI), 512 MB RAM, một serial console, card mạng ảo VirtIO và 1 GB ổ cứng ảo.
Hướng dẫn triển khai chi tiết
Bước 1: Cấu hình VLAN-Aware Bridge trên Proxmox
SSH vào host Proxmox và chỉnh sửa file cấu hình network interfaces:
nano /etc/network/interfaces
Thiết lập các bridge riêng biệt cho interface WAN và đường trunk nội bộ:
# Giao diện WAN vật lý (không gán IP host)
auto enp2s0
iface enp2s0 inet manual
# WAN Bridge chuyển tiếp cho OpenWrt
auto vmbr1
iface vmbr1 inet manual
bridge-ports enp2s0
bridge-stp off
bridge-fd 0
# Giao diện LAN vật lý
auto enp1s0
iface enp1s0 inet manual
# LAN Bridge hỗ trợ VLAN (IP quản trị Proxmox đặt tại đây)
auto vmbr0
iface vmbr0 inet static
address 192.168.1.2/24
gateway 192.168.1.1
bridge-ports enp1s0
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
Áp dụng cấu hình mới ngay lập tức mà không cần khởi động lại máy chủ:
ifreload -a
Bước 2: Tải và giải nén Image OpenWrt
OpenWrt không cung cấp trình cài đặt dạng ISO tiêu chuẩn. Thay vào đó, hãy tải trực tiếp bản image UEFI ext4 x86/64 chính thức về host Proxmox:
mkdir -p /root/openwrt-install && cd /root/openwrt-install
# Tải image combined EFI bản generic x86/64 23.05.4
wget https://downloads.openwrt.org/releases/23.05.4/targets/x86/64/openwrt-23.05.4-x86-64-generic-ext4-combined-efi.img.gz
# Giải nén file image disk dạng raw
gunzip openwrt-23.05.4-x86-64-generic-ext4-combined-efi.img.gz
Bước 3: Khởi tạo khung máy ảo (VM Shell)
Tạo máy ảo bằng công cụ dòng lệnh qm của Proxmox. Chúng ta sẽ đặt VMID là 100 và cấu hình cổng serial ảo để truy cập console gọn nhẹ:
qm create 100 --name OpenWrt-Router \
--bios ovmf \
--machine q35 \
--cpu host \
--cores 1 \
--memory 512 \
--serial0 socket \
--net0 virtio,bridge=vmbr0,firewall=0 \
--net1 virtio,bridge=vmbr1,firewall=0 \
--ostype l26
Import image đã tải vào storage pool của bạn (ví dụ: local-lvm) và mở rộng dung lượng ổ đĩa vượt mức mặc định 120 MB:
# Import image vào storage pool
qm importdisk 100 openwrt-23.05.4-x86-64-generic-ext4-combined-efi.img local-lvm
# Gắn disk vào VirtIO SCSI controller
qm set 100 --scsihw virtio-scsi-single --scsi0 local-lvm:vm-100-disk-0
# Thêm EFI disk cho các biến khởi động UEFI
qm set 100 --efidisk0 local-lvm:0,format=raw,efitype=4m,pre-enrolled-keys=0
# Cấu hình thứ tự boot và mở rộng virtual disk lên 1GB
qm set 100 --boot order=scsi0
qm resize 100 scsi0 +880M
Bước 4: Cấu hình mạng ban đầu & Giao diện Web LuCI
Khởi động máy ảo và kết nối trực tiếp vào giao diện serial console:
qm start 100
qm terminal 100
Nhấn Enter để mở dấu nhắc lệnh root của OpenWrt. Với cấu hình này, eth0 kết nối vào vmbr0 (LAN) và eth1 kết nối vào vmbr1 (WAN). Cấu hình địa chỉ IP tĩnh cho LAN gateway:
uci set network.lan.ipaddr='192.168.1.1'
uci set network.lan.netmask='255.255.255.0'
uci commit network
/etc/init.d/network restart
Ngay khi interface WAN nhận được địa chỉ IP qua DHCP, tiến hành cài đặt gói SQM và module lập lịch hàng đợi CAKE:
opkg update
opkg install luci-app-sqm kmod-sched-cake
Bước 5: Cấu hình phân đoạn VLAN và các Firewall Zone
Tiếp theo, cô lập các thiết bị thông minh không tin cậy trên VLAN ID 20. Thay vì tạo thêm card mạng ảo trong Proxmox, hãy gắn một subinterface có tag (eth0.20) trực tiếp bên trong OpenWrt.
Định nghĩa interface mới và dải cấp phát DHCP trong /etc/config/network và /etc/config/dhcp:
# Thiết lập mạng IoT trên VLAN 20
uci set network.iot=interface
uci set network.iot.proto='static'
uci set network.iot.device='eth0.20'
uci set network.iot.ipaddr='192.168.20.1'
uci set network.iot.netmask='255.255.255.0'
# Cấu hình dải cấp phát DHCP (192.168.20.100 - 192.168.20.250)
uci set dhcp.iot=dhcp
uci set dhcp.iot.interface='iot'
uci set dhcp.iot.start='100'
uci set dhcp.iot.limit='150'
uci set dhcp.iot.leasetime='12h'
uci commit network
uci commit dhcp
Khóa chặt vùng mạng IoT trong /etc/config/firewall. Chính sách dưới đây cho phép thiết bị truy cập ra ngoài Internet nhưng chặn toàn bộ chiều kết nối vào mạng LAN riêng tư và subnet của hypervisor:
# Tạo firewall zone bị hạn chế cho IoT
uci add firewall zone
uci set firewall.@zone[-1].name='iot'
uci set firewall.@zone[-1].network='iot'
uci set firewall.@zone[-1].input='REJECT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='REJECT'
# Cho phép thiết bị IoT định tuyến ra ngoài WAN
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='iot'
uci set firewall.@forwarding[-1].dest='wan'
# Cho phép truy vấn DNS nội bộ (port 53)
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-IoT-DNS'
uci set firewall.@rule[-1].src='iot'
uci set firewall.@rule[-1].proto='tcpudp'
uci set firewall.@rule[-1].dest_port='53'
uci set firewall.@rule[-1].target='ACCEPT'
# Cho phép yêu cầu DHCP nội bộ (port 67-68)
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-IoT-DHCP'
uci set firewall.@rule[-1].src='iot'
uci set firewall.@rule[-1].proto='udp'
uci set firewall.@rule[-1].dest_port='67-68'
uci set firewall.@rule[-1].target='ACCEPT'
uci commit firewall
/etc/init.d/firewall restart
Bước 6: Triệt tiêu Bufferbloat với CAKE SQM
Việc làm nghẽn băng thông đường truyền uplink đối xứng hoặc bất đối xứng sẽ gây ra hiện tượng trễ tăng vọt nghiêm trọng khi truyền tải dữ liệu nặng. Trên một đường truyền cáp 1 Gbps / 50 Mbps thông thường, hàng đợi không được quản lý có thể đẩy độ trễ ping từ 15 ms lên hơn 350 ms khi chịu tải.
Để triệt tiêu hiện tượng bufferbloat này, hãy áp dụng thuật toán điều phối CAKE cho interface WAN (eth1). Đặt giới hạn băng thông vào khoảng 90–95% tốc độ thực tế đo được:
uci set sqm.eth1=queue
uci set sqm.eth1.interface='eth1'
uci set sqm.eth1.qdisc='cake'
uci set sqm.eth1.script='layer_cake.qos'
uci set sqm.eth1.enabled='1'
# Băng thông thiết lập theo kbit/s (ví dụ: 940 Mbps tải xuống, 48 Mbps tải lên)
uci set sqm.eth1.download='940000'
uci set sqm.eth1.upload='48000'
uci commit sqm
/etc/init.d/sqm restart
Sau khi áp dụng cấu hình này, hãy kiểm tra lại bằng công cụ Waveform Bufferbloat Test. Độ biến thiên ping (jitter) khi đầy tải 100% upload thường sẽ giảm từ hơn 200 ms xuống còn dưới 3 ms. Giờ đây bạn đã có một router được cô lập an toàn, hỗ trợ snapshot linh hoạt và chỉ tiêu tốn lượng điện năng CPU tương đương chưa đầy 2 watt trên máy chủ của mình.

