IPtables の問題 - サポートをお願いします

IPtables の問題 - サポートをお願いします

私はラズベリーパイ用のファイアウォールを作ろうとしています。私が望むルールは

  1. SSHの受信を許可する - これは機能します

  2. 送信sshを許可する - これは機能せず、私の主な問題です

  3. 受信および送信 VNC を許可 - 現在、接続はできるものの、何も操作できないという状況で、これは半分機能しています。あまり優先事項ではありません。
  4. 発信 https を許可 - Web サイトにアクセスできますが、起動時に正しく機能させるには DNS に別の行を追加する必要があると思います。
  5. 送信メールを許可する - これは機能します
  6. 送信pingを許可して応答を得る - これは機能します
  7. その他すべてをドロップします - 送信 SSH ができないためにこれが機能すると推測しており、問題は私のルールにあると考えています。

ファイアウォールがロードされていなくても、1 つの Pi から別の Pi に SSH を送信できるため、SSH が一般的に機能することはわかっています。

    #!/bin/sh

    #Flush all rules
    iptables -F

    #Allow incoming and outgoing SSH
    sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A OUTPUT  -p tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

    #Allow VNC sessions
    sudo iptables -A INPUT -s 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -j ACCEPT
    sudo iptables -A OUTPUT -d 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --sports 5900:5905,6000:6005 -j ACCEPT

    #Accept only incoming etstablished and allow new or established outgoing
    sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    #Accept port 587 for email
    sudo iptables -A INPUT -p tcp --sport 587 -j ACCEPT
    sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

    #Allow ping requests to go out and get a reply
    sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

    #Drop all other packets and protocols
    sudo iptables -P INPUT DROP
    sudo iptables -P FORWARD DROP
    sudo iptables -P OUTPUT DROP

答え1

SSH ラインに関する問題は、ローカル マシンからの送信元ポートを許可しようとしていることです22。ただし、リモート SSH サーバーに接続する場合、マシンはポート 22 をこれに使用しません。通常は上位のポート範囲にあるランダムなポートを使用します。これは、送信 SSH 接続にポート 22 を使用すると、一度に 1 つの SSH サーバーにしか接続できないため、理にかなっています。

これを修正する最も簡単な方法は、--dportの代わりにを使用して--sport、宛先ポートが22(ssh) であるすべての接続を許可することです。

sudo iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

ご注意ください追加@bcs78 がコメントで指摘したように、この行を置き換えるのではなく、そのままにしておきます。

内部ループバック接続のトラフィックをブロックするのは一般的にはよくありません。一部のプログラムはこの接続に依存しており、この接続がないと正常に動作しません。スクリプトの先頭に以下を追加します。

sudo iptables -A INPUT -i lo -j ACCEPT

答え2

チェーンごとに1回、キャッチオールを追加するステートフル他のほとんどのルールを簡素化するルール:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

さらに、すべてのローカル サービスを許可する通常のloインターフェース ルールも追加します。本当に必要ないと思われる場合は削除してください。

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

これで、他のルールを複製する必要がなくなりました (NEWあまり役に立たず、一貫して存在していなかったとしても、存在していた状態はそのまま残します)。

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 10.10.10.1 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.0.150 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT

iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

最初の 2 つのルールですべてが処理されるので、すべてのルールを複製する必要はなく、フローの初期方向は明確です。INPUTまたは、 は 1 回だけです。そのため、SSH の が送信ケース (が必要)に役立たなかったOUTPUTことがより明確になります。関連するエラー応答のルールがあれば便利だったでしょう。この設定では、 は必要ないかもしれません。--sport 22--dport 22RELATEDudpicmp

関連情報