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 出命令预览,确认无误再执行。