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