删除特定的 conntrack 条目?

删除特定的 conntrack 条目?

在多 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");}';

相关内容