诊断Linux NAT失效等问题需检查conntrack状态,方法包括:一、用conntrack命令查连接条目;二、读/proc/net/nf_conntrack文件;三、按协议与状态统计分布;四、查资源使用情况;五、查unconfirmed和expectation表。

如果您需要诊断Linux系统中NAT失效、防火墙状态异常或新连接被拒绝等问题,则很可能是连接跟踪表(conntrack)状态异常所致。以下是查看网络连接跟踪的多种高级方法:
一、使用conntrack命令列出全部连接条目
conntrack是专用于操作连接跟踪表的用户态工具,可实时读取内核中的conntrack表内容,适用于快速定位活跃连接、协议分布及状态异常。
1、执行sudo conntrack -L查看当前所有已确认的连接条目。
2、添加--src-nat或--dst-nat参数筛选应用了源或目的NAT的连接。
3、使用-p tcp、-p udp等限定协议类型,例如:sudo conntrack -L -p tcp | head -10。
4、通过-E选项启用事件监听模式,实时捕获新建、销毁、更新等连接事件:sudo conntrack -E。
二、直接读取/proc/net/nf_conntrack文件
该文件是内核暴露的原始连接跟踪表快照,不依赖用户态工具,适合在conntrack工具不可用或需最小依赖时使用,输出格式与conntrack -L一致但无格式化修饰。
1、运行sudo cat /proc/net/nf_conntrack获取完整连接列表。
2、结合grep按IP或端口过滤,例如:sudo cat /proc/net/nf_conntrack | grep "192.168.1.100"。
3、统计当前总连接数:sudo cat /proc/net/nf_conntrack | wc -l。
4、检查是否存在大量[UNREPLIED]或[ASSURED]标记条目,[UNREPLIED]表示仅收到请求未收到响应,可能预示连接未完成或被丢弃。
三、按协议与状态分类统计连接分布
通过解析conntrack输出可识别流量热点、协议失衡或异常状态堆积,为调优提供依据。
1、统计各协议连接数量:sudo conntrack -L | awk '{print $1}' | sort | uniq -c | sort -nr。
2、统计TCP各状态连接数:sudo conntrack -L | awk '$1~/tcp/ {print $4}' | sort | uniq -c | sort -nr。
3、查看TIME_WAIT连接详情并排序:sudo conntrack -L | grep "TIME_WAIT" | head -10。
4、识别高占用源IP:sudo conntrack -L | awk '$1~/tcp/ {print $6}' | cut -d'=' -f2 | cut -d' ' -f1 | sort | uniq -c | sort -nr | head -5。
四、检查连接跟踪子系统资源使用情况
确认是否达到表容量上限或内存分配瓶颈,是判断“conntrack满”的关键步骤。
1、查看当前最大允许连接数:cat /proc/sys/net/netfilter/nf_conntrack_max。
2、查看当前已使用连接数:cat /proc/sys/net/netfilter/nf_conntrack_count。
3、计算占用率:当前使用数 ÷ 最大数 × 100%,若超过90%,需警惕丢包风险。
4、检查内核日志是否出现丢包提示:dmesg | grep "nf_conntrack: table full"。
五、查看未确认连接与期望连接表
conntrack内部维护多张辅助表,unconfirmed和expectation表可揭示连接建立失败或ALG(如FTP/SIP)触发异常的线索。
1、列出未确认连接(尚未收到响应的初始包):sudo conntrack -L unconfirmed。
2、列出期望连接(由ALG模块主动创建的预期连接):sudo conntrack -L expectation。
3、观察unconfirmed表是否持续增长且不释放,这通常表明SYN包发出后未收到ACK,或连接被中间设备拦截。
4、检查expectation表中是否存在大量过期条目:sudo conntrack -L expectation | wc -l。

















