iptables là command line tool để cấu hình packet filtering và NAT trên Linux thông qua netfilter, nơi kernel quyết định packet nào được allow, drop, reject, hoặc rewrite địa chỉ IP và port.
Trong DevOps và SRE, iptables là thứ bạn gặp khi harden host, debug inbound connectivity, xử lý port forwarding, hoặc lần theo vì sao traffic đi được trên node này nhưng fail trên node khác. Nhiều hệ thống như Docker và Kubernetes cũng tự thêm rule, nên hiểu iptables giúp bạn tránh debug mù trong lúc on call.
Ví dụ: Traffic từ 203.0.113.5 tới server port 22 được allow, các source khác bị drop.
Sau ví dụ, điều bạn cần làm là kiểm tra rule order trong INPUT chain và xác định default policy đang là ACCEPT hay DROP.
iptables cho biết điều gì
iptables cho bạn câu trả lời rất operational:
- Host đang mở những port nào ở L3 L4
- Traffic đi theo path nào giữa INPUT, OUTPUT, FORWARD
- Có NAT không, DNAT đang đưa traffic tới backend nào, SNAT đang đổi source ra sao
- Rule nào đang match thật bằng cách nhìn counters
Khi incident xảy ra, iptables là chỗ giúp bạn tách bạch lỗi do application, lỗi do routing, hay lỗi do firewall.
Table và chain bạn phải nắm
iptables được tổ chức theo table, mỗi table có chain.
Những table hay gặp nhất:
- filter table Dùng để allow hoặc drop
- nat table Dùng để DNAT, SNAT, MASQUERADE
- mangle table Dùng để set mark, chỉnh một số field
- raw table Ít gặp, có thể bypass conntrack cho một số traffic
Những chain hay gặp:
- INPUT Traffic đi vào local process
- OUTPUT Traffic do local process tạo ra
- FORWARD Traffic đi qua host để sang nơi khác
- PREROUTING Điểm sớm trước routing decision, hay dùng DNAT
- POSTROUTING Điểm muộn sau routing decision, hay dùng SNAT
Cách đọc rule và vì sao rule ordering quan trọng
iptables match theo thứ tự, rule nào match trước thì apply trước.
Các lỗi kinh điển:
- Một rule allow quá rộng đứng trước làm rule chặn phía sau vô nghĩa
- Bạn đặt DROP sớm quá và khóa luôn SSH
- Bạn tưởng traffic đi qua INPUT nhưng thực ra nó đi qua FORWARD do host đang route
Cách đọc nhanh:
- Xác định traffic là local hay routed
- Xác định chain đúng
- Xem counters để biết rule có match hay không
iptables -L -n -v
iptables -S
Stateful firewall với conntrack
Phần lớn firewall thực tế là stateful. Bạn thường allow traffic trả về bằng conntrack state.
Ví dụ: Cho phép mọi connection đã ESTABLISHED đi qua, giảm số rule cần viết.
Bạn thường đặt rule này rất sớm trong chain để tránh tốn CPU match nhiều rule phía sau.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
nat table và các use case phổ biến
nat table dùng khi bạn cần rewrite địa chỉ.
- DNAT Đổi destination để port forwarding hoặc publish service
- SNAT và MASQUERADE Đổi source để outbound sharing hoặc ép return path
Ví dụ: Client truy cập 203.0.113.10 port 443, packet được DNAT sang 10.0.1.10 port 8443.
DNAT thường được apply ở PREROUTING trong nat table, và bạn phải đảm bảo FORWARD chain không drop flow đó.
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.0.1.10:8443
iptables -A FORWARD -p tcp -d 10.0.1.10 --dport 8443 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -s 10.0.1.10 --sport 8443 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables trong Docker và Kubernetes
Docker thường add rule vào nat table và filter table để NAT container traffic và publish port. Kubernetes với kube-proxy iptables mode sẽ tạo rất nhiều rule và chain để route Service tới Pod IP.
Điều hay gây nhầm:
- Bạn chỉnh iptables thủ công nhưng hệ thống orchestration lại rewrite
- Bạn drop FORWARD mà quên đây là path chính của container traffic
- Bạn debug ở INPUT nhưng traffic thực ra đang đi qua chain do Docker hoặc kube-proxy tạo
Khi nghi ngờ có side effect, dump toàn bộ rule ra file để so sánh trước và sau khi deploy.
iptables-save
Troubleshooting iptables theo pattern on call
Các bước thường hiệu quả:
- Xác định chain đúng và đọc counters
- So sánh rule set bằng iptables-save
- Correlate bằng tcpdump ở interface vào và interface ra
iptables -L -n -v
iptables-save | head
tcpdump -ni eth0 tcp port 443
Nếu counters không tăng, rule không match. Nếu counters tăng mà app vẫn timeout, bắt packet để xem flow có rời host hay bị drop ở chỗ khác.
Pitfalls hay gặp
- Shadow rule Rule phía sau không bao giờ match
- Allow all vô tình Một rule ACCEPT rộng làm mất tác dụng policy
- Default policy không như bạn nghĩ INPUT policy ACCEPT nhưng bạn tưởng DROP, hoặc ngược lại
- Conntrack pressure NAT và stateful filtering phụ thuộc conntrack, khi table đầy sẽ sinh timeout khó đoán
- Persistency Reboot xong mất rule nếu bạn không có cơ chế restore
Checklist vận hành iptables cho production
- Luôn có access dự phòng trước khi đổi firewall, như console access hoặc out of band
- Đặt rule ESTABLISHED,RELATED sớm để giảm overhead
- Viết rule theo mức độ cụ thể, rule cụ thể đứng trước rule tổng quát
- Theo dõi counters để biết rule nào đang match thật
- Chuẩn hóa backup và rollback bằng iptables-save và iptables-restore
- Khi chạy Docker hoặc Kubernetes, hiểu chain nào do hệ thống quản lý để tránh conflict
Kết luận
iptables là nền tảng của firewall và NAT trên Linux, dễ dùng nhưng rất dễ tự bắn vào chân nếu không kiểm soát rule ordering, chain đúng, và conntrack behavior.
Nếu bạn làm SRE, iptables không chỉ là tool để chặn mở port, mà là bản đồ để đọc traffic path và giải quyết incident nhanh.







