強制終了する必要があるプロセスによってブロックされているポートがあります。 (クラッシュした小さなtelnetデーモン)。プロセスは正常に強制終了されましたが、ポートはまだ「FIN_WAIT1」状態です。それから出てくるのではなく、そのタイムアウトは「10年」に設定されているようです。
私がこのポートを解放する唯一の方法は、マシン全体をリブートすることです。これは当然のことですが、私はしたくないものです。
$ netstat -tulnap | grep FIN_WAIT1
tcp 0 13937 10.0.0.153:4000 10.0.2.46:2572 FIN_WAIT1 -
再起動せずにこのポートのブロックを解除する方法を誰かが知っていますか?
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)
#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans
# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed
# restore the value of tcp_max_orphans whatever it was before.
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans
# verify with
netstat -an|grep FIN_WAIT1
/proc/sys/net/ipv4/tcp_fin_timeout
でタイムアウトを設定できるはずです。
ソケットを手動でクリアする方法はないようです。
Tcp_Orphan_retries設定は、サーバーレスポートが解放されるまでに試行される回数を制御しているようです。ここでは0でした。1に設定すると、ポートが失われます。
HTH
/proc/sys/net/ipv4/tcp_fin_timeout
は、FIN-WAIT-1ではなく、FIN-WAIT-2状態のタイムアウトです。 tcpkillルートを使用する必要があります。そうしないと、/proc/sys/net/ipv4/tcp_keepalive_*
のキープアライブ時間を使用して、SOによる強制終了を試すことができます。
ルートIDでこれらの手順を実行すると、クリアされました。
カーネル設定をキャプチャして、変数を変更します
$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')
一時的に最大オーファンを0に設定します
$ sysctl -w net.ipv4.tcp_max_orphans=0
問題のあるポートが使用されていないことを確認してください
$ netstat -np|grep 9716
上記のコマンドが行を返さなくなるまで、少し待って、必要に応じて上記の手順を繰り返します。
Tcp_max_orphansカーネルパラメータを上の変数の元の値にリセットします
$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
FIN_WAIT1
ローカルマシン上のアプリケーションが接続を閉じました。これを示す情報がリモートマシンに送信されました。
アプリケーションは接続の側を閉じました。ソケットは、リモート側が閉じることを確認するのを待っています。これらのソケットの多くがFIN_WAIT1で保持されていることに問題がある場合は、上記のManniのアドバイスに従う必要があります。
Linuxカーネル> = 4.9では、-Kを指定してiproute2からss
コマンドを使用できます
ss -K dst 192.168.1.214 dport = 49029カーネルは、CONFIG_INET_DIAG_DESTROYオプションを有効にしてコンパイルする必要があります。