[Debian]iptables設定

2011/05/31

ここのページを参考に、Debian で iptables を設定。

この設定は手作業なので間違えると最悪の場合、サーバにアクセスでくなくなるので慎重に行う。 (さくらVPSなどのサーバはコントロールパネルのコンソールで復帰できますが・・・)

下準備

まずは送信全般と、icmp、loの受信を許可し、FORWARDは捨てます。

# iptables -P INPUT ACCEPT # iptables -P FORWARD DROP # iptables -P OUTPUT ACCEPT # iptables -F # iptables -A INPUT -p icmp -j ACCEPT # iptables -A INPUT -i lo -j ACCEPT

ここで状況確認。

# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

次に必要な受信ポートを許可。 例)ssh、http、https、smtpの標準ポート

# iptables -A INPUT -p tcp --dport 22 -j ACCEPT # iptables -A INPUT -p tcp --dport 80 -j ACCEPT # iptables -A INPUT -p tcp --dport 443 -j ACCEPT # iptables -A INPUT -p tcp --dport 25 -j ACCEPT

一度確定したポートは許可して、残りは捨てる。

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -P INPUT DROP

一番最後の一発がドキドキです。

で、この状態では再起動すると消えてしまうので起動時に有効にする必要あり。 Debian だと/etc/init.d/iptables がいつからかなくなったらしいので自分で作成します。

iptablesスクリプト

下記のスクリプトを利用しなくても、手入力で打ったコマンドをシェルスクリプト化して 起動してやっても良いのですが、先のページを参考に使ってみた。

iptables コマンドの引数によって処理をわけて、具体的にはiptables-restore、iptables-save 、 /etc/iptables.save の3ファイルを使って設定を入れ替えてる感じです。

#!/bin/bash start(){ iptables -F iptables-restore < /etc/iptables.save return 0 } stop(){ iptables-save > /etc/iptables.save return 0 } case "$1" in start) start ;; stop) stop ;; save) stop ;; restore) start ;; restart) stop start ;; esac

あとは実行権限を与えて

# chmod 755 /etc/init.d/iptables

ランレベルを指定して自動起動を設定。

# update-rc.d iptables defaults 18 Adding system startup for /etc/init.d/iptables ... /etc/rc0.d/K18iptables -> ../init.d/iptables /etc/rc1.d/K18iptables -> ../init.d/iptables /etc/rc6.d/K18iptables -> ../init.d/iptables /etc/rc2.d/S18iptables -> ../init.d/iptables /etc/rc3.d/S18iptables -> ../init.d/iptables /etc/rc4.d/S18iptables -> ../init.d/iptables /etc/rc5.d/S18iptables -> ../init.d/iptables

最後にスクリプトでiptables 設定保存。

# /etc/init.d/iptables save

設定結果

# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:www ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:smtp ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination