着信SSH接続を許可するIPTablesルール


11

このスクリプトの目的は、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

回答:


10

出力チェーンは、発信されるすべてのパケットに対して責任があります

このスクリプトでは、送信パケットがトンネルインターフェイス、ローカルホスト、およびリモートホスト123.123.123.123にのみ許可されます。

SSHデーモンが上記以外の宛先にパケットを送信する必要がある方法でサーバーに接続している場合、トラフィックの送信は許可されません。

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

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

1つの場所からのみ接続する場合は、上記のルールに宛先IP基準を追加することもできます。このルールは、出力チェーンの最終的な「その他をすべて削除する」ルールの前に置く必要があります。


+1これは機能し、確立された関連ルールを使用するよりも具体的です(コンテキストに応じて多かれ少なかれ有用になります)。
goldilocks 2014年

両方の素晴らしい答え、私は多くを学びました!私は@SkyDanの回答をテストしましたが、うまくいきます!
Steven

Nitpick:出力チェーンは、転送されたパケットを担当しません。
ビョルンLindqvist

13

あなたの#SSH規則は、sshが一方向の通信形式であることを意味しますが、そうではありません。データが遣わしされているバック。

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

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

DROPルールの前(ルールが順番に処理され、これら2つがほとんどのパケットに適用されるため、できれば上部)。

ここでは、TCP接続がどのように確立されるかについての説明があります。基本的に、サーバーが#SSH INPUTルールによって許可されたパケットに応答するという事実は、そのようにします。


1
これは機能しません。設立手段パケットの両方特定のTCP接続のための方向性は見られています。このルールのみを追加した場合、最初の送信パケットは引き続きブロックされます。
hellodanylo 14年

2
@SkyDanこれがそのリファレンスです。図で、サーバーが開始synを受信した後にクライアントにsyn / ackを送信すると、接続が確立されることを意味します。つまり、iptablesはその応答パケットを通過させます。「1つのパケット(SYN)が見つかると、接続はNEWです。戻りパケット(SYN / ACK)が見つかると、接続はESTABLISHEDと見なされます。->再度:iptables サーバーが送信したい返信パケットを確認し、接続を確立済みに設定し、返信を通過させます。
goldilocks 2014年

1
わかりました。なぜ機能するのでしょうか。iptablesの男は双方向のパケットの表示についてのみ話し、TCPハンドシェイクパケットが例外であることについての言葉ではないため、少しあいまいです。参照していただきありがとうございます!
hellodanylo 2014年

2
@SkyDan実際、このロジックはtcpにのみ適用されるわけではありません。-p tcpこの意味で違いを生むのは間違いでした。そのページのUDPに関する後続の説明を見てください(同じです)。ポイントは、iptablesが許可するかどうかを知らずにサーバーが応答することです。ローカルシステム上のサーバーからiptablesがその応答を受信する(クライアントがまだ許可していない場合でも)双方向のトラフィックを確認します。接続が確立され、応答が送信されます。ここでの「技術」は、ファイアウォールが2つのパーティの中間にあることかかっています。
goldilocks 2014年

1
あなたは正しいです。おそらく誰かがこの情報をiptablesの人に含めるべきでしょう。
hellodanylo 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.