IPTables ルールは着信 SSH 接続を許可します。

IPTables ルールは着信 SSH 接続を許可します。

このスクリプトの目的は、localhost <-> localhostと着信SSHトラフィックを除いて、VPNを介したトラフィックのみを許可することです。ただし、SSH経由でスクリプトを実行すると接続が失われ、VMを再起動する必要があります。私のスクリプトに問題がありますか?

#!/bin/bash
iptables -F

#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT

#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT

#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT

#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT

#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP

答え1

あなたの#SSHルールは、sshが一方向の通信形式であることを示唆していますが、そうではありません。データが送信されていますそして退いてください。

クライアントのポート番号を事前に知ることができないため、これを処理する一般的な方法は、考慮される接続を許可することです。「確立された」または「関連する」確立された接続で。これを行うには、次のものが必要です。

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

DROPルールの前(ルールは順番に処理され、これら2つのルールはほとんどのパケットに適用されるため、一番上にあることをお勧めします)。

TCP接続がどのようにESTABLISHEDされるかについての説明ここ;デフォルトでは、サーバーがルールで許可されているパケットで応答するという事実が#SSH INPUTこれを可能にします。

答え2

出力チェーンは以下を担当します。どのパケットが出ます。

スクリプトは、アウトバウンドパケットがトンネルインターフェイス、localhost、および123.123.123.123のリモートホストにのみ送信されることを許可します。

上記の宛先の1つ以外の宛先にパケットを送信するためにSSHデーモンが必要な方法でサーバーに接続すると、トラフィックは許可されません。

SSHデーモンからSSHクライアントへのアウトバウンドパケットを許可するには、次の規則を追加する必要があります。

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

単一の場所でのみ接続する場合は、上記のルールに宛先 IP 基準を追加する必要があります。このルールは、出力チェーンの最後の「他のアイテムを削除する」ルールの前に表示する必要があります。

関連情報