サーバーを再起動せずにコマンドラインから切断された接続を終了する方法

サーバーを再起動せずにコマンドラインから切断された接続を終了する方法

クライアントコンピュータがシャットダウンすると、保留状態になるいくつかの切断された接続が私のアプリケーションにあります。接続の1つが次のように表示されます。

->192.168.1.214:49029 (ESTABLISHED)

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

検索後に「という解決策が見つかりtcpkillましたが、IPを永久にブロックしたため機能しませんでした。

答え1

ssLinuxカーネル> = 4.9では、iproute2のコマンドとキーを使用できます。-K

ss -K dst 192.168.1.214 dport = 49029

カーネルはCONFIG_INET_DIAG_DESTROYオプションが有効な状態でコンパイルする必要があります。

答え2

オリジナルソース:http://rtomaszewski.blogspot.sk/2012/11/how-to-forceously-kill-built-tcp.html

ソケットを「終了」するには、TCPリセットパケットを送信する必要があります。これを送信して相手が受け入れるようにするには、実際のTCPシーケンス番号を知る必要があります。

1)すでに述べたtcpkill方法は、ネットワークを手動でスニッフィングし、その接続に有効なパケットが到着するのを待つようにSEQ番号を学習します。次に、学習したSEQ番号を使用してRSETパケットを両当事者に送信します。ただし、接続がアイドル/サスペンドされ、データフローがない場合は、何もせずに永遠に待ちます。

2)別の方法はkillcxソースフォージリンク)。なりすましSYNパケットを積極的に送信し、応答でSEQ番号を学習します。次に同じ方法でRSETパケットを送信しますtcpkill

達成しようとする目的によるもう1つのアプローチは、gdbデバッガを使用してこのソケット/接続を所有するプロセスに接続し、代わりにclose()システムコールを実行することです。詳しくはこちらをご覧ください。回答

保留中の接続のみを処理する場合(もう一方の端は切断されます)、システムに正しく構成されている場合は、その接続を自動的に閉じる必要があるさまざまなタイムアウト(TCP接続の維持など)があります。

答え3

tcpkillあなたのためにそれをすることもできます。 Ubuntuはdsniffパッケージにあります。

それは次のとおりです。

$ sudo tcpkill -i wlan0 host 192.168.1.214

(またはtcpdump任意の接続を切断するための他の同様の表現)。

答え4

パケットを一致させるときにRSTをリモートで送信する機能を試すことiptables REJECTができます。--reject-with tcp-reset

関連情報