Iptablesルールを設定した後、インスタンスにアクセスできない

Iptablesルールを設定した後、インスタンスにアクセスできない

TCP (SSH および FTP) の 21 と 22 を除くすべてのポートをブロックするルールを設定しようとしています。しかし、このスクリプトを実行しようとすると、インスタンスからロックアウトされ、アクセスできなくなります。これがスクリプトです:

# Flush the FW Rules 
iptables -F
iptables -X

# Block all traffic
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Allow SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT

# Allow FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT

# Allow ICMP (ping)
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

スクリプトでは、SSH と FTP の受信要求と送信要求の両方を設定していますが、なぜアクセスできないのでしょうか?

答え1

  1. チェーン内のルールでは、宛先ポート ( ) ではなく、送信元ポートOUTPUTの一致 ( ) を指定する必要があります。--sport--dport
  2. とにかく、チェーンDROP内のポリシーはOUTPUT一般的な慣行ではありません。
  3. iptables チュートリアルとサンプルルールセットを読んでください。
  4. 接続が失われるのを避けるには、ツールiptables-saveをより適切に使用してくださいiptables-apply

答え2

状態追跡を設定し、-A OUTPUT ... -j ACCEPT行をなくす必要があります。

IPTABLES -I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
IPTABLES -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
IPTABLES -I OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

明示的な出力フィルタリングを使用しているのは良いことですが、実装するにはさらに作業が必要です。

関連情報