環境
- CentOS release 6.4 (Final)
- iptables.i686 1.4.7-9.el6
方針
以下の大原則に従う設定を作ることとする。
- 自ホストからの通信は通してやる。
- 外からのpingは通してやる。
- 外からのSSHは通してやる。
- それ以外の外からの通信は受け付けない。
- 外へ出ていく通信はすべて通す。
手順
まず、外からのすべての通信を受け付けないようにする。
外からの通信(INPUT, FORWARD)をすべてDROPする。そのあとで通すものを書いていくホワイトリスト方式とする。
中から外へ出ていく通信はすべて通してやる。
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
確立済みの通信は通してやる。
どこから来たのか、どのポート宛てなのか、は気にせず、すでに確立済みなら通してやる。要するに、これに続く記述で通信を確立させるかどうかを設定してやる。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
pingは通してやる。
プロトコルがICMPなら通してやる。
-A INPUT -p icmp -j ACCEPT
ループバックは通してやる。
自ホストからの通信は問答無用で全部通してやる。
-A INPUT -i lo -j ACCEPT
SSHは通してやる。
他ホストからSSH接続はするので、宛先が22番ポートなら通してやる。当然、SSH側のセキュリティ(パスワードログインさせないとか、rootログインさせないとか)はそちらで別途設定すること。
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
SSH以外のサービスのためのポートを開ける場合はこれを真似して追加していく。例えば、HTTP(80)ならこんな感じで。
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
全体はこんな感じで。
/etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
COMMIT
iptablesを再起動して設定を反映させる。
rootでね。
/etc/init.d/iptables restart