nftables là gì? Tường lửa Linux thế hệ mới thay thế iptables

nftables là gì? Tường lửa Linux thế hệ mới thay thế iptables

nftables là hệ thống lọc và phân loại gói tin trong nhân Linux, có mặt từ nhân 3.13 phát hành ngày 19/01/2014. Công cụ này thay thế hoàn toàn thành phần iptables cũ trong bộ khung Netfilter, mang đến cú pháp hợp nhất, ít trùng lặp mã nguồn và dễ mở rộng cho giao thức mới.

Khác với iptables vốn phải có sẵn 4 bản riêng biệt cho IPv4, IPv6, ARP và Ethernet bridging, nftables đưa logic lọc vào một máy ảo (virtual machine) bytecode duy nhất ngay trong nhân. Nhờ vậy, cùng một bộ quy tắc chạy được cho mọi giao thức.

Sơ đồ các thành phần của Netfilter trong nhân Linux gồm ebtables, ip6tables, iptables với conntrack và broute ở tầng NAT và filter, cùng lớp nf_tables và các Xtables helper

Ba khái niệm cốt lõi: table, chain, rule

Toàn bộ cấu hình nftables dựa trên ba khái niệm:

  • Table (bảng): nhóm các chain cùng mục đích, ví dụ bảng ip xử lý IPv4, ip6 xử lý IPv6, inet xử lý chung cả hai.
  • Chain (chuỗi): danh sách các rule được gọi theo thứ tự từ một hook của nhân. Có hai loại: chain cơ sở (base chain) gắn với hook như input, output, forward; và chain thường (regular chain) do người dùng tự định nghĩa.
  • Rule (quy tắc): một phép so khớp gói tin kèm hành động accept, drop hoặc reject.

Cấu trúc mô hình được mô tả rõ trong tài liệu Wikipedia về nftables và trang dự án chính thức của Netfilter.

Sơ đồ đường đi của gói tin qua các hook Netfilter từ tầng ứng dụng xuống tầng mạng, thể hiện vị trí của bridge level và network level trong luồng xử lý gói tin

Ví dụ cú pháp nftables

Chặn mọi gói tin đi tới địa chỉ 1.2.3.4, bằng nftables:

nft add rule ip filter output ip daddr 1.2.3.4 drop

Cùng nhiệm vụ trong iptables phải viết dài hơn nhiều:

iptables -A OUTPUT -d 1.2.3.4 -j DROP

Cú pháp nftables thoạt nhìn dài dòng hơn nhưng linh hoạt hơn nhiều. Một ví dụ thực tế chặn SSH từ mọi nơi ngoài mạng nội bộ:

nft add rule inet filter input tcp dport 22 ip saddr != 192.168.1.0/24 drop

Tập dữ liệu và bảng tra cứu: điểm mạnh lớn nhất

iptables buộc phải viết một rule cho mỗi địa chỉ cần chặn. nftables bổ sung các cấu trúc dữ liệu như dictionary, map và concatenation, cho phép gom hàng trăm địa chỉ vào một tập rồi tra cứu bằng một phép so khớp duy nhất. Số chain và rule cần thiết để mô tả cùng một thiết kế giảm mạnh, đồng thời việc thêm hay sửa quy tắc diễn ra theo kiểu tăng dần (incremental) hiệu quả hơn.

Cập nhật luật nguyên tử qua Netlink

Một cải tiến quan trọng khác là API người dùng của nftables cho phép thay thế nguyên tử (atomic) một hoặc nhiều rule trong cùng một giao dịch Netlink. Điều này nhanh hơn hẳn khi bộ quy tắc lớn, đồng thời tránh được tình trạng tranh chấp trong lúc các luồng gói tin đang chạy.

Chuyển đổi từ iptables sang nftables

Không cần viết lại toàn bộ từ đầu. Công cụ iptables-translate dịch hầu hết quy tắc iptables cũ sang dạng tương đương của nft, và iptables-nft cung cấp lớp tương thích để các ứng dụng vẫn dùng giao diện cũ nhưng chạy trên nền nftables. Debian 10 (Buster) trở đi đã chuyển sang nftables làm backend lọc gói tin mặc định.

Sơ đồ bốn chuỗi cơ sở PREROUTING, INPUT, FORWARD và OUTPUT cùng bảng filter, minh họa mô hình bảng và chain mà nftables kế thừa từ iptables

Hạn chế cần biết

iptables từng cung cấp khả năng khớp theo chuỗi dùng cho DPI, chẳng hạn lọc theo tên miền qua trường SNI của TLS. nftables hiện chưa hỗ trợ tính năng này — đây là nhược điểm được ghi nhận rõ trong tài liệu. Với hệ thống cần lọc theo tên miền, vẫn phải bổ sung thêm lớp xử lý khác như proxy hoặc kết hợp nhiều công cụ.

Một điểm khác cần lưu ý là cách hai công cụ quản lý quy tắc. iptables lưu cấu hình dưới dạng văn bản phẳng trong tệp, nên nhiều công cụ như Ansible hay Puppet có thể chỉ việc ghi đè tệp rồi nạp lại. nftables dùng Netlink để giao tiếp với nhân, cấu hình nằm trong bộ nhớ kernel chứ không có tệp quy chuẩn. Vì vậy khi triển khai tự động, bạn phải dùng tập lệnh nft riêng chạy qua `nft -f`, hoặc dùng công cụ như `nftables-persistent` để lưu và khôi phục quy tắc sau mỗi lần khởi động. Nếu không, sau khi reboot máy chủ sẽ mất toàn bộ cấu hình tường lửa đang chạy.

Quy trình nâng cấp an toàn từ iptables

Trước khi chuyển đổi, hãy luôn giữ một phiên SSH mở sẵn, vì một cú pháp sai có thể khiến bạn tự khóa chính mình ra khỏi máy chủ. Trình tự an toàn gồm các bước:

  1. Chụp lại toàn bộ quy tắc hiện tại bằng `iptables-save` ra tệp, để có đường quay lui.
  2. Dịch sang dạng nft bằng `iptables-translate` rồi xem lại kết quả, vì công cụ không dịch được mọi trường hợp.
  3. Chạy thử bằng `nft -c -f tap_cau_hinh.nft` để kiểm tra cú pháp mà không áp dụng.
  4. Chuyển sang chạy song song thay vì xóa thẳng, giữ nguyên iptables làm lớp dự phòng trong giai đoạn thử nghiệm.
  5. Sau khi ổn định, mới chuyển toàn bộ dịch vụ sang lớp tương thích `iptables-nft` hoặc viết cấu hình nft thuần.

Lệnh `nft list ruleset` cho phép xem toàn bộ cấu hình đang chạy dưới dạng cú pháp nft, ngay cả khi những quy tắc đó được tạo ra bởi lớp tương thích iptables. Đây là cách nhanh nhất để kiểm tra trạng thái thực tế của tường lửa trên một máy chủ đang chạy.

Khi nào vẫn nên giữ iptables

Dù nftables đã ổn định, hệ sinh thái quản trị cấu hình vẫn chưa hoàn toàn chuyển sang. Nhiều vai trò trong Ansible, một số tường lửa ảo hóa và công cụ giám sát cũ vẫn sinh lệnh dạng iptables. Với những môi trường như vậy, chạy lớp tương thích `iptables-nft` là lựa chọn ít rủi ro nhất, vì bạn vẫn dùng cú pháp cũ mà nhân xử lý bằng máy ảo nftables bên dưới. Ngược lại, với hệ thống mới hoặc khi bạn muốn kiểm soát chính xác tập dữ liệu, sets và maps, hãy viết cấu hình nft thuần.

Tóm tắt

nftables là tường lửa thế hệ mới của Linux, thay thế iptables từ năm 2014. Những lợi thế chính gồm một máy ảo bytecode duy nhất cho mọi giao thức, tập dữ liệu giảm số lượng rule, cập nhật nguyên tử qua Netlink và lớp tương thích giúp chuyển đổi dễ dàng. Với dự án mới, nên viết cấu hình bằng nft ngay từ đầu thay vì tiếp tục phụ thuộc iptables cũ.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

SSH key là gì? Cách đăng nhập máy chủ không cần mật khẩu

SSH key là gì? Đó là một cặp khoá mật mã gồm public key (khoá công khai) và private key (khoá riêng tư), dùng để xác thực bạn là ai…

Xem thêm

systemd là gì? Quản lý dịch vụ và tiến trình khởi động trên Linux

systemd là gì? Trình quản lý dịch vụ và tiến trình khởi động trên Linux systemd là gì? systemd là trình quản lý tiến trình và dịch vụ tiêu chuẩn…

Xem thêm

Mã tận là gì? Kỹ thuật sửa lỗi truyền thông số hiệu quả

Mã tận (Convolutional code) là một lớp mã sửa lỗi tạo ra các ký hiệu kiểm tra bằng cách trượt một hàm đa thức Boolean trên dòng dữ liệu. Nhờ…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất