我使用私有 IP 地址,并且希望在路由器(网关)中保持 SNAT 条目的活动状态至少两个小时(我的网络的某些 Windows 应用程序使用 TCP keepalive 设置为 2 小时)。网关是一台 Linux 机器,所以我将nf_conntrack_tcp_timeout_established
其nf_conntrack_generic_timeout
设置为 7400 秒:
echo 7400 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
echo 7400 > /proc/sys/net/netfilter/nf_conntrack_generic_timeout
现在,当 TCP 连接建立后不久,我可以看到新值:
# cat /proc/net/ip_conntrack
tcp 6 7399 ESTABLISHED src=192.168.0.192 dst=108.168.176.194
sport=51826 dport=5222 src=108.168.176.194 dst=95.63.14.117 sport=5222
dport=51826 [ASSURED] use=1
但几秒钟后我再次读取该值,现在该值已返回到 60 秒:
tcp 6 39 ESTABLISHED src=192.168.0.192 dst=108.168.176.194
sport=51826 dport=5222 src=108.168.176.194 dst=95.63.14.117 sport=5222
dport=51826 [ASSURED] use=1
答案1
根本原因是内核中的conntrack代码被修改。由于我们使用的是由我们的提供商修改的嵌入式 Linux 发行版,因此刷新 SNAT 条目超时的函数指向一个特殊函数,用于为我们的提供商提供新的“功能”之一。我已经修复了它,现在它可以按预期工作。