16 January 2008

iptables(ファイアウォール)の設定 on Fedora 8

Fedoraメニュー → システム → ファイヤウォール (system-config-firewall)で設定できるiptablesのルールはごく一部なので、とりあえず設定ファイルをシンプルに書き換えておくこととする。

system-config-firewall で自動設定された iptables の設定ファイル

/etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT

かなり見にくい設定ファイルだ。

iptables を再設定するスクリプトを作成し、実行する

~/setup_iptables.sh
#! /bin/sh # iptables reset /sbin/iptables -F /sbin/iptables -X # default rule /sbin/iptables -P INPUT DROP /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -P FORWARD DROP # loopback /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A OUTPUT -o lo -j ACCEPT # established /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ICMP /sbin/iptables -A INPUT -p icmp --icmp-type any -j ACCEPT # http, https /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT # ftp /sbin/iptables -A INPUT -p tcp --dport 20 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT # ssh /sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT # samba /sbin/iptables -A INPUT -p udp --dport 137 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 138 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 139 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 445 -j ACCEPT # webmin /sbin/iptables -A INPUT -p tcp --dport 10000 -j ACCEPT # swat /sbin/iptables -A INPUT -p tcp --dport 901 -j ACCEPT # CUPS /sbin/iptables -A INPUT -p tcp --dport 631 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 631 -j ACCEPT # mDNS #/sbin/iptables -A INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT # ICMP reject /sbin/iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

このスクリプトを実行した後、iptablesの設定ファイルを書き出す

[root@localhost ~]# /sbin/iptables-save > /etc/sysconfig/iptables

書き出された設定ファイルを少し修正して、最終形とする

/etc/sysconfig/iptables
# Generated by iptables-save *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p udp -m udp --dport 137 -j ACCEPT -A INPUT -p udp -m udp --dport 138 -j ACCEPT -A INPUT -p tcp -m tcp --dport 139 -j ACCEPT -A INPUT -p tcp -m tcp --dport 445 -j ACCEPT -A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT -A INPUT -p tcp -m tcp --dport 901 -j ACCEPT -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT -A INPUT -p udp -m udp --dport 631 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed

これを基に、ルールを充実させていけばOK。

iptablesの書式は、JM Project の IPTABLES man page に詳しく書かれている。

参考資料 : @IT 「習うより慣れろ! iptablesテンプレート集」

設定ファイルの書式について、このブログに読み解き方が書かれている


iptablesのログを別ファイルに変更する

iptablesのログはカーネルログなので、/var/log/messages に出力されている。メッセージのプライオリティ設定をdebugと強制指定して、debugログのみを別ファイルに記録する設定にする。

rsyslogd の設定

/etc/rsyslog.conf
# for iptables log kern.=debug /var/log/messages-debug # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages

空のログファイルを作成する

[root@localhost ~]# cd /var/log [root@localhost log]# touch messages-debug [root@localhost log]# chmod 600 messages-debug

iptablesのルールを修正する

~/setup_iptables.sh
# SYN-FLOODING block 例えば、SYN-FLOODの検出とログ取りを行う例 /sbin/iptables -N syn-flood /sbin/iptables -A INPUT -p tcp --syn -j syn-flood /sbin/iptables -A syn-flood -m limit --limit 10/s --limit-burst 4 -j RETURN /sbin/iptables -A syn-flood -j LOG --log-level debug --log-prefix "iptables(syn-flood):" /sbin/iptables -A syn-flood -j DROP

ログ・ローテーション設定ファイルを修正する

/etc/logrotate.d/rsyslog
/var/log/messages /var/log/messages-debug /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron { sharedscripts postrotate /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true endscript }

httpsを(ルータ・NAT・ファイアウォールを通して)公開しているサーバで、とりあえず初期設定として動かしている設定

~/setup_iptables.sh
#! /bin/sh # iptables reset /sbin/iptables -F /sbin/iptables -X # default rule /sbin/iptables -P INPUT DROP /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -P FORWARD DROP # loopback /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A OUTPUT -o lo -j ACCEPT # broadcast outgoing /sbin/iptables -A OUTPUT -p tcp --dest 255.255.255.255 -j ACCEPT /sbin/iptables -A OUTPUT -p udp --dest 255.255.255.255 -j ACCEPT # IP Spoofing block /sbin/iptables -N ip-spoofing /sbin/iptables -A INPUT --src 10.0.0.0/8 -j ip-spoofing /sbin/iptables -A INPUT --src 176.16.0.0/12 -j ip-spoofing /sbin/iptables -A ip-spoofing -j LOG --log-level debug --log-prefix "iptables(ip-spoofing) :" /sbin/iptables -A ip-spoofing -j DROP # SYN-FLOODING block /sbin/iptables -N syn-flood /sbin/iptables -A INPUT -p tcp --syn -j syn-flood /sbin/iptables -A syn-flood -m limit --limit 10/s --limit-burst 4 -j RETURN /sbin/iptables -A syn-flood -j LOG --log-level debug --log-prefix "iptables(syn-flood):" /sbin/iptables -A syn-flood -j DROP # ping-of-death block /sbin/iptables -N ping-death /sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j ping-death /sbin/iptables -A ping-death -m limit --limit 2/s --limit-burst 4 -j RETURN /sbin/iptables -A ping-death -j LOG --log-level debug --log-prefix "iptables(ping-death):" /sbin/iptables -A ping-death -j DROP # port scan block /sbin/iptables -N port-scan /sbin/iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j port-scan /sbin/iptables -A port-scan -m limit --limit 1/s --limit-burst 4 -j RETURN /sbin/iptables -A port-scan -j LOG --log-level debug --log-prefix "iptables(pot-scan):" /sbin/iptables -A port-scan -j DROP # ICMP /sbin/iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT /sbin/iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT /sbin/iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT /sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT /sbin/iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT /sbin/iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT /sbin/iptables -A INPUT -p icmp -j LOG --log-level debug --log-prefix "iptables(icmp-drop) :" /sbin/iptables -A INPUT -p icmp -j DROP # http, https /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT # established /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ftp /sbin/iptables -A INPUT -p tcp --dport 20 --src 192.168.1.0/24 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 21 --src 192.168.1.0/24 -j ACCEPT # ssh /sbin/iptables -A INPUT -p tcp --dport 22 --src 192.168.1.0/24 -j ACCEPT # samba /sbin/iptables -A INPUT -p udp --dport 137 --src 192.168.1.0/24 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 138 --src 192.168.1.0/24 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 139 --src 192.168.1.0/24 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 445 --src 192.168.1.0/24 -j ACCEPT # samba otgoing wan may be stopped /sbin/iptables -A OUTPUT -p udp --dport 137 --dst 192.168.1.0/24 -j ACCEPT /sbin/iptables -A OUTPUT -p udp --dport 138 --dst 192.168.1.0/24 -j ACCEPT /sbin/iptables -A OUTPUT -p tcp --dport 139 --dst 192.168.1.0/24 -j ACCEPT /sbin/iptables -A OUTPUT -p tcp --dport 445 --dst 192.168.1.0/24 -j ACCEPT /sbin/iptables -A OUTPUT -p udp --dport 137 --dst 0.0.0.0/0 -j DROP /sbin/iptables -A OUTPUT -p udp --dport 138 --dst 0.0.0.0/0 -j DROP /sbin/iptables -A OUTPUT -p tcp --dport 139 --dst 0.0.0.0/0 -j DROP /sbin/iptables -A OUTPUT -p tcp --dport 445 --dst 0.0.0.0/0 -j DROP # webmin /sbin/iptables -A INPUT -p tcp --dport 10000 --src 192.168.1.0/24 -j ACCEPT # swat /sbin/iptables -A INPUT -p tcp --dport 901 --src 192.168.1.0/24 -j ACCEPT # CUPS #/sbin/iptables -A INPUT -p tcp --dport 631 --src 192.168.1.0/24 -j ACCEPT #/sbin/iptables -A INPUT -p udp --dport 631 --src 192.168.1.0/24 -j ACCEPT # mDNS #/sbin/iptables -A INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT # ICMP reject /sbin/iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited