深色模式
conntrack 与 NAT
摘要:iptables/nftables 的 NAT 依赖内核 conntrack(连接跟踪)。本文教你查看连接表、理解一条 NAT 映射是怎么记录的,以及排错「连接数爆表」。
适用环境
bash
which conntrack || sudo apt install conntrack
ls /proc/net/nf_conntrack
# 查看当前跟踪表大小上限
cat /proc/sys/net/netfilter/nf_conntrack_max1
2
3
4
2
3
4
操作步骤
1. 看当前所有跟踪连接
bash
sudo conntrack -L
# 或等价:sudo cat /proc/net/nf_conntrack1
2
2
2. 只看某个源 IP 的连接
bash
sudo conntrack -L -s 192.168.1.20
sudo conntrack -L -d 10.0.0.51
2
2
3. 理解一条 NAT 记录
text
ipv4 2 tcp 6 114 TIME_WAIT src=192.168.1.20 dst=8.8.8.8 sport=34567 dport=53 \
src=8.8.8.8 dst=192.168.1.1 sport=53 dport=34567 [ASSURED]1
2
2
- 前半段是「原始方向」(内网→外网)
- 后半段是「回复方向」(外网源/目的被改写成网关 IP)
ASSURED表示双向流量都见过,连接已确认114是剩余秒数(TTL),到期回收
4. 统计当前连接数
bash
sudo conntrack -C
# 与上限对比,接近 nf_conntrack_max 会丢新连接1
2
2
5. 紧急清空(排错用,勿随意)
bash
sudo conntrack -F1
验证
bash
# 制造一条出向连接,再查是否出现在表里
curl -s -o /dev/null https://www.example.com
sudo conntrack -L -d 93.184.216.34 # example.com 的 IP
# 能看到一条 src=本机内网IP ... ASSURED 记录即说明 NAT 跟踪正常1
2
3
4
2
3
4
常见坑
WARNING
nf_conntrack_max 默认值偏小(常见 65536)。做网关/NAT 出口的机器高并发下容易打满,表现为「新连接随机失败」。可调大该值并相应调 nf_conntrack_buckets。
DANGER
conntrack -F 会清空整张表,正在进行的 NAT 连接会中断重连。生产环境只在确认需要、且接受短暂断流时执行,避免在业务高峰操作。