web-dev-qa-db-ja.com

Socks5プロキシ「Dante」は多くの子プロセスをFIN_WAIT2 / CLOSE_WAIT状態のままにします

私はdantev1.2.1をSOCKSプロキシサーバーとして実行しています。プロキシは正常に機能しますが、アクティブな接続がない場合でも、1日の終わりにsockdの子プロセスが約40〜50以上実行されます。

lsofは、子プロセスがすべてCLOSE_WAITおよびFIN_WAIT2状態のソケットを持っていることを示しています。これらの子プロセスは、デーモンを手動で強制終了/再起動しない限り、この状態のままになります。

2.6.24-23-xenカーネルでGentooLinuxを実行しています。私は最近、まったく同じ問題を引き起こしていたdantev1.1.19-r4からアップグレードしました。

これはDante、私のシステムの構成の問題ですか、それともdanteソースのコーディングの問題ですか?

1
Asad R.

CLOSE_WAITは、反対側が接続を閉じたことを意味します。ローカルプログラムがソケット記述子を閉じた後、ソケットは閉じられます。 CLOSE_WAITのタイムアウトはないため、プロセスはこの状態のソケットで無期限にスタックする可能性があります。プロセスとその子を強制終了すると、ソケットが閉じられ、閉じられます。 lsofを実行し、子がソケットを開いているかどうかを確認します。もしそうなら、それは彼らのコードのバグのように見えます。

FIN_WAIT2は、ローカル側が反対側からのFIN、ACKを待って、接続が閉じていることを確認するときです。ただし、この状態にはシステム全体のタイムアウトがあり(/proc/sys/net/ipv4/tcp_fin_timeoutを参照)、デフォルトでは60秒であるため、このフェーズで1分以上スタックすることはありません。しかし、ハーフクローズ接続がカーネルに対してアクティブな接続のように見えるようにプログラムをコーディングすることが可能であると思われる場合は、タイムアウトが発生しません。繰り返しになりますが、あなたが見つけたように思われます。バグ。

1
Paweł Brodacki