私はラズベリーパイ用のファイアウォールを作ろうとしています。私が望むルールは
SSHの受信を許可する - これは機能します
送信sshを許可する - これは機能せず、私の主な問題です
- 受信および送信 VNC を許可 - 現在、接続はできるものの、何も操作できないという状況で、これは半分機能しています。あまり優先事項ではありません。
- 発信 https を許可 - Web サイトにアクセスできますが、起動時に正しく機能させるには DNS に別の行を追加する必要があると思います。
- 送信メールを許可する - これは機能します
- 送信pingを許可して応答を得る - これは機能します
- その他すべてをドロップします - 送信 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 22
RELATED
udp
icmp