プライベートIPアドレスを使用していて、ルーター(ゲートウェイ)のSNATエントリを少なくとも2時間保持したい(ネットワークの一部のWindowsアプリはTCPキープアライブを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
根本的な原因は、カーネルのconntrackコードが変更されたことです。プロバイダーによって変更された組み込みLinuxディストリビューションを使用しているため、SNATエントリのタイムアウトを更新する関数は、プロバイダーの新しい「機能」の1つを提供するために使用される特別な関数を指していました。私はそれを修正しました、そして今それは期待通りに働いています。