conntrack 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于网络进阶命令族。它操作的是 netfilter/连接跟踪表——NAT、有状态防火墙、Service(ipvsadm)都依赖它,表满会直接丢包。
conntrack 在内核里为每条流(五元组)记录状态与 NAT 映射,让回包能被正确反向转换/放行。这层机制见NAT 原理。
一、常用法(需 conntrack 包与 root)
conntrack -L # 列出全部跟踪表项(tcp/udp/icmp 及状态)
conntrack -C # 当前表项计数(最快,只看总量)
conntrack -S # 统计:insert/insert_failed/drop/early_drop
conntrack -L -p tcp --state ESTABLISHED | less
conntrack -L -s 10.0.0.5 # 按源地址过滤
conntrack -D -p tcp --dport 8080 # 删除匹配表项(摘除卡住的流)
conntrack -F # 清空整张表(危险:会瞬时中断所有被跟踪连接)
conntrack -E # 实时事件流,观察新建/销毁表项二、头号故障:nf_conntrack: table full, dropping packet
高并发短连接(尤其大量 NAT/SNAT、K8s 节点)时表被打满:
# 1. 看总量与上限
conntrack -C
cat /proc/sys/net/netfilter/nf_conntrack_max
# 2. 看是否发生丢弃
conntrack -S | grep -E 'drop|insert_failed|early_drop'
dmesg | grep -i 'nf_conntrack.*full'调大上限(注意内存):
sysctl net.netfilter.nf_conntrack_max=1048576
# 桶数通常应为 max/4(hashsize),写入模块参数或 /etc/modprobe.d
nf_conntrack_max不是越大越好:每条表项占几百字节,哈希桶太小会让查找退化成链、CPU 升高;桶数与 max 按约 1:4 配。真实根因常是连接 churn 太大——主动连出的海量短连接、TIME_WAIT 表项滞留,应同时优化端口复用/长连接,而不只是调大表。
三、超时与表项生命周期
sysctl net.netfilter.nf_conntrack_tcp_timeout_established # 默认 432000(5天!)
sysctl net.netfilter.nf_conntrack_tcp_timeout_time_waitestablished 超时默认极长(5 天),大量"客户端早断开但 NAT 设备未收到 FIN"的僵尸流会长期占位;内网高并发可显著调小 established/close_wait/time_wait 超时(结合业务),让表项更快回收。表项的协议状态机与 TCP 状态机对应。
四、和 ss / nstat 的区别
- ss:读 socket,看本机进程的连接。
- conntrack:看 netfilter 跟踪的"穿越本机/被 NAT 的流",包括转发的、非本进程拥有的连接——路由器/网关/K8s 节点上排查 NAT 必须用它。
- nstat:看协议栈累计计数器,不列出具体流。
相关命令
NAT 原理见NAT,四层转发见 ipvsadm,调参用 sysctl,socket 视图用 ss,抓包用 tcpdump。
总结
conntrack 查看/管理 netfilter 连接跟踪表:-C 看数量、-L 列表项、-S 看 drop/insert_failed、-D/-F 删表项;高并发 NAT/网关上"nf_conntrack table full dropping packet"要用 -C 对 nf_conntrack_max、配好哈希桶并缩短超长的 established(默认 5 天)超时,同时治理连接 churn;它记录的是穿越/被 NAT 的流(含转发),这是它和只看本机 socket 的 ss 的根本区别。