クライアントコンピュータがシャットダウンすると、保留状態になるいくつかの切断された接続が私のアプリケーションにあります。接続の1つが次のように表示されます。
->192.168.1.214:49029 (ESTABLISHED)
サーバーを再起動せずにLinuxコマンドラインでこれらの接続を終了する方法はありますか?
検索後に「という解決策が見つかりtcpkill
ましたが、IPを永久にブロックしたため機能しませんでした。
答え1
ss
Linuxカーネル> = 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