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