web-dev-qa-db-ja.com

IPTablesを使用して一部のポートですべての_existing_ TCP接続を閉じるにはどうすればよいですか?

ReDiSクラスターの2つの半分を相互に切断する のように、実行したいネットワークパーティションテストをすばやく実行し、IPTablesを使用してサーバーのグループを別のグループから一時的に切断したいとしますグループ。

これは、Fedoraメーリングリストで寄せられた質問とよく似ています。

https://www.redhat.com/archives/rhl-list/2006-January/msg03380.html

EXISTING,RELATEDの出力にiptables --listが表示されない場合、これについて心配する必要がありますか?

Fedoraメーリングリストの次の回答では、はい、EXISTING,RELATEDの出力にiptables --listが表示されない場合、既存の接続は閉じます。

https://www.redhat.com/archives/rhl-list/2006-January/msg03396.html

再帰的なフラグを立てる人へのメモ:この質問、そしてさらに重要なのはその答えは、IPTablesが更新されると既存の接続をドロップするかどうかについて議論することですルール。

私の知る限りでは、このサイトの他の質問、このテーマについては、既存の接続と試行された接続の違いについては触れていません。

IPTABLESでリストされたものを除くすべてのネットワークの特定のTCP/UDPポート(受信)を閉じる方法

次のURLリンクのページで、Google検索のほとんどの研究結果を見つけました。

https://duckduckgo.com/?q=iptables+close+existing+connections

3
Nathan Basanese

Iptablesルールは、既存のTCP接続を閉じることはないため、アクティブに FINビットを含むメッセージ を送信する必要があるため、パケットフィルターではなくアプリケーションによって行われます。 。

一方、iptablesはいつでも、アプリケーションが既存の接続を介して新しいパケットを受信または送信するのをブロックし、新しい接続の確立を拒否することもできます。

これは、ステートフルなファイアウォールがあるかどうかに関係なくです。

それはすべて、新しいファイアウォールルールを正確にどこに挿入するかによって異なります。なぜなら、覚えておいてください、ファイアウォールルールは、リストされている順序でチェックされ、最初の不一致が見つかったところで処理が停止します。

つまりシンプルなステートフルファイアウォール:

[root@Host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
                     #1  < INSERT NEW RULE HERE
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
                     #2  < INSERT NEW RULE HERE
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
                     #3  < INSERT NEW RULE HERE
-A INPUT -j REJECT --reject-with icmp-Host-prohibited
                     #4  < iptables -A WILL APPEND NEW RULE HERE
-A FORWARD -j REJECT --reject-with icmp-Host-prohibited
COMMIT

新しいルールが必要な場合:

INPUT -s 10.0.0.89/32 -j REJECT --reject-with icmp-port-unreachable

そして、そのホストから受信したすべてのパケットがブロックされる位置#1に挿入します。

そのルールを位置#2に挿入すると、既存の接続のパケットは引き続き許可されますが、新しい接続は確立できません。

その特定の新しいルールを位置#3に挿入しても効果はありません。これは、10.0.0.89に対する特定のポリシーがないことと同じですが、追加の10.0.0.89へのアクセスを許可するルールを配置するのに適切な場所です。ポート。

そしてiptables -A INPUT toappend newルールをINPUTチェーンに追加すると、すべてのトラフィックがINPUT -j REJECT --reject-with icmp-Host-prohibitedルール。

つまり、iptables -Iではなくipatbles -Aのルール番号オプションを使用して、新しい(一時的な)ルールを目的の効果が得られる場所に配置します。

Sudo iptables -I <rule number> INPUT -s 10.0.0.89/32 -j REJECT --reject-with icmp-port-unreachable

同じステートフルファイアウォール構成で、プレーンHTTPの許可を停止する場合は、ポート80へのトラフィックを許可するルールを削除できます

Sudo iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

しかし、そうしても、iptablesが使用するセッション状態テーブルは空にならず、ポート80への既存の接続は、ルール-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTによって引き続き許可されます。

Webサーバーを停止/再起動するだけで問題を解決できます。FINメッセージを送信して開いているセッションを適切に閉じ、セッション状態テーブルからそれらをクリアします。

あるいは、ポート1のポート80にパケットをブロックするルールを追加できます。

5
HBruijn