![删除特定的 conntrack 条目?](https://linux22.com/image/577846/%E5%88%A0%E9%99%A4%E7%89%B9%E5%AE%9A%E7%9A%84%20conntrack%20%E6%9D%A1%E7%9B%AE%EF%BC%9F.png)
在多 ISP 配置中,我通过特定接口将特定流量(例如 VoIP)路由和 NAT 到不同的提供商。当其中一个接口(或路由)不可用时,必须断开所有使用该接口的连接,并且必须通过仍在工作的连接路由后续流量。状态发生变化后,我会重置并加载适当的 iptables 和路由条目(即“shorewall 重启”- 我正在使用 shorewall)。
问题是 - 仍然存在的 conntrack 条目导致旧的(现在是错误的)外部地址仍然用于这些连接的 NAT!在“conntrack -D”之后,NAT 再次按预期工作。
我想仅删除属于旧外部地址的 conntrack 条目,或者以不影响通过其他接口的连接的方式解决问题。
例如-我想删除所有具有反向连接目的地的 conntrack 条目dst=old.ext.ip.adr
,例如
udp 17 164 src=192.168.158.3 dst=213.208.5.40 sport=5060 dport=5060 packets=178 bytes=104509 src=213.208.5.40 dst=old.ext.ip.adr sport=5060 dport=5060 packets=234 bytes=127268 [ASSURED] mark=256 secmark=0 use=2
我已经尝试过的:
# conntrack -D -r 212.108.43.143
^C (nothing happens, it just hangs)
# conntrack -D -r 213.208.5.40 -d 212.108.43.143
Operation failed: such conntrack doesn't exist
提前谢谢您!谨致问候,Zrin
答案1
解决方案如下:这里。
我有一个类似的任务 — — 删除与前往特定 Internet 主机并被 SNAT 的 UDP 连接相关的特定 conntrack 条目,因此我创建了以下脚本:
#!/bin/sh
set -e -u
HUB=AAA.BBB.CCC.DDD # target host's IP address
value()
{
echo ${1#*=}
}
/usr/sbin/conntrack -L conntrack -p udp -d $HUB |
while read proto _ _ src dst sport dport _; do
/usr/sbin/conntrack -D conntrack \
--proto `value $proto` \
--orig-src `value $src` \
--orig-dst `value $dst` \
--sport `value $sport` \
--dport `value $dport`
done
答案2
尝试,
conntrack -D --src-nat --reply-dst old.ext.ip.adr
答案3
创建一个名为 clrcontrack 的文件,将下面的代码粘贴到其中,授予用户适当的访问权限,使其可执行,然后像“clrcontrack ip port”一样运行它,例如 clrcontrack 192.168.56.123 80。它应该清除 ip 上端口 80 的所有已建立状态 contrack 记录。如果您不想定位状态,请删除 grep ESTAB 部分,或将其替换为目标状态
/usr/sbin/conntrack -L |grep $1 | grep ESTAB |grep 'dport=$2' |
awk '{ system("/usr/sbin/conntrack -D --orig-src '$1' --orig-dst "
substr($6,5) " -p tcp --orig-port-src " substr($7,7) " --orig-port-dst $2");}';