So sánh kiến trúc: iptables vs. nftables
Sáu tháng trước, đội ngũ chúng tôi đã loại bỏ hoàn toàn iptables cũ trên toàn bộ hệ thống gồm hơn 450 node Linux. Việc vận hành các API gateway thông lượng cao xử lý hơn 80.000 request mỗi giây đã bộc lộ những giới hạn tột cùng của bộ công cụ Netfilter thế hệ trước.
Với iptables truyền thống, mỗi gói tin phải đi qua một pipeline cứng nhắc gồm các table được định nghĩa sẵn: filter, nat, mangle và raw. Tệ hơn nữa, IPv4 (iptables), IPv6 (ip6tables), ARP (arptables) và bridging (ebtables) hoạt động dưới dạng các công cụ CLI riêng biệt với các cây quy tắc (rule tree) tách biệt hoàn toàn. Khi bạn phải kiểm tra tuần tự hàng trăm quy tắc qua các tầng độc lập này, mức tiêu thụ CPU sẽ tăng vọt rất nhanh khi lưu lượng truy cập lớn.
Framework nftables giải quyết triệt để lỗi thiết kế này. Được xây dựng dựa trên một máy ảo bytecode tinh gọn nằm ngay trong kernel, nó thay đổi hoàn toàn cách thức lọc gói tin:
- Họ địa chỉ hợp nhất (Unified Address Families): Họ
inetxử lý cả lưu lượng IPv4 và IPv6 trong một bộ quy tắc chung duy nhất. Bạn không còn phải duy trì hai file cấu hình tường lửa riêng biệt cho từng phiên bản IP nữa. - Custom Chain & Table: Các table trong kernel không còn bị gán cứng theo mặc định. Tường lửa của bạn sẽ chỉ tạo và thực thi đúng các hook mà ứng dụng thực sự cần dùng.
- Tải bộ quy tắc nguyên tử (Atomic Ruleset Loading): Các công cụ cũ xóa và thêm từng dòng quy tắc một, tạo ra những khoảng hở thời gian ngắn khiến lưu lượng truy cập có thể lọt qua hoặc bị gián đoạn. Ngược lại,
nftablesáp dụng toàn bộ file cấu hình trong một giao dịch nguyên tử (atomic transaction) duy nhất trong kernel. - Tra cứu dựa trên Set (Set-Based Lookups): Thay vì phải duyệt tuần tự qua 50 quy tắc cổng mạng riêng lẻ,
nftablessử dụng các bảng băm nội bộ (hash table). Quá trình tra cứu được thực thi với độ phức tạp không đổi O(1) hoặc O(log n) bất kể kích thước của tập hợp (set).
Ưu & nhược điểm sau 6 tháng chạy thực tế trên production
Việc vận hành nftables ở quy mô lớn đã mang lại cho chúng tôi những số liệu cụ thể về mức tăng hiệu năng cũng như các thách thức trong vận hành.
Ưu điểm
- Cú pháp dễ đọc: Các quy tắc trông như những khối lệnh lập trình rõ ràng thay vì các chuỗi cờ lệnh shell dài dòng, khó hiểu như
-A INPUT -p tcp -m multiport --dports. - Hiệu năng cải thiện rõ rệt: Trên cụm gateway của chúng tôi, việc chuyển sang tra cứu bằng set đã giảm mức sử dụng CPU cho softirq khoảng 18% trong các đợt lưu lượng kết nối tăng đột biến.
- Reload tức thì và an toàn: Lệnh
nft -f /etc/nftables.confreload toàn bộ quy tắc chỉ trong chưa đầy 40 mili-giây trên các node bận rộn nhất. Nếu bạn vô tình gõ sai cú pháp, parser sẽ hủy bỏ ngay trước khi tác động đến trạng thái kernel đang chạy. Tường lửa đang hoạt động của bạn sẽ không bao giờ bị lỗi giữa chừng khi cập nhật.
Nhược điểm
- Khoảng trống về mặt công cụ: Một số script triển khai cũ và container runtime vẫn chèn trực tiếp các quy tắc legacy. Để tránh xung đột, bạn thường phải duy trì lớp chuyển đổi
iptables-nfttrong quá trình migration. - Đòi hỏi tìm hiểu sâu hơn (Learning Curve cao hơn): Vì các table không được tạo sẵn mặc định, các kỹ sư cần hiểu rõ các hook chính xác của Netfilter—chẳng hạn như
prerouting,input,forward,outputvàpostrouting—cùng với thứ tự ưu tiên thực thi của chúng.
Cấu hình khuyến nghị để bảo vệ server hiện đại
Đối với các server ứng dụng độc lập và cloud instance, một bộ quy tắc stateful nghiêm ngặt làm nền tảng sẽ mang lại khả năng phòng thủ tốt nhất. Nó tự động theo dõi các session TCP và UDP đã được thiết lập. Các gói tin bị lỗi cấu trúc hoặc sai thứ tự sẽ bị loại bỏ trước khi kịp tiếp cận dịch vụ web của bạn.
Trước khi khóa chặt ranh giới mạng, hãy bảo vệ quyền truy cập hệ thống của bạn trước. Khi khởi tạo các instance Ubuntu hoặc AlmaLinux mới, trước hết hãy tạo thông tin đăng nhập mạnh và duy nhất, đồng thời kiểm thử chính sách mật khẩu để phòng ngừa rủi ro. Tôi thường sử dụng trình tạo mật khẩu phía client tại toolcraft.app/vi/tools/security/password-generator—công cụ này tạo mật khẩu có độ hỗn loạn (entropy) cao trực tiếp trên trình duyệt mà không gửi khóa qua mạng. Sau khi khóa SSH và mật khẩu đã sẵn sàng, hãy triển khai bộ quy tắc tường lửa bên dưới.
Mô hình chính (Baseline Blueprint)
Cấu hình chuẩn cho production của chúng tôi dựa trên năm chính sách cốt lõi:
- Cho phép toàn bộ lưu lượng hai chiều trên loopback interface (
lo). - Chấp nhận tất cả các gói tin
establishedvàrelatedđể duy trì các kết nối đang hoạt động. - Loại bỏ (drop) ngay lập tức các gói tin bị bảng conntrack của kernel đánh dấu là
invalid. - Cho phép các cổng ingress cụ thể (SSH, HTTP, HTTPS) kết hợp giới hạn tốc độ (rate-limiting) kết nối mới nhằm ngăn chặn các đợt tấn công brute-force.
- Đặt policy mặc định trên các chain
inputvàforwardlà drop toàn bộ lưu lượng còn lại.
Hướng dẫn triển khai: Từng bước cài đặt nftables
1. Cài đặt nftables và dọn dẹp các quy tắc cũ
Cài đặt các tiện ích userspace native trên các hệ thống Debian, Ubuntu, AlmaLinux hoặc Rocky Linux hiện đại. Tắt các công cụ bọc tường lửa có thể gây xung đột như UFW hoặc Firewalld:
# Trên Ubuntu/Debian
sudo apt update && sudo apt install -y nftables
sudo systemctl stop ufw 2>/dev/null || true
sudo systemctl disable ufw 2>/dev/null || true
# Trên RHEL/AlmaLinux/Rocky Linux
sudo dnf install -y nftables
sudo systemctl stop firewalld 2>/dev/null || true
sudo systemctl disable firewalld 2>/dev/null || true
2. Xây dựng file cấu hình nguyên tử (Atomic Configuration File)
Ghi các quy tắc của bạn trực tiếp vào /etc/nftables.conf. Cấu hình bên dưới cung cấp khả năng bảo vệ dual-stack IPv4/IPv6, thiết lập giới hạn tốc độ cho SSH, cho phép lưu lượng web và xử lý chính xác các loại gói tin ICMP thiết yếu:
#!/usr/sbin/nft -f
# Xóa toàn bộ các quy tắc hiện có
flush ruleset
# Định nghĩa table inet dual-stack
table inet server_firewall {
# Named set để quản lý port động
set allowed_tcp_ports {
type inet_service
flags interval
elements = { 22, 80, 443 }
}
chain input {
# Hook vào pipeline input của Netfilter với độ ưu tiên filter chuẩn
type filter hook input priority filter; policy drop;
# 1. Chấp nhận lưu lượng loopback cục bộ
iifname "lo" accept
# 2. Stateful inspection: Cho phép established/related, drop gói tin invalid
ct state established,related accept
ct state invalid drop
# 3. Cho phép ICMP / ICMPv6 (cần thiết cho Path MTU Discovery và chẩn đoán mạng)
ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } accept
ip6 nexthdr icmpv6 icmpv6 type { echo-request, destination-unreachable, packet-too-big, time-exceeded, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept
# 4. Chống brute-force SSH (giới hạn kết nối mới tối đa 10 kết nối/phút mỗi IP)
tcp dport 22 ct state new meter ssh-meter { ip saddr limit rate over 10/minute burst 5 packets } drop
# 5. Chấp nhận các cổng ingress hợp lệ đã khai báo trong set
tcp dport @allowed_tcp_ports accept
# 6. Từ chối (reject) sạch sẽ tất cả các lưu lượng còn lại
meta l4proto tcp reject with tcp reset
reject with icmpx type port-unreachable
}
chain forward {
# Drop toàn bộ gói tin transit được định tuyến trên host không phải router
type filter hook forward priority filter; policy drop;
}
chain output {
# Cho phép toàn bộ kết nối gửi đi từ host
type filter hook output priority filter; policy accept;
}
}
3. Kiểm tra cú pháp và áp dụng quy tắc nguyên tử
Luôn kiểm tra cú pháp trước khi đẩy các cập nhật tường lửa vào kernel. Cờ kiểm tra -c sẽ phân tích cú pháp cấu hình mà không thực thi áp dụng:
# Kiểm tra cú pháp
sudo nft -c -f /etc/nftables.conf
# Áp dụng quy tắc theo cơ chế nguyên tử
sudo nft -f /etc/nftables.conf
4. Kiểm tra và giám sát lưu lượng trực tiếp
Kiểm tra định nghĩa các table đang chạy, bộ đếm set, hoặc theo dõi luồng gói tin bị drop theo thời gian thực với hai lệnh sau (bên cạnh việc kết hợp với các công cụ phân tích lưu lượng mạng NIDS chuyên sâu):
# Liệt kê toàn bộ cấu hình đang chạy
sudo nft list ruleset
# Giám sát trực tiếp các sự kiện tường lửa khi gói tin chạm hook drop/reject
sudo nft monitor
5. Kích hoạt tính năng khởi động cùng hệ thống qua Systemd
Cấu hình daemon nftables tự động tải bộ quy tắc của bạn sau mỗi lần khởi động máy thông qua dịch vụ Systemd:
sudo systemctl enable nftables
sudo systemctl restart nftables
sudo systemctl status nftables
Việc chuyển sang nftables giúp đơn giản hóa bảo mật máy chủ thành một framework duy nhất và nhất quán. Với khả năng xử lý dual-stack đồng nhất, cơ chế reload nguyên tử và hiệu năng tra cứu set O(1), nó mang lại cho hệ thống Linux một nền tảng phòng thủ nhanh hơn và đáng tin cậy hơn rất nhiều. Ngoài tường lửa mạng, bạn có thể kết hợp thêm giải pháp bảo mật Linux thời gian thực với eBPF để ngăn chặn các mối đe dọa ở cấp độ Kernel.

