我有一个配置了 nat 端口转发的路由器。我通过 nat 启动了大文件的 http 复制。http 服务器托管在包含要下载的大文件的 LAN PC 上。我从 WAN PC 启动了文件下载。我在文件复制运行时禁用了 nat 规则。文件副本继续保留。我想在使用 conntrack-tool 禁用 nat 转发规则时停止文件复制。
我的 conntrack 列表包含以下 conntrack 会话
# conntrack -L | grep "33.13"
tcp 6 431988 ESTABLISHED src=192.168.33.13 dst=192.168.33.215 sport=52722 dport=80 src=192.168.3.17 dst=192.168.33.13 sport=80 dport=52722 [ASSURED] use=1
我尝试使用以下命令将其删除:
# conntrack -D --orig-src 192.168.33.13
tcp 6 431982 ESTABLISHED src=192.168.33.13 dst=192.168.33.215 sport=52722 dport=80 src=192.168.3.17 dst=192.168.33.13 sport=80 dport=52722 [ASSURED] use=1
conntrack v1.4.3 (conntrack-tools): 1 flow entries have been deleted.
我可以在以下命令中看到 conntrack 会话已删除。但是已创建另一个 conntrack 会话,其源 IP 地址是已删除 conntrack 的 lan 地址
# conntrack -L | grep "33.13"
tcp 6 431993 ESTABLISHED src=192.168.3.17 dst=192.168.33.13 sport=80 dport=52722 src=192.168.33.13 dst=192.168.33.215 sport=52722 dport=80 [ASSURED] use=1
conntrack v1.4.3 (conntrack-tools): 57 flow entries have been shown.
我尝试删除新的 conntrack,但它仍然保留
# conntrack -D --orig-src 192.168.3.17
# conntrack -L | grep "33.13"
conntrack v1.4.3 (conntrack-tools): 11 flow entries have been shown.
tcp 6 431981 ESTABLISHED src=192.168.3.17 dst=192.168.33.13 sport=80 dport=52722 src=192.168.33.13 dst=192.168.33.215 sport=52722 dport=80 [ASSURED] use=1
我错过了什么?
答案1
https://www.kernel.org/doc/Documentation/networking/nf_conntrack-sysctl.txt
nf_conntrack_tcp_loose - BOOLEAN
0 - disabled not 0 - enabled (default)
If it is set to zero, we disable picking up already established connections.
因此,已建立的连接会被即时检测(不涉及 SYN/SYN+ACK/ACK),并作为新的 conntrack 条目重新添加。由于它是新的 conntrack 条目,因此将再次遍历 nat 表并再次应用 DNAT 规则。即使一种方法不能立即起作用(如果除了 DNAT 规则之外没有定义 SNAT/MASQUERADE,http 服务器的传出数据包可能会在 WAN 上短暂显示为 192.168.3.17,并被 192.168.33.13 拒绝/忽略),只要另一种方式再次尝试(从 192.168.33.13 重试 ACK...),这将匹配。
输入:
echo 0 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose
然后再次尝试删除 conntrack 条目conntrack -D
...
这有望防止创建新的 conntrack 条目并停止下载。