conntrack là connection tracking subsystem trong Linux kernel, dùng để track flow theo 5 tuple và lưu NAT mapping. Netfilter dựa vào conntrack để chạy stateful firewall, và để DNAT SNAT reverse translate đúng cho return traffic.
Trong DevOps và SRE, conntrack là chỗ hay tạo ra incident kiểu timeout theo burst, kết nối lúc được lúc không, health check đỏ hàng loạt khi connection rate tăng. Với Docker và Kubernetes, conntrack bị stress mạnh vì lượng flow lớn và endpoint churn cao.
Ví dụ: TCP flow 203.0.113.5 port 53122 kết nối tới 10.0.1.10 port 443 tạo một conntrack entry.
Entry này giúp kernel nhận ra packet thuộc cùng flow ở reply direction, từ đó match ctstate và apply NAT mapping nếu có.
conntrack cho biết điều gì
conntrack giúp bạn trả lời nhanh các câu hỏi vận hành:
- Flow đang ở state nào như NEW hay ESTABLISHED
- Có NAT mapping nào đang rewrite destination IP và port hoặc rewrite source IP và port không
- conntrack table đang có bao nhiêu entries, có gần chạm giới hạn không
- Drop và insert failed có đang tăng không
Khi L7 thấy timeout hoặc retry tăng, nhìn conntrack giúp bạn phân biệt được app issue với network dataplane issue.
conntrack entry gồm gì
Một conntrack entry thường có các dữ liệu mà on call hay cần:
- Original direction với source IP, source port, destination IP, destination port, protocol
- Reply direction tương ứng cho return traffic
- State machine của TCP và timeout theo state
- NAT mapping nếu có DNAT hoặc SNAT
- Counters và mark tùy cấu hình
Điểm cần nhớ là NAT không chỉ là rule, NAT còn là state per flow nằm trong conntrack.
NEW ESTABLISHED RELATED INVALID đọc sao cho đúng
- NEW Flow mới, thường vừa tạo state và chưa confirm đủ hai chiều
- ESTABLISHED Flow đã confirm, đã thấy traffic hai chiều theo state machine
- RELATED Flow liên quan tới một flow đã có, hay gặp khi có helper
- INVALID Packet không match được state hợp lệ, thường bị drop sớm
Trong firewall thực chiến, allow ESTABLISHED và RELATED gần như là rule nền để return traffic không bị block.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
conntrack và iptables ctstate
iptables ctstate match là policy layer, nó dựa hoàn toàn vào conntrack. Nếu conntrack không tạo được entry mới, ctstate NEW không hình thành, và flow fail dù rule nhìn có vẻ đúng.
Những lỗi hay gặp:
- Allow NEW vào port nhưng thiếu allow ESTABLISHED,RELATED
- Drop INVALID quá rộng, trong khi traffic có asymmetric path hoặc offload làm state bị lệch
- NAT đã có nhưng FORWARD policy drop giữa đường
conntrack với DNAT và SNAT
DNAT và SNAT cần conntrack để giữ mapping theo từng flow, rồi reverse translate cho return traffic.
Ví dụ: Client truy cập 203.0.113.10 port 443, packet được DNAT sang 10.0.1.10 port 8443. Conntrack sẽ giữ mapping để response từ 10.0.1.10 port 8443 được reverse translate về 203.0.113.10 port 443.
Nếu return traffic bypass node đang làm NAT, reverse translate không xảy ra và client thường timeout dù backend vẫn nhận request.
conntrack table full và symptom hay gặp
Khi conntrack table full, kernel không insert được entry mới hoặc drop theo burst. Symptom bên ngoài rất giống packet loss hoặc app degrade.
- Timeout tăng đồng loạt khi connection rate spike
- SYN retransmit tăng, handshake fail tăng
- Một nhóm node fail trước vì traffic dồn không đều, như NodePort hoặc ingress dồn về vài node
Bạn thường kiểm tra nhanh counters để xem insert failed và drop.
conntrack -S
nf_conntrack_max và nf_conntrack_buckets
Hai tham số phổ biến nhất khi sizing:
- net.netfilter.nf_conntrack_max Giới hạn số entries
- net.netfilter.nf_conntrack_buckets Số buckets của hash table, ảnh hưởng lookup cost và CPU
Sai sizing thường ra 2 kiểu:
- nf_conntrack_max thấp, table full sớm, drop new connections
- buckets nhỏ, collision nhiều, CPU spike khi traffic burst
sysctl net.netfilter.nf_conntrack_max
sysctl net.netfilter.nf_conntrack_buckets
Timeout tuning cho TCP và UDP
Timeout quyết định entry sống bao lâu khi idle. Workload nhiều short lived connections mà timeout quá dài sẽ làm table phình nhanh. UDP mà timeout quá ngắn sẽ tạo cảm giác chập chờn.
Pattern hay gặp:
- netfilter giữ TCP established entry quá lâu, peak giờ cao điểm dễ full
- UDP timeout ngắn làm DNS query hoặc telemetry UDP bị drop khi có idle gap
sysctl net.netfilter.nf_conntrack_tcp_timeout_established
sysctl net.netfilter.nf_conntrack_udp_timeout
sysctl net.netfilter.nf_conntrack_udp_timeout_stream
Troubleshooting conntrack
Ba bước hay dùng khi on call:
- Xem thống kê tổng quan
conntrack -S
- Lọc entries theo backend IP hoặc port
conntrack -L | grep 10.0.1.10
- Check kernel message liên quan conntrack table full và drop
dmesg | tail
Nếu thấy insert failed tăng, ưu tiên xử lý capacity và connection churn trước, rồi mới đào sâu application.
conntrack trong Kubernetes
Trong Kubernetes, conntrack bị stress vì Service traffic thường đi qua NAT, và endpoints thay đổi liên tục.
Tình huống hay gặp:
- Rollout làm endpoints churn, mapping cũ còn giữ theo timeout, traffic tạm thời đi sai backend
- NodePort dồn traffic vào một subset node, conntrack trên các node đó full trước
- L7 metrics không khớp connection attempts vì drop xảy ra ở node trước khi tới Pod
Checklist vận hành conntrack cho production
- Monitor nf_conntrack_count và nf_conntrack_max, alert khi gần đầy
- Sizing theo peak concurrent connections, không theo average
- Review connection churn, nhất là client retry aggressive và job tạo short lived connections
- Verify return path cho NAT, tránh asymmetric routing làm reverse translate fail
- Chuẩn hóa playbook debug: conntrack -S, conntrack -L, iptables counters, tcpdump theo interface
Kết luận
conntrack là state table quyết định độ ổn định của stateful firewall và NAT trên Linux. Khi traffic lớn, churn cao, hoặc return traffic lệch path, conntrack thường là điểm gãy gây timeout ngẫu nhiên và drop theo burst.







