删除特定的 conntrack 条目?

Zri*_*rin 6 routing linux-networking conntrack

在多 ISP 配置中,我通过特定接口将特定流量(例如 VoIP)路由和 NAT 到不同的提供商。当其中一个接口(或路由)不可用时,使用该接口的所有连接都必须被丢弃,并且后续流量必须通过仍在工作的连接进行路由。状态更改后,我将重置并加载适当的 iptables 和路由条目(这是“shorewall restart” - 我正在使用 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
Run Code Online (Sandbox Code Playgroud)

先感谢您!最好的问候, 兹林

kos*_*tix 6

这里给出了解决方案。

我有一个类似的任务 - 删除与前往特定 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
Run Code Online (Sandbox Code Playgroud)


小智 0

尝试,

conntrack -D --src-nat --reply-dst old.ext.ip.adr
Run Code Online (Sandbox Code Playgroud)