Hướng dẫn cài đặt và cấu hình nftables trên Linux: Thay thế iptables toàn diện

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Quick start: Dựng firewall cơ bản với nftables trong 5 phút

Quản lý firewall trên Linux từng là nỗi ám ảnh khi phải duy trì hai bộ rule tách biệt: iptables cho IPv4 và ip6tables cho IPv6. Với nftables, Linux gom toàn bộ về một framework duy nhất. Bạn có cú pháp trực quan hơn, cập nhật rule atomic không gián đoạn và hiệu năng xử lý gói tin cao hơn hẳn.

Bước 1: Cài đặt và tắt firewall cũ

Trước khi kích hoạt nftables, hãy tắt các dịch vụ firewall tầng cao để tránh xung đột hook trong nhân Linux:

# Trên Ubuntu / Debian
sudo apt update && sudo apt install -y nftables
sudo systemctl stop ufw && sudo systemctl disable ufw

# Trên RHEL / AlmaLinux / Rocky Linux
sudo dnf install -y nftables
sudo systemctl stop firewalld && sudo systemctl disable firewalld

Bước 2: Nạp bộ rule tối thiểu bảo vệ server

File cấu hình mặc định nằm tại /etc/nftables.conf. Mở file bằng trình soạn thảo:

sudo nano /etc/nftables.conf

Xóa nội dung cũ và dán bộ quy tắc tiêu chuẩn dưới đây. Cấu hình này giữ kết nối SSH hiện tại, mở port web và chặn toàn bộ lưu lượng trái phép còn lại:

#!/usr/sbin/nft -f

flush ruleset

table inet my_firewall {
    chain my_input {
        type filter hook input priority filter; policy drop;

        # Cho phép loopback nội bộ
        iif "lo" accept

        # Giữ các kết nối đang hoạt động (tránh rớt session SSH hiện tại)
        ct state established,related accept
        ct state invalid drop

        # Cho phép ICMP ping cho cả IPv4 lẫn IPv6
        ip protocol icmp accept
        ip6 nexthdr ipv6-icmp accept

        # Mở port dịch vụ: SSH (22), HTTP (80) và HTTPS (443)
        tcp dport 22 accept
        tcp dport { 80, 443 } accept
    }
}

Bước 3: Kiểm tra cú pháp và kích hoạt dịch vụ

Đừng vội khởi động dịch vụ ngay. Một lỗi chính tả nhỏ trong file cấu hình cũng có thể ngắt kết nối SSH của bạn vĩnh viễn.

# 1. Kiểm tra lỗi cú pháp mà không áp dụng rule (dry-run)
sudo nft -c -f /etc/nftables.conf

# 2. Khởi động và thiết lập tự chạy cùng hệ điều hành
sudo systemctl enable --now nftables

# 3. Xác minh ruleset đang hoạt động trong kernel
sudo nft list ruleset

Chỉ với một bảng inet, hệ thống đã bảo vệ trọn vẹn cả hai giao thức mạng mà không cần viết lại rule lần thứ hai.

Kiến trúc và cú pháp cốt lõi của nftables

Mô hình của nftables phân cấp rõ ràng theo cây thư mục: Table → Chain → Rule.

1. Table và Address Family

nftables không tạo sẵn bảng ngầm định như filter hay nat. Bạn chủ động tạo bảng và gán họ địa chỉ phù hợp:

  • inet: Hỗ trợ hỗn hợp IPv4 và IPv6 trong cùng một table. Đây là lựa chọn tối ưu cho phần lớn server Internet.
  • ip / ip6: Chỉ xử lý riêng lẻ gói tin IPv4 hoặc IPv6.
  • netdev: Hỗ trợ hook ingress, cho phép lọc hoặc drop gói tin rác ngay tại driver mạng trước khi vào stack TCP/IP, rất hiệu quả để cản DDoS.
  • bridge / arp: Phục vụ chuyển mạch L2 và xử lý bảng phân giải địa chỉ MAC.

2. Phân biệt Regular Chain và Base Chain

Chain là nơi nhóm các quy tắc xử lý gói tin. nftables phân tách rõ hai loại:

  • Base chain: Điểm móc trực tiếp vào network stack của Linux kernel thông qua từ khóa hook (như input, output, forward). Loại chain này bắt buộc định nghĩa priority (độ ưu tiên thực thi) và policy mặc định (accept hoặc drop).
  • Regular chain: Không gắn hook hệ thống. Nó đóng vai trò như một hàm con để các rule khác nhảy vào (jump) xử lý, giúp tách nhỏ cấu hình phức tạp.

3. Cú pháp Rule: Đọc thuận từ trái sang phải

Cú pháp nftables loại bỏ hoàn toàn các tham số viết tắt khó nhớ của iptables. Quy tắc được viết trực quan theo cấu trúc: [điều kiện khớp] [hành động].

# Khớp danh sách nhiều port trong một dòng duy nhất
tcp dport { 80, 443, 8080, 8443 } accept

# Giới hạn tần suất ping tránh ICMP flood
ip protocol icmp limit rate 5/second accept

Kỹ thuật nâng cao: NAT, Port Forwarding và Chống Brute-force

Bật IP Forwarding trên Kernel

Trước khi cấu hình NAT hoặc chuyển tiếp cổng, bạn cần kích hoạt tính năng định tuyến gói tin của Linux kernel:

sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.d/99-ipforward.conf

1. Cấu hình Source NAT (Masquerade)

Kịch bản này áp dụng khi biến Linux server thành gateway chia sẻ kết nối Internet cho mạng LAN hoặc container nội bộ:

table ip nat_gateway {
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        oifname "eth0" masquerade
    }
}

2. Port Forwarding (DNAT)

Chuyển tiếp traffic từ IP public vào máy chủ ứng dụng bên trong (ví dụ: chuyển cổng 8080 trên card eth0 sang port 80 của máy chủ 192.168.10.50):

table ip nat_gateway {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        iifname "eth0" tcp dport 8080 dnat to 192.168.10.50:80
    }
}

3. Chống brute-force SSH tự động bằng Dynamic Set

Thay vì cài các daemon tiêu tốn RAM như Fail2ban, bạn có thể dùng tính năng meter và set động của nftables để cô lập IP tấn công ngay tại tầng kernel:

table inet my_firewall {
    # Danh sách đen tự động lưu IP vi phạm, hết hạn sau 15 phút
    set ssh_blacklist {
        type ipv4_addr
        flags dynamic, timeout
        timeout 15m
    }

    chain my_input {
        type filter hook input priority filter; policy drop;

        iif "lo" accept
        ct state established,related accept

        # Chặn ngay lập tức nếu IP đang nằm trong danh sách đen
        ip saddr @ssh_blacklist drop

        # Ghi nhận IP mở quá 4 kết nối SSH mới trong 1 phút, tự động thêm vào blacklist
        tcp dport 22 ct state new meter ssh_meter { ip saddr limit rate over 4/minute } add @ssh_blacklist { ip saddr } drop
        
        # Chấp nhận kết nối SSH hợp lệ còn lại
        tcp dport 22 ct state new accept
    }
}

Kinh nghiệm vận hành thực chiến

Hiệu năng: O(1) so với O(n)

Trong một hệ sinh thái microservice xử lý khoảng 40.000 request/giây, danh sách chặn hơn 3.000 IP bằng iptables từng đẩy mức tải ksoftirqd lên 25% CPU trên mỗi core. Lý do là iptables phải quét tuần tự từng dòng từ trên xuống dưới (độ phức tạp O(n)).

Khi chuyển sang nftables và nhóm địa chỉ IP vào cấu trúc Set (bản chất là hash table hoặc rbtree trong kernel), thời gian tra cứu giảm về O(1). Mức chiếm dụng CPU cho softirq giảm từ 25% xuống dưới 2%, giúp độ trễ mạng ổn định hơn rõ rệt.

Chuyển đổi tự động từ iptables sang nftables

Nếu server đang chứa hàng trăm dòng rule iptables phức tạp, bạn không cần gõ lại thủ công:

# 1. Xuất bộ rule hiện tại ra file
sudo iptables-save > iptables_backup.rules

# 2. Dùng công cụ dịch tự động sang cú pháp nftables
sudo iptables-restore-translate -f iptables_backup.rules > rules_converted.nft

# 3. Kiểm tra lại nội dung đã chuyển đổi
cat rules_converted.nft

Biện pháp phòng ngừa mất quyền truy cập SSH từ xa

Mỗi khi chỉnh sửa firewall trên server remote, bạn nên chuẩn bị cơ chế an toàn để tự hồi phục nếu lỡ tay khóa nhầm chính mình:

# Lên lịch tự xóa sạch ruleset sau 5 phút ở chế độ chạy nền
sleep 300 && sudo nft flush ruleset &

Nếu sau khi reload rule mà kết nối SSH vẫn thông suốt, bạn chỉ cần gõ kill %1 để hủy tiến trình sleep. Trường hợp xấu nhất xảy ra, sau đúng 5 phút firewall sẽ tự mở để bạn truy cập lại bình thường.

Share: