LinuxでTCP接続を切断する


49

クライアントマシンが停止している場合、ハングした状態にある1つのアプリケーションで接続が切断されています。

->192.168.1.214:49029 (ESTABLISHED)

サーバーを再起動せずにLinuxコマンドラインからこれらのオプションを終了する方法はありますか?

検索後、tcpkillというソリューションが見つかりました。しかし、私にはうまくいきません。それは永久にそのIPをブロックするように。


ssコマンドの使用に関する答えは、他の方法よりもはるかに簡単で一般的です。
nealmcb

回答:


35

元々:http : //rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html

ソケットを「強制終了」するには、TCPリセットパケットを送信する必要があります。それを送信する(そして反対側に受け入れられる)には、実際のTCPシーケンス番号を知る必要があります。

1)すでに述べたtcpkill方法は、ネットワーク上で受動的にスニッフィングし、この接続の有効なパケットが到着するのを待つことにより、SEQ番号を学習します。次に、学習したSEQ番号を使用して、RSETパケットを両側に送信します。ただし、接続がアイドル/ハング状態で、データが流れない場合、何も実行されず、永遠に待機します。

2)別の方法では、killcxSourceforgeへのリンク)と呼ばれるperlスクリプトを使用します。これは、スプーフィングされたSYNパケットをアクティブに送信し、回答からSEQ番号を学習します。それからRSETパケットを同じ方法で送信しますtcpkill

別のアプローチ(達成したいものに基づいて)は、gdbデバッガを使用してこのソケット/接続を所有するプロセスにアタッチし、close()その代わりにsyscall を発行することです-この回答で詳しく説明します

ハングした接続のみを処理する場合(反対側が停止している場合)、さまざまなタイムアウト(TCPキープアライブなど)があり、システムで適切に構成されていれば、そのような接続が自動的に閉じられます。


ファイル記述子(fd)でTCPソケットを閉じただけで機能しますか?execのFD>& -
アレクサンダーGonchiy

@AlexanderGonchiyは、ライブ接続の場合、プロセスがパケットに応答するのを防ぐため、接続がタイムアウトになります。アイドル接続の場合、何も起こりません。カーネルがfdを閉じるときにネットワークに何かを送信するかどうかはわかりません。
Marki555

シーケンス番号を盗聴しました。それではどうすればいいですか?
user3132194

18

tcpkillあなたのためにそれをするかもしれません。Ubuntuでは、dsniffパッケージに含まれています。

何かのようなもの:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(またはtcpdumpどの接続を強制終了するかを表す他の類似表現)。


4
これは、接続が何かを送信している場合にのみ機能します。
ハング

17

Linuxカーネル4.9以上ではss、キーを使用してiproute2 のコマンドを使用できます-K

ss -K dst 192.168.1.214 dport = 49029

CONFIG_INET_DIAG_DESTROYオプションを有効にしてカーネルをコンパイルする必要があります。


1
Linuxの場合、これは本当に最良の方法であり、アイドル接続(tcpkill動作しなかった)がある場合はほとんど唯一の方法です。しかし、私は検査していませんがkillcx、これらのスプーフィングされたパケットが通過できるようにiptablesを変更しない限り、多くのセキュリティソフトウェアが動作を妨げているように感じます。
セスロバートソン

ありがとう!sudo ss -K ....Ubuntu Bionic 18.04 LTSでチャームのように機能しました。tmuxリモートのために小さな画面サイズで止まったプロセスがありましたが、接続はタイムアウトしましたが、タイムアウトではありませんでした。すべて修正済み!
nealmcb

6

ルートとしてnetstat -tunp|grep 49029。出力の最後の列には、その接続を担当するプロセスのPIDとプログラム名が表示されます。

運が良ければ、その接続のための単一のプロセスがあります。

運が悪ければ、より複雑になります(PIDは、その1つ以上の接続を担当します)。これはどのようなサービスですか?

なぜそのセッションを終了したいのですか?


8
そのプロセスを殺すことはできません。Gearmanサーバーです。接続を閉じたいだけです。
ヴィベックゴエル

0

tcpkillデッド(ハング)接続を閉じることはできません。これはlibpcap、送信パケットにパケットを構築することに基づいていFINます。接続がすでに停止している場合、正しいシーケンス番号を取得できません。

唯一の方法はプロセスを閉じることなので、どこでもSPOFになりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.