ServersMan@VPS iptablesを設定する

サーバー構築

ServersMan@VPSはインターネットから到達可能なポートに制限がありません。
逆に言うと仮想OSは丸裸同然でインターネットに公開されていることになります。
これは色々とまずいです。
ファイアウォールやルータなどフィルタリングしてくれる機器がないとなると自分で何とかしなければなりません。
Linuxであればローカルファイアウォールとしてiptablesというものがありますので、活用したいと思います。

最初は何もルールが登録されていません。

[root@dti-vps-srv20 ~]# /sbin/iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

必要に応じてルールを追加していきます。
外部に公開するサーバであればINPUTに制限をかける必要があります。
・localhostからの通信は全て許可
・プライベートIPアドレスからの通信は拒否し、ログを取得する
・SSHは特定のIPアドレスからのみ許可
・SMTPとHTTPとHTTPSを許可
・ICMPは特定のIPアドレスからのみ許可
・上記ルールに一致しないものは全てログを取得する

# /sbin/iptables -A INPUT -i lo -j ACCEPT
# /sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# /sbin/iptables -A INPUT -s 10.0.0.0/8 -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Spoofed_source_IP):"
# /sbin/iptables -A INPUT -s 10.0.0.0/8 -j DROP
# /sbin/iptables -A INPUT -s 172.16.0.0/12 -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Spoofed_source_IP):"
# /sbin/iptables -A INPUT -s 172.16.0.0/12 -j DROP
# /sbin/iptables -A INPUT -s 192.168.0.0/16 -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Spoofed_source_IP):"
# /sbin/iptables -A INPUT -s 192.168.0.0/16 -j DROP
# /sbin/iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
# /sbin/iptables -A INPUT -p tcp -m tcp --dport 25 -m state --state NEW -j ACCEPT
# /sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
# /sbin/iptables -A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
# /sbin/iptables -A INPUT -s xxx.xxx.xxx.xxx -p icmp -m icmp --icmp-type 8 -j ACCEPT
# /sbin/iptables -A INPUT -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Default_INPUT):"

# /sbin/iptables -A FORWARD -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Default_FORWARD):"
# /sbin/iptables -P FORWARD DROP

まだルールに一致しない通信も許可されています。
最後にルールに一致しない通信を拒否するようにします。
※iptablesの設定が間違っていると一切通信ができなくなる可能性もあるので注意してください。

# /sbin/iptables -P INPUT DROP

最終的なiptablesの設定は下記のようになりました。

# /sbin/iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
LOG        all  --  10.0.0.0/8           0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Spoofed_source_IP):'
DROP       all  --  10.0.0.0/8           0.0.0.0/0
LOG        all  --  172.16.0.0/12        0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Spoofed_source_IP):'
DROP       all  --  172.16.0.0/12        0.0.0.0/0
LOG        all  --  192.168.0.0/16       0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Spoofed_source_IP):'
DROP       all  --  192.168.0.0/16       0.0.0.0/0
ACCEPT     tcp  --  xxx.xxx.xxx.xxx      0.0.0.0/0           tcp dpt:22 state NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25 state NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 state NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443 state NEW
ACCEPT     icmp --  xxx.xxx.xxx.xxx      0.0.0.0/0           icmp type 8
LOG        all  --  0.0.0.0/0            0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Default_INPUT):'

Chain FORWARD (policy DROP)
target     prot opt source               destination
LOG        all  --  0.0.0.0/0            0.0.0.0/0           limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Default_FORWARD):'

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

このままだとOS再起動でiptablesの設定が消えてしまうので保存します。

# /sbin/service iptables save
Saving firewall rules to /etc/sysconfig/iptables:          [  OK  ]

iptablesのログはkernelログとして出力されます。
2個所修正します。
/etc/syslog.conf

kern.*                                                  /var/log/kernel.log
*.info;mail.none;authpriv.none;cron.none,kern.none      /var/log/messages

ファイルを作成してからSYSLOGの設定変更を反映させます。

# touch /var/log/kernel.log
# chmod 600 /var/log/kernel.log
# kill -HUP syslogのプロセス

ログが出ているか確認します。
ロ、ログが出ません。。。
dmesgには出ているのでiptablesの設定は問題ないようです。
これについては次回Entryで。

# tail -f /var/log/kernel.log

# dmesg
DROPPED(Default_INPUT):IN=venet0 OUT= MAC= SRC=xxx.xxx.xxx.xxx DST=yyy.yyy.yyy.yyy LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=58637 DF PROTO=TCP SPT=39655 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0