conntrack 是什么
做地址转换或运行有状态防火墙的内核里,每条活跃连接都会在连接跟踪表里留一条记录。这张表有容量上限,写满后新连接会被丢弃,内核日志里会给出提示。conntrack 命令用来查看表内条目、统计各协议与错误计数、按条件清理条目,也能订阅实时事件流。排查连接时通时不通、地址转换异常、表被写满这类问题时,它是绕不过去的工具。
基本信息
| 适用平台 | GNU/Linux(需安装命令行工具,内核需启用连接跟踪模块) |
|---|---|
| 语法 | conntrack -L 列出、-C 计数、-S 统计、-D 删除、-E 事件 |
| 依赖组件 | 内核连接跟踪模块与用户态工具包 |
| 条目内存占用 | 每条约几百字节 |
| 上限查看 | 通过内核参数查询最大条目数 |
| 命名空间 | 每个命名空间有自己独立的表 |
典型使用场景
- 排查新连接被丢弃:先确认连接跟踪表是否已经达到上限。
- 统计各协议条目数与错误计数,判断异常来源。
- 清理特定端口的残留条目,恢复业务连通性。
- 地址转换异常时确认条目里记录的实际地址与端口。
- 实时订阅新建连接事件,观察连接来源。
常用写法
常用写法
conntrack -C # 当前条目数(执行很快)
sysctl net.netfilter.nf_conntrack_max # 查看上限
conntrack -L -p tcp --dport 443 | head # 只看某个端口的会话
conntrack -S | head # 每核统计与错误计数
conntrack -D -p tcp --dport 8080 # 清理某端口的全部条目
conntrack -E -e NEW | head # 实时事件流
dmesg | tail -20 # 查找表满告警选项读法
| 选项 | 作用 | 使用要点 |
|---|---|---|
| -C | 统计条目总数 | 最轻量的查询方式 |
| -L | 列出条目 | 可加协议与端口条件过滤 |
| -S | 统计与错误计数 | 排查丢包与异常时先看它 |
| -D | 删除条目 | 会立即影响活跃连接,需谨慎 |
| -E | 订阅事件流 | 观察新建连接时使用 |
| 表上限 | 决定最大并发会话 | 写满后新连接会被丢弃 |
内核日志出现连接跟踪表满并丢包的提示时,先用统计查异常来源,再评估调大上限;条目本身占用内存,上限提高意味着内存占用同步上升。
删除条目会把活跃会话从表中抹掉,有状态防火墙可能立即中断这些连接,生产环境先小范围验证再推广。
容器与多命名空间环境下,看到的只是当前命名空间的表;排查宿主机问题要在宿主机的命名空间里执行。