回答:
元々:http : //rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html
ソケットを「強制終了」するには、TCPリセットパケットを送信する必要があります。それを送信する(そして反対側に受け入れられる)には、実際のTCPシーケンス番号を知る必要があります。
1)すでに述べたtcpkill
方法は、ネットワーク上で受動的にスニッフィングし、この接続の有効なパケットが到着するのを待つことにより、SEQ番号を学習します。次に、学習したSEQ番号を使用して、RSETパケットを両側に送信します。ただし、接続がアイドル/ハング状態で、データが流れない場合、何も実行されず、永遠に待機します。
2)別の方法では、killcx
(Sourceforgeへのリンク)と呼ばれるperlスクリプトを使用します。これは、スプーフィングされたSYNパケットをアクティブに送信し、回答からSEQ番号を学習します。それからRSETパケットを同じ方法で送信しますtcpkill
。
別のアプローチ(達成したいものに基づいて)は、gdb
デバッガを使用してこのソケット/接続を所有するプロセスにアタッチし、close()
その代わりにsyscall を発行することです-この回答で詳しく説明します。
ハングした接続のみを処理する場合(反対側が停止している場合)、さまざまなタイムアウト(TCPキープアライブなど)があり、システムで適切に構成されていれば、そのような接続が自動的に閉じられます。
Linuxカーネル4.9以上ではss
、キーを使用してiproute2 のコマンドを使用できます-K
ss -K dst 192.168.1.214 dport = 49029
CONFIG_INET_DIAG_DESTROY
オプションを有効にしてカーネルをコンパイルする必要があります。
tcpkill
動作しなかった)がある場合はほとんど唯一の方法です。しかし、私は検査していませんがkillcx
、これらのスプーフィングされたパケットが通過できるようにiptablesを変更しない限り、多くのセキュリティソフトウェアが動作を妨げているように感じます。
sudo ss -K ....
Ubuntu Bionic 18.04 LTSでチャームのように機能しました。tmux
リモートのために小さな画面サイズで止まったプロセスがありましたが、接続はタイムアウトしましたが、タイムアウトではありませんでした。すべて修正済み!
ss
コマンドの使用に関する答えは、他の方法よりもはるかに簡単で一般的です。