Làm chủ nftables trên CentOS Stream 9: Thay thế iptables để tối ưu hiệu suất tường lửa

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Nếu lệnh iptables -L -n đã trở thành phản xạ tự nhiên của bạn suốt thập kỷ qua, việc nâng cấp lên CentOS Stream 9 sẽ mang đến một thay đổi lớn. Kể từ phiên bản này, nftables chính thức thay thế hoàn toàn người tiền nhiệm iptables đã già nua để trở thành công cụ quản lý tường lửa mặc định.

Bài viết này đúc kết từ trải nghiệm thực tế của mình khi migrate hệ thống từ CentOS 7 lên các dòng RHEL 9. Bạn sẽ thấy nftables không hề đáng sợ. Thậm chí, nó còn logic và gọn gàng hơn cách cũ rất nhiều.

Tại sao bạn nên chia tay iptables ngay bây giờ?

Nỗi ám ảnh lớn nhất khi quản trị các cụm server cũ là phải duy trì cùng lúc iptables (IPv4), ip6tables (IPv6), cùng arptablesebtables. Mỗi công cụ có một cú pháp riêng dù mục đích sử dụng tương tự nhau.

nftables giải quyết triệt để sự phân mảnh này bằng một framework thống nhất. Những cải tiến đáng giá bao gồm:

  • Hỗ trợ Dual-stack: Một lệnh duy nhất xử lý cả IPv4 và IPv6 thông qua family inet.
  • Tốc độ vượt trội: Thay vì quét tuần tự từng dòng (O(n)), nftables sử dụng cấu trúc dữ liệu Sets để tìm kiếm trong thời gian không đổi (O(1)). Với danh sách 10.000 IP bị chặn, CPU của bạn sẽ gần như không cảm thấy khác biệt.
  • Cấu trúc linh hoạt: Bạn tự định nghĩa Table và Chain theo nhu cầu, không còn bị bó hẹp trong các bảng mặc định cứng nhắc.

Kiến trúc cốt lõi: Table, Chain và Rule

Trước khi bắt tay vào gõ lệnh, hãy hình dung sơ đồ phân cấp của nftables. Khác với iptables, nftables bắt đầu bằng một “tờ giấy trắng”:

  1. Tables (Bảng): Container cao nhất chứa các Chain. Bạn cần chọn “family” (như ip, ip6, inet) ngay khi tạo.
  2. Chains (Chuỗi): Nơi chứa các Rule. Chain được gắn vào các “hook” của kernel như input, output hoặc forward.
  3. Rules (Quy tắc): Các dòng lệnh quyết định số phận gói tin (accept, drop, reject).

Triển khai thực tế trên CentOS Stream 9

Thông thường nftables đã có sẵn trên CentOS Stream 9. Nếu bạn dùng bản Minimal, hãy cài đặt qua dnf.

# Cài đặt và kích hoạt dịch vụ
sudo dnf install nftables -y
sudo systemctl enable --now nftables

Lưu ý: Hãy tắt firewalld để tránh xung đột cấu hình. Việc chạy hai dịch vụ tường lửa cùng lúc thường dẫn đến những lỗi mạng rất khó debug.

sudo systemctl stop firewalld
sudo systemctl disable firewalld

1. Làm sạch cấu hình

Để đảm bảo không có quy tắc thừa, hãy xóa sạch các thiết lập hiện có:

sudo nft flush ruleset

2. Khởi tạo Table và Base Chains

Chúng ta sẽ tạo bảng my_filter dùng family inet. Sau đó, thiết lập các chain cơ bản cho lưu lượng đi vào, đi ra và chuyển tiếp.

# Tạo table
sudo nft add table inet my_filter

# Tạo chain INPUT (mặc định chặn tất cả để bảo mật)
sudo nft add chain inet my_filter input { type filter hook input priority 0 \; policy drop \; }

# Tạo chain FORWARD và OUTPUT
sudo nft add chain inet my_filter forward { type filter hook forward priority 0 \; policy drop \; }
sudo nft add chain inet my_filter output { type filter hook output priority 0 \; policy accept \; }

3. Thiết lập quy tắc thiết yếu (SSH, Loopback)

Đừng quên bước này, nếu không bạn sẽ bị khóa khỏi server ngay lập tức do chính sách policy drop ở trên.

# Cho phép nội bộ máy (loopback)
sudo nft add rule inet my_filter input iif lo accept

# Duy trì các kết nối đang hoạt động (established/related)
sudo nft add rule inet my_filter input ct state established,related accept

# Mở port SSH (22)
sudo nft add rule inet my_filter input tcp dport 22 accept

Tính năng nâng cao: Sets và Verdict Maps

Đây là vũ khí bí mật giúp nftables vượt xa iptables về cả hiệu năng lẫn độ thẩm mỹ của mã nguồn.

Chặn hàng loạt IP bằng Sets

Thay vì tạo 100 rules để chặn 100 IP, bạn chỉ cần gom chúng vào một Set duy nhất.

# Tạo danh sách đen
sudo nft add set inet my_filter blackhole { type ipv4_addr \; }

# Thêm các IP vi phạm
sudo nft add element inet my_filter blackhole { 192.168.1.100, 10.0.0.5, 172.16.0.10 }

# Một rule duy nhất để chặn cả danh sách
sudo nft insert rule inet my_filter input ip saddr @blackhole drop

Phân luồng traffic bằng Verdict Maps

Verdict Maps cho phép xử lý nhiều điều kiện trên một dòng lệnh. Ví dụ: Port 80 và 443 cho qua, nhưng port 23 (Telnet) phải bị loại bỏ ngay.

sudo nft add rule inet my_filter input tcp dport vmap { 80 : accept, 443 : accept, 23 : drop }

Cú pháp này giúp file cấu hình của bạn ngắn gọn và dễ đọc hơn đáng kể.

Lưu cấu hình bền vững

Mọi lệnh nft bạn vừa nhập chỉ nằm trên RAM. Nếu server reboot, cấu hình sẽ mất sạch. Hãy lưu chúng vào file hệ thống để tự động nạp khi khởi động.

# Xuất cấu hình ra file định nghĩa của hệ thống
sudo nft list ruleset | sudo tee /etc/sysconfig/nftables.conf

# Khởi động lại để kiểm chứng
sudo systemctl restart nftables

Lời khuyên từ mình: Luôn backup file nftables.conf trước khi thay đổi lớn. Nếu chẳng may cấu hình sai gây mất mạng, bạn có thể nhờ kỹ thuật viên tại datacenter khôi phục lại bản cũ chỉ trong vài giây.

Giám sát và gỡ lỗi

Để kiểm tra các quy tắc đang thực thi kèm theo định danh (handle), hãy sử dụng:

sudo nft list ruleset -a

Handle cực kỳ hữu ích khi bạn muốn xóa một quy tắc cụ thể mà không cần gõ lại toàn bộ nội dung dài dòng:

# Xóa quy tắc có handle số 5 trong chain input
sudo nft delete rule inet my_filter input handle 5

Tổng kết

Chuyển sang nftables trên CentOS Stream 9 có thể gây chút bỡ ngỡ ban đầu về cú pháp. Tuy nhiên, khi đã làm chủ được tư duy theo Table và Set, bạn sẽ sở hữu một hệ thống tường lửa mạnh mẽ, tinh gọn và hiệu suất cao.

Nếu đơn vị của bạn đang có lộ trình nâng cấp lên RHEL 9 hoặc các bản phân phối tương đương, hãy mạnh dạn áp dụng nftables. Đây không chỉ là thay đổi công nghệ, mà là tiêu chuẩn mới để tối ưu hóa công việc quản trị hệ thống Linux hiện đại.

Share: