Hướng dẫn cài đặt và cấu hình OPNsense trên Proxmox VE: Tường lửa ảo hóa thực chiến

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Rủi ro thực tế khi các máy ảo dùng chung một dải mạng

Cụm homelab Proxmox VE của mình chạy 12 máy ảo và LXC container. Ban đầu để tiện việc, mình cắm toàn bộ VM vào chung bridge vmbr0. Tất cả máy ảo, container và thiết bị gia đình đều nhận IP 192.168.1.x/24 trực tiếp từ modem nhà mạng.

Mạng phẳng chạy êm cho tới ngày mình public vài dịch vụ ra Internet: một web app staging, Nextcloud và Nginx Proxy Manager. Chỉ sau hai tuần, bot quét tự động dò ra cổng SSH của container staging và brute-force thành công 12.000 request/giờ.

Kẻ tấn công có ngay quyền root trên container đó. Tệ hơn, từ máy này chúng quét thông suốt sang NAS Synology, dàn camera RTSP lẫn máy cá nhân mà không gặp bất kỳ vật cản nào. Kỹ thuật xâm nhập ngang (lateral movement) này nguy hiểm gấp bội việc mất một container thử nghiệm.

Giới hạn của router gia đình và firewall tích hợp

Sau đợt dọn dẹp sự cố, mình rà soát lại hạ tầng và nhận ra ba điểm nghẽn lớn:

  • Router nhà mạng thiếu tính năng phân vùng: Bảng NAT session của router phổ thông rất nhỏ (thường dưới 8.000 session). Thiết bị không hỗ trợ cô lập VLAN 802.1Q đúng nghĩa và không có stateful inspection giữa các subnet.
  • PVE Firewall khó theo dõi tập trung: Proxmox hỗ trợ pve-firewall dựa trên nftables/iptables. Tuy nhiên, việc viết rule thủ công cho từng interface từng VM rất dễ nhầm lẫn. Bạn cũng thiếu dashboard trực quan để soi log traffic, chạy IDS/IPS hay quản lý DNS Unbound tập trung.
  • Nghẽn cổ chai băng thông khi dùng router ngoài: Cắm router rời (như MikroTik hEX) qua một dây mạng 1Gbps tạo ra thế Router-on-a-Stick. Khi hai VM ở hai VLAN khác nhau chép file cho nhau, luồng dữ liệu phải chạy ra dây mạng vật lý rồi vòng ngược lại host. Băng thông lập tức kịch trần ở mức ~940 Mbps.

Ba lựa chọn định tuyến cho Proxmox

Để chia tách DMZ (chứa dịch vụ public), LAN (máy làm việc) và Internal (chứa database, storage), chúng ta có ba hướng triển khai:

  1. Router vật lý chuyên dụng (Hardware Appliance): Mua mini PC chạy OPNsense độc lập. Ưu điểm là an toàn phần cứng, router chết thì Proxmox vẫn sống. Nhược điểm: tốn thêm điện (15–25W chạy 24/7), tốn cổng switch và bị khóa cứng ở tốc độ cổng vật lý.
  2. Cấu hình iptables/nftables trực tiếp trên Debian host: Tiết kiệm tối đa RAM. Ngược lại, phương án này cực kỳ rủi ro khi vận hành. Chỉ cần gõ sai một dòng cú pháp nftables, bạn sẽ tự khóa cổng 8006 ra khỏi server. Lúc đó, cách duy nhất là cắm màn hình rời và bàn phím để cứu hộ.
  3. Ảo hóa OPNsense trực tiếp trên Proxmox: Cấp cho OPNsense các Linux Bridge ảo. OPNsense đóng vai trò gateway và tường lửa trung tâm. Băng thông inter-VLAN chạy thẳng trên RAM của CPU với driver VirtIO, đạt tốc độ vượt xa cáp mạng vật lý thông thường.

Các bước cài đặt và cấu hình OPNsense trên Proxmox VE

Sau hơn 6 tháng vận hành thực tế, giải pháp ảo hóa OPNsense mang lại hiệu năng cao nhất trên cùng một phần cứng có sẵn. Lưu lượng giữa các VM có thể chạm mốc 12–15 Gbps mà không cần đầu tư card 10GbE đắt đỏ.

Bước 1: Thiết lập Linux Bridge trên Proxmox Host

Mô hình tối thiểu cần hai bridge riêng biệt:

  • vmbr0: Cổng WAN. Bridge này gán trực tiếp vào card mạng vật lý của host để ra Internet.
  • vmbr1: Cổng LAN nội bộ. Bridge này không gắn cổng vật lý (bridge-ports none), hoạt động như một switch ảo khép kín.

Mở file /etc/network/interfaces trên Proxmox host hoặc chỉnh qua GUI (Node -> System -> Network):

auto lo
iface lo inet loopback

iface eno1 inet manual
# Cổng mạng vật lý máy chủ

auto vmbr0
iface vmbr0 inet static
    address 192.168.1.10/24
    gateway 192.168.1.1
    bridge-ports eno1
    bridge-stp off
    bridge-fd 0
# WAN Bridge - nối ra modem/router ngoài

auto vmbr1
iface vmbr1 inet manual
    bridge-ports none
    bridge-stp off
    bridge-fd 0
# LAN Bridge ảo - chỉ giao tiếp nội bộ bên trong host

Áp dụng cấu hình ngay mà không cần khởi động lại máy chủ:

ifreload -a

Bước 2: Khởi tạo máy ảo OPNsense

Tải bản ISO OPNsense kiến trúc amd64 (chọn image dvd) từ trang chủ, upload vào Proxmox ISO storage. Sau đó, tạo VM với cấu hình chuẩn sau:

  • General: Đặt tên VM (ví dụ: OPNsense-Gateway), tích chọn Start at boot, Order: 1.
  • OS: Chọn file ISO OPNsense, Type: Other.
  • System: Qemu Agent: Enabled. SCSI Controller: VirtIO SCSI single.
  • Disks: Bus: SCSI, dung lượng 32 GB, bật Discard nếu chạy trên SSD/NVMe.
  • CPU: 2 vCPU. Đổi CPU Type thành host để OPNsense nhận diện tập lệnh mã hóa phần cứng AES-NI, giúp tăng tốc OpenVPN/WireGuard.
  • Memory: 4096 MiB. Bắt buộc bỏ chọn Ballooning Device. Việc cấp RAM động dễ làm FreeBSD kernel bị crash ngẫu nhiên.
  • Network:
    • Card 1 (WAN): Bridge vmbr0, Model VirtIO (paravirtualized).
    • Tạo xong VM, vào Hardware -> Add -> Network Device để thêm Card 2 (LAN): Bridge vmbr1, Model VirtIO.

Bước 3: Cài đặt hệ điều hành và gán Interface

Khởi động máy ảo và mở tab Console trên Proxmox:

  1. Khi hệ thống boot vào Live environment, đăng nhập bằng user installer, mật khẩu opnsense.
  2. Chọn bàn phím mặc định, tiếp tục chọn Install (ZFS) hoặc Install (UFS). Chạy máy ảo đơn ổ thì UFS chạy ổn định và nhẹ RAM nhất.
  3. Cài đặt hoàn tất, chọn Reboot. Nhớ tháo file ISO ra khỏi ổ CD/DVD ảo.
  4. Sau khi máy khởi động lại, màn hình console hiện menu 13 mục. Bấm phím 1 để gán cổng mạng:
    • Do you want to configure LAGGs now? Chọn N.
    • Do you want to configure VLANs now? Chọn N.
    • WAN interface: gán cho vtnet0 (nối vào vmbr0).
    • LAN interface: gán cho vtnet1 (nối vào vmbr1).
  5. Bấm phím 2 để gán IP cổng LAN:
    • Nhập IP gateway mới: 10.0.0.1, subnet mask bit: 24.
    • Bật DHCP Server: chọn Y, đặt dải cấp phát từ 10.0.0.100 đến 10.0.0.200.

Bước 4: Tắt tính năng VirtIO Offload (Bước sống còn)

FreeBSD trên nền KVM/QEMU thường xuyên xung đột với tính năng phần cứng offload của driver VirtIO. Hiện tượng phổ biến là ping vẫn thông nhưng web tải cực chậm, packet loss tới 40–60%. Bạn cần xử lý ngay:

  1. Tạo một máy ảo thử nghiệm (Ubuntu hoặc Windows) cắm mạng vào vmbr1. Máy này sẽ nhận IP tự động dạng 10.0.0.x.
  2. Mở trình duyệt trong máy ảo đó, truy cập https://10.0.0.1, đăng nhập user root.
  3. Điều hướng tới: Interfaces -> Settings.
  4. Tại mục Hardware Acceleration, tích chọn cả 3 ô để tắt offload phần cứng:
    • Disable Hardware Checksum Offload
    • Disable Hardware TCP Segmentation Offload
    • Disable Hardware Large Receive Offload
  5. Bấm Save và khởi động lại OPNsense để áp dụng.

Bước 5: Thiết lập DMZ và Port Forwarding an toàn

Cấu trúc mạng lúc này đã được chia ranh giới rõ ràng:

  • Máy ảo nội bộ (Database, Graylog, NAS) chỉ cắm vào vmbr1, hoàn toàn miễn nhiễm với botnet quét ngoài Internet.
  • Khi cần publish một web app ra ngoài, tạo rule tại Firewall -> NAT -> Port Forward: Forward cổng 443 từ WAN IP vào đúng IP nội bộ của Nginx Proxy Manager.
  • Nếu cần mở rộng thêm các nhóm dịch vụ khác, bạn chỉ việc gán VLAN tag trên OPNsense (ví dụ VLAN 20 DMZ, VLAN 30 IoT) trên cùng switch ảo vmbr1.

Dữ liệu vận hành thực tế sau 6 tháng

Hệ thống hoạt động liên tục nửa năm với các thông số đo đạc cụ thể như sau:

  • Độ tin cậy: Uptime 182 ngày liên tục, không xuất hiện kernel panic. Thời gian khởi động lại sau mỗi lần nâng cấp firmware mất 38–45 giây.
  • Mức tiêu thụ tài nguyên: OPNsense hoạt động rất nhẹ. Tải trung bình CPU dao động từ 0.8% đến 2.5%, dung lượng RAM chiếm ổn định khoảng 950MB (đã bật Unbound DNS và chặn quảng cáo qua blocklist 150.000 domain).
  • Throughput kiểm tra bằng iperf3: Băng thông đo giữa hai VM khác subnet qua OPNsense đạt 11.4 Gbps. Tốc độ này nhanh gấp 12 lần so với việc định tuyến qua router vật lý 1Gbps bên ngoài.

Kinh nghiệm thực tế rút ra: Luôn giữ Proxmox Web GUI (cổng 8006) lắng nghe trên một IP tĩnh thuộc card vật lý độc lập. Không bao giờ đặt việc truy cập Proxmox host phụ thuộc vào dịch vụ DHCP của máy ảo OPNsense. Nếu VM tường lửa gặp sự cố khởi động, bạn vẫn giữ toàn quyền truy cập để khắc phục.

Share: