顧客サイトでは、ネットワークチームがクライアントとサーバーの間にファイアウォールを追加しました。これにより、アイドル時間の約40分後にアイドル接続が切断されます。ネットワークの人々は、ファイアウォールにはアイドル接続のタイムアウトがないと言っていますが、実際にはアイドル接続が壊れています。
これを回避するために、最初にサーバー(Linuxマシン)を構成し、tcp_keepalive_time = 300、tcp_keepalive_intvl = 300、およびtcp_keepalive_probes = 30000でTCPキープアライブをオンにしました。これは機能し、接続は数日以上実行可能です。ただし、サーバーが死んだクライアントを検出して接続を強制終了するようにしたいので、設定をtime = 300、intvl = 180、probes = 10に変更し、クライアントが実際に生きている場合、サーバーは300秒ごとにプローブすると考えました(5分)クライアントはACKで応答し、ファイアウォールはこれをアイドル接続と見なして強制終了することを防ぎます。クライアントが停止している場合、10回のプローブの後、サーバーは接続を中止します。驚いたことに、アイドル状態で生きている接続は、以前のように約40分後に強制終了されます。
クライアント側で実行されているWiresharkは、サーバーでキープアライブが有効になっている場合でも、サーバーとクライアントの間でキープアライブをまったく表示しません。
ここで何が起こっているのでしょうか?
サーバーのキープアライブ設定がtime = 300、intvl = 180、probes = 10の場合、クライアントがアクティブでアイドル状態の場合、サーバーは300秒ごとにキープアライブプローブを送信し、接続をそのままにし、クライアントは死んでいます。300秒後に1つ送信し、接続を終了する前に180秒ごとにさらに9つのプローブを送信します。私は正しいですか?
1つの可能性は、ファイアウォールが何らかの理由でサーバーからのキープアライブプローブをインターセプトし、それらをクライアントに渡すのに失敗し、プローブを取得したという事実により、接続がアクティブであると見なされることです。これはファイアウォールの一般的な動作ですか?どのようなファイアウォールが関係しているかはわかりません。
サーバーはTeradataノードであり、接続はTeradataクライアントユーティリティからデータベースサーバー、サーバー側のポート1025への接続ですが、SSH接続で同じ問題が発生したため、すべてのTCP接続に影響すると考えられます。