Vì sao mình quyết định khai tử iptables sau nhiều năm gắn bó?
Mình từng quản lý một cụm server với hơn 2.000 rule iptables. Mỗi lần cập nhật cấu hình, hệ thống phải nạp lại toàn bộ danh sách, gây hiện tượng nghẽn cổ chai và tiêu tốn đáng kể tài nguyên CPU. Tình trạng “râu ông nọ chắp cằm bà kia” giữa iptables (IPv4) và ip6tables (IPv6) cũng khiến việc quản lý trở thành một cơn ác mộng thực sự.
Kể từ bản Debian 11 và Ubuntu 22.04, mình đã chuyển hẳn sang nftables. Đây không đơn thuần là chạy theo công nghệ mới. Nftables giải quyết triệt để sự phân mảnh bằng cách gom mọi giao thức vào một khung quản lý duy nhất. Nhờ cơ chế máy ảo (VM) chạy ngay trong kernel, tốc độ xử lý gói tin của nó nhanh hơn đáng kể so với người tiền nhiệm.
Sự khác biệt thực tế: Iptables vs Nftables
Nếu anh em vẫn băn khoăn liệu có đáng để thay đổi, hãy nhìn vào những con số và cấu trúc dưới đây:
- Hiệu suất tìm kiếm: Iptables duyệt rule theo kiểu tuần tự (O(n)). Nếu rule khớp nằm ở cuối danh sách 1000 dòng, gói tin sẽ phải chờ lâu. Nftables sử dụng bộ từ điển (dictionaries) và tập hợp (sets), cho phép tra cứu với độ phức tạp O(1) hoặc O(log n) cực nhanh.
- Cú pháp: Thay vì mớ hỗn độn
-A INPUT -p tcp --dport 22 -j ACCEPT, nftables dùng cấu trúc phân cấp rõ ràng. Nó trông giống hệt cách anh em viết config Nginx hay Juniper. - Quản lý tập trung: Anh em không cần chạy 2-3 công cụ khác nhau cho IPv4 và IPv6 nữa. Một bảng
inetduy nhất sẽ xử lý tất cả. - Tính nguyên tử (Atomicity): Bạn có thể áp dụng hàng trăm thay đổi cùng một lúc. Hệ thống sẽ đảm bảo hoặc là tất cả đều lên, hoặc là không có gì thay đổi, loại bỏ hoàn toàn rủi ro “hở sườn” khi đang update.
Lộ trình chuyển đổi an toàn
Đừng vội vã đập đi xây lại trên server đang chạy production. Quy trình của mình thường gói gọn trong 4 bước:
- Dùng công cụ tự động để dịch logic từ iptables sang nftables.
- Tối ưu lại file cấu hình (gộp các port, dùng set).
- Kiểm tra kỹ trên môi trường Lab hoặc Staging.
- Thay thế dịch vụ và theo dõi log.
Hướng dẫn triển khai nftables thực chiến
1. Cài đặt đơn giản
Hầu hết các distro hiện đại đều tích hợp sẵn nftables. Nếu server của anh em chưa có, hãy cài đặt bằng lệnh:
# Debian/Ubuntu
sudo apt update && sudo apt install nftables -y
# RHEL/CentOS/AlmaLinux
sudo dnf install nftables -y
Gõ sudo nft list ruleset để kiểm tra. Nếu không thấy gì hiện ra, server của bạn đang hoàn toàn “mở cửa” hoặc vẫn đang dùng firewall cũ.
2. Mẹo dịch rule nhanh
Công cụ iptables-translate là cứu cánh cho những ai đã quen tay với iptables. Ví dụ, để dịch một rule mở port 80:
iptables-translate -A INPUT -p tcp --dport 80 -j ACCEPT
# Kết quả: nft add rule ip filter INPUT tcp dport 80 counter accept
3. Xây dựng bộ quy tắc chuẩn (Template)
Mình khuyên anh em nên viết trực tiếp vào file /etc/nftables.conf thay vì gõ lệnh lẻ. Dưới đây là cấu hình mình thường dùng cho các Web Server hiện đại:
#!/usr/sbin/nft -f
flush ruleset
table inet server_firewall {
chain inbound {
type filter hook input priority 0; policy drop;
# Giữ kết nối hiện tại (Rất quan trọng để không bị văng SSH)
ct state established,related accept
# Chấp nhận loopback
iif "lo" accept
# Cho phép Ping (Giới hạn 10 gói/giây để tránh flood)
ip protocol icmp limit rate 10/second accept
ip6 nexthdr icmpv6 accept
# Quản lý Port tập trung
tcp dport 22 accept
tcp dport { 80, 443, 8080 } accept
# Log và Drop các truy cập lạ
limit rate 5/minute log prefix "FIREWALL_DROP: "
}
}
Điểm hay của cấu hình này:
flush ruleset: Đảm bảo mỗi lần nạp là một bảng sạch, không bị chồng chéo rule cũ.tcp dport { 80, 443 }: Đây là sức mạnh của nftables. Bạn gom nhiều port vào một rule duy nhất, giúp kernel xử lý nhanh hơn gấp nhiều lần so với việc tách riêng từng dòng.ct state established,related: Rule này giúp các kết nối đang chạy không bị ngắt quãng khi bạn reload firewall.
4. Kích hoạt và kiểm tra
Để áp dụng cấu hình mới, hãy chạy:
sudo nft -f /etc/nftables.conf
Nếu không có lỗi cú pháp, hãy kích hoạt để firewall tự chạy mỗi khi khởi động máy:
sudo systemctl enable --now nftables
Kinh nghiệm xương máu: Đừng tự khóa mình bên ngoài
Sai lầm phổ biến nhất là apply rule drop khi chưa cho phép port SSH (22). Mình từng phải lặn lội vào KVM Console của nhà cung cấp chỉ vì một phút lơ đãng.
Mẹo nhỏ: Trước khi thử cấu hình mới, hãy đặt một lệnh tự hủy firewall sau 5 phút:
echo "systemctl stop nftables" | at now + 5 minutes
Nếu bạn lỡ tay khóa SSH, chỉ cần đợi 5 phút hệ thống sẽ tự mở lại. Nếu mọi thứ ổn, hãy dùng atrm để xóa lệnh đó đi.
Lời kết
Chuyển sang nftables có thể khiến bạn mất một buổi chiều để làm quen cú pháp. Tuy nhiên, hiệu quả về lâu dài là rất lớn: server chạy mượt hơn, file cấu hình sạch sẽ và bảo mật hơn. Nếu bạn đang triển khai server mới, đừng ngần ngại chọn nftables làm tiêu chuẩn ngay từ đầu.

