1. Fail2Ban: Giải Phẫu Cơ Chế Hoạt Động Bên Trong
Fail2Ban là công cụ mà rất nhiều người dùng hàng ngày — cài, viết vài dòng jail.conf, thấy log báo "Ban 1.2.3.4" là yên tâm. Nhưng ít ai mở source code ra xem thật sự bên trong nó chạy như thế nào: vì sao có 2 lệnh fail2ban-client và fail2ban-server riêng biệt? Vì sao log bị xoay vòng (logrotate) mà fail2ban không đọc nhầm hay đọc sót? Cái gọi là "ticket" thực chất là gì? Và vì sao thiết kế cũ kỹ từ 2004 vẫn còn sống tốt đến tận 2026?
2.1 nftables: Kiến Trúc Bên Dưới Lớp Cú Pháp
Hầu hết tài liệu về nftables, kể cả trang chính thức của Ubuntu, dừng lại ở mức "đây là cú pháp, đây là ví dụ nft add rule". Rất ít tài liệu trả lời những câu hỏi nằm ngay bên dưới: nft list ruleset thật ra đang hỏi ai? Vì sao nft có thể gộp nhiều lệnh add table lại thành 1 giao dịch atomic mà không cần khóa toàn bộ ruleset? "Bytecode" mà tài liệu Ubuntu nhắc tới thực chất là gì, có phải mã máy biên dịch sẵn không? Và vì sao iptables sau Ubuntu 20.10 vẫn chạy được, nhưng ufw lại không đụng được vào rule nftables thuần?
2.2 nftables: Vận Hành Thực Tế Và Các Use Case Phổ Biến
Bài nftables máy ảo thanh ghi, giao dịch atomic, set/map, flowtable. Bài này đi theo hướng ngược lại: cầm 1 server Linux thật, viết 1 ruleset thật, và đi qua những use case gặp nhiều nhất trong vận hành, từ chặn SSH brute-force mà không cần fail2ban, NAT cho router, rate-limit chống flood, quản lý allowlist/denylist lớn, và cách reload ruleset mà không tự cắt mất session SSH đang dùng.
3.1 iptables: Kiến Trúc xtables Bên Dưới Lớp Cú Pháp
Trên một server Ubuntu dựng năm 2026, lệnh iptables -V in ra iptables v1.8.10 (nf_tables). Cái tên vẫn là iptables, nhưng chữ trong ngoặc nói rằng thứ đang thực thi bên dưới không còn là iptables nữa. Gõ tiếp một lệnh đọc ruleset mà không có quyền root, thông báo lỗi trả về là Could not fetch rule set generation id, và "generation id" vốn là khái niệm của nftables chứ không phải của iptables.
3.2 iptables: Vận Hành Thực Tế Và Đọc Ruleset Thừa Hưởng
Tình huống hay gặp nhất với iptables không phải viết một ruleset mới. Nó là tiếp quản một server đang chạy, gõ iptables -nvL, và nhận lại một danh sách rule không có tài liệu kèm theo, không rõ ai thêm, không rõ dòng nào còn tác dụng. Rồi thêm một rule để mở cổng, khởi động lại máy, và rule đó biến mất.