conntrack -L -s 和 -d 参数在大多数发行版中已废弃且无过滤作用,实际列出所有连接;正确方式是用 grep 精确匹配 conntrack -L 输出,或用 conntrack -D -s/-d 进行源/目的IP删除。

conntrack -L -s 和 -d 参数实际不生效,别白试了
直接说结论:conntrack -L -s IP -d IP 命令根本不会按源/目的 IP 过滤输出——conntrack -L 的 -s 和 -d 选项在大多数发行版(如 Ubuntu、CentOS 7+/RHEL 8+)的 conntrack 工具中**已被废弃且无过滤作用**,只会原样列出所有连接。你看到的“似乎有结果”,大概率是碰巧匹配了某几行文本,而非真正按五元组过滤。
正确过滤指定连接:用 grep 配合 conntrack -L
真实可行的做法是先全量导出,再用 grep 精确匹配连接状态行。注意 conntrack 输出格式固定,每行以协议开头(如 tcp),后跟源 IP:端口、目的 IP:端口等字段:
-
conntrack -L | grep "src=192.168.1.100.*dst=10.0.0.5"—— 匹配源为 192.168.1.100、目的为 10.0.0.5 的任意连接(含不同协议、端口) -
conntrack -L | grep "tcp.*src=192.168.1.100.*dst=10.0.0.5.*dport=80"—— 加上协议和目的端口,更精准 - 若需严格匹配整行(防误匹配中间字段),用
grep -E "^tcp.*src=...dst=..."
快速删除匹配到的连接:用 --delete 和 --orig-src/--orig-dst
conntrack 不支持直接从管道删除,必须把匹配结果转成 conntrack -D 可识别的参数格式。最稳妥的方式是提取原始连接标识(即 --orig-src / --orig-dst 等):
- 先看一条典型输出:
tcp 6 431999 ESTABLISHED src=192.168.1.100 dst=10.0.0.5 sport=54321 dport=22 [ASSURED] - 对应删除命令:
conntrack -D --orig-src 192.168.1.100 --orig-dst 10.0.0.5 --proto tcp --sport 54321 --dport 22 - 批量删(慎用):
conntrack -L | awk '/src=192.168.1.100.*dst=10.0.0.5/ {print "conntrack -D --orig-src", $6, "--orig-dst", $8, "--proto", $1, "--sport", $10, "--dport", $12}' | sh
注意:--sport/--dport 在非 TCP/UDP 连接里可能不存在,脚本需加判断;生产环境建议先 echo 出命令预览,确认无误再执行。
更安全高效的替代方案:用 conntrack -D 加条件组合
conntrack 本身支持部分条件删除(无需 grep + awk),但仅限基础字段:
-
conntrack -D -s 192.168.1.100—— 删除所有源 IP 是该地址的连接(-s此处有效) -
conntrack -D -d 10.0.0.5—— 删除所有目的 IP 是该地址的连接(-d此处也有效) -
conntrack -D -s 192.168.1.100 -d 10.0.0.5—— 同时指定源和目的 IP,多数版本可生效(比 grep 更可靠) - 但注意:此方式无法指定协议或端口,属于“宽删”,需确保目标足够唯一
真正要精确到五元组又不想写脚本?老实用 conntrack -L | grep | xargs -n1 conntrack -D 组合,但务必先测试 grep 是否只命中预期连接——连错一条,删掉的是正在传输的 SSH 或数据库连接。










