conntrack -D -s IP 不生效是因为未指定协议,必须配合 -p tcp 或 -p udp 才能删除对应协议的连接条目;若内核未加载 nf_conntrack 模块也会报 invalid argument 错误。

conntrack -D -s IP 为什么有时不生效
直接执行 conntrack -D -s 192.168.1.100 看似正确,但常无任何输出、也删不掉条目——根本原因是:该命令默认只匹配 源IP + 协议 + 源端口 + 目的IP + 目的端口 完全一致的连接,而 -s 单独使用时,conntrack 实际会尝试匹配「源IP 且 目的IP 为 0.0.0.0」的极窄条件,现实中几乎不存在。
必须加 -p 指定协议才能删干净
Linux 连接跟踪表中,每条记录都绑定协议类型(TCP/UDP/ICMP等),不指定就无法定位。实际删除必须显式带上 -p:
-
conntrack -D -s 192.168.1.100 -p tcp—— 删除该源IP发起或接收的所有 TCP 连接 -
conntrack -D -s 192.168.1.100 -p udp—— 同理处理 UDP - 如需清空所有协议,得逐个执行,conntrack 不支持
-p all或通配
遇到 “invalid argument” 错误怎么办
典型报错:conntrack v1.4.6: invalid argument,常见于以下情况:
- 内核未启用连接跟踪模块(检查
lsmod | grep nf_conntrack,缺失则需modprobe nf_conntrack) - 使用了旧版 conntrack(-s 单独过滤,升级工具或改用
-f配合临时文件 - IP 格式错误(如写成
192.168.1.100/32),-s只接受纯 IPv4/IPv6 地址,不认 CIDR
批量删多个源IP的实用写法
不能直接 conntrack -D -s 192.168.1.100 192.168.1.101,-s 不支持多值。安全做法是先查后删:
conntrack -L -s 192.168.1.100 -p tcp | awk '{print "conntrack -D -p tcp --orig-src", $6}' | sh
注意:$6 是原始源IP字段(不同版本字段序号可能变,建议先跑 conntrack -L -s IP -p tcp | head -1 确认列位置);生产环境建议加 -n 先预览命令,确认无误再执行。
真正麻烦的不是语法,而是 conntrack 删除后,已有连接的四元组可能仍被内核缓存几秒,应用层看到的“断连”延迟未必立刻体现——这点容易误判清理是否成功。










