
このスクリプトの目的は、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 基準を追加する必要があります。このルールは、出力チェーンの最後の「他のアイテムを削除する」ルールの前に表示する必要があります。