web-dev-qa-db-ja.com

linux netfilter / iptablesを使用して、特定の条件で両端でtcp接続をすぐにリセットするにはどうすればよいですか?

Serverfaultコミュニティの皆様、

次の問題があります。パケットデータで特定の文字列が検出された場合、ネットワークの両側でTCP接続をすぐにリセット(切断)する必要があります。私は両側のアプリケーションを制御できず、接続の中止を行うためにLinux iptables(または同様のツール)しか使用できません。

私の最初のアイデアは、次のiptablesルールを使用して、探していたものを実現することでした。

/usr/sbin/iptables -A INPUT -p tcp --dport 1234 -m string --algo bm --string 'BAD STRING' -j REJECT --reject-with tcp-reset

これは、TCP RSTパケットをクライアントに送信することにより、リモート側で完全に機能します。したがって、クライアントはすぐに切断されます。残念ながら、強制切断とサーバープロセス(接続)時にローカル側に通知されません。 )永久にハングします。

特定の条件(この場合はIPパケットの文字列の一致)で両側ですでに確立されている接続をすぐに切断するという要件は、それほど珍しいことではないと思いました。それで私はグーグル検索をしましたが、驚いたことに、妥当な時間内に使用可能なものを見つけることができませんでした。

Iptablesを使用して両方のネットワーク側でtcp切断を実現する方法はありますか?そうでない場合は、他にどのようなツールを使用できますか(クライアント/サーバーアプリケーションを制御できないことに注意してください)。

貴重なお答えいただき、誠にありがとうございます!

宜しくお願いします、

イェンス

6
Jens Moser

xt_RESET を使用できます(例:-j RESET

タイムアウトするようにアプリケーションを構成できます。

別の解決策は、TCP KeepAliveを構成し、10分ごとなど、より頻繁なチェックを行うことです。

一部のアプリケーションは、アプリケーションレベルでキープアライブを実装します。例えば。 SSH、Apache。

キープアライブが送信され、リモートエンドで接続が閉じられると、リモートエンドからRSTを受信します。

ステートフルファイアウォールは、非アクティブな期間が経過すると接続を忘れます。つまり、しばらくトラフィックがない場合(30分または1時間)は、破棄されたパケットとハーフオープン接続を取得できます。

実装しようとしている特定の解決策よりも、解決しようとしている特定の問題について質問する方がよいと思います。

1

残念ながら、強制切断時にローカル側に通知されません

Tcp-resetは、接続が閉じられていることをクライアントに通知する必要があることを意味します。リセットが送信されたときにクライアントがハングしている場合、これは、IPTablesを実行しているホストから返送されているリセットを適切に処理していないことを意味します。あなたがその問題に取り組む手段を持っていない限り、私はあなたがこれを達成することができる方法を考えることができません。

0
GeoSword