- 2010-08-09 (Mon) 10:51
- Debian 5.0(Lenny)の設定 ( IPTABLES )
対象サーバについて
| 製品名 | OpenBlockS 600 |
| OS(kernel ver) | Debian lenny(2.6.29) |
| CPU | 600MHz(AMCC PowerPC 405EX) |
| メモリ | 1GB(DDR2 SDRAM) |
| ストレージ | 8GB(Compact Flash) |
※上記は検証で利用したサーバであり、本WebサイトについてはさくらのVPS
で運用中です。
インストール状態確認
# aptitude search iptables i iptables - administration tools for packet filtering
→インストール済みであることを確認。
ルールのクリアを実施
# iptables -F FATAL: Could not open 'kernel/net/ipv4/netfilter/ip_tables.ko.gz': No such file or directory iptables v1.4.2: can't initialize iptables table `filter': iptables who? (do you need to insmod?) Perhaps iptables or your kernel needs to be upgraded.
→エラーが発生している。一か八かdepmodを実施してみます。
# depmod -a # # iptables -F ip_tables: (C) 2000-2006 Netfilter Core Team # # iptables -L 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
→回復しました。
起動設定
編集するファイル:/etc/network/interfaces
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 172.0.0.2
netmask 255.255.255.0
gateway 172.0.0.1
pre-up /etc/network/if-pre-up.d/iptables-up
post-down /etc/network/if-post-down.d/iptables-down
pre-upとpost-downから始まる行を追加します。
/etc/network/if-pre-up.d/にスクリプトを入れておくと、IF起動前に適用されます。
また、/etc/network/if-post-down.d/にスクリプトを入れておくと、IF停止後に適用されます。
つまり、上記設定により、IFが上がっている時は常にIPTABLESが有効になっていることになります。
IF起動直前にIPTABLESを実行するスクリプトの作成
作成したファイル:/etc/network/if-pre-up.d/iptables-up
#!/bin/bash
# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
# /etc/sysctl.confからnet.ipv4.tcp_syncookiesが含まれる行を削除する。
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
# /etc/sysctl.confにnet.ipv4.tcp_syncookies=1を追加する。
# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
# デフォルトでnet.ipv4.icmp_echo_ignore_broadcasts=1 のため不要
# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done
# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done
# インタフェース名定義
LAN=eth0
# 内部ネットワーク
LOCALNET="192.168.0.0/255.255.255.0"
# フィルタリングルールの削除
iptables -F INPUT || echo "1"
iptables -F OUTPUT || echo "2"
iptables -F FORWARD || echo "3"
iptables -F || echo "4"
iptables -X || echo "5"
# カウンターのリセット
iptables -Z || echo "6"
# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
iptables -P INPUT DROP || echo "7"
iptables -P OUTPUT ACCEPT || echo "8"
iptables -P FORWARD DROP || echo "9"
# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT || echo "10"
# 内部からのアクセスをすべて許可
iptables -A INPUT -s $LOCALNET -j ACCEPT || echo "11"
# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT || echo "12"
# フラグメント化されたパケットはログを記録して破棄
# -fオプションを付けると断片化されたパケットのみに規則を適用
# デフォルトではlog-level=warnにて出力
# /var/log/messages,syslog,kern.logに出力されるとサイズが大きくなるため
# kern.debugにしてファイルを分ける。
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : ' --log-level=debug || echo "13"
iptables -A INPUT -f -j DROP || echo "14"
# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -s ! $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP || echo "15"
iptables -A INPUT -s ! $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP || echo "16"
iptables -A OUTPUT -d ! $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP || echo "17"
iptables -A OUTPUT -d ! $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP || echo "18"
# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
# iptableが効いているかを試験する場合はLOCALNETからのINBOUND通信を許可する前に本設定を入れる。
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT || echo "19"
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : ' --log-level=debug || echo "20"
iptables -A LOG_PINGDEATH -j DROP || echo "21"
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH || echo "22"
iptables -A INPUT -p icmp --icmp-type echo-reply -j LOG_PINGDEATH || echo "22"
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j LOG_PINGDEATH || echo "22"
iptables -A INPUT -p icmp --icmp-type time-exceeded -j LOG_PINGDEATH || echo "22"
# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -d 255.255.255.255 -j DROP || echo "23"
iptables -A INPUT -d 224.0.0.1 -j DROP || echo "24"
# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset || echo "25"
# それ以外のIPアドレスからは基本許可
# ただし1分間に20パケット以上特定のIPアドレスから来た場合は以降5パケットしか受け付けない(4分間通信が無ければ20パケット受け付けられる閾値まで回復する)
iptables -A INPUT -p tcp --dport 53 -m hashlimit --hashlimit-name t_dns --hashlimit 5/minute --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j LOG --log-prefix '[IPTABLES_TCP_DNS_DROP] : ' --log-level=debug
iptables -A INPUT -p tcp --dport 53 -j DROP
iptables -A INPUT -p udp --dport 53 -m hashlimit --hashlimit-name t_dns --hashlimit 5/minute --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j LOG --log-prefix '[IPTABLES_UDP_DNS_DROP] : ' --log-level=debug
iptables -A INPUT -p udp --dport 53 -j DROP
# 外部からのTCP25番ポート(SMTP)へのアクセスを許可
iptables -A INPUT -p tcp --dport 25 -j LOG --log-prefix '[IPTABLES_MAIL_ACCEPT] : ' --log-level=debug
iptables -A INPUT -p tcp --dport 25 -j DROP
# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/etc/network/if-pre-up.d/deny_ipに1行ごとに記述しておくこと
# (/etc/network/if-pre-up.d/deny_ipがなければなにもしない)
# -Iなので、INPUTチェインの一番上に挿入される
if [ -s /etc/network/if-pre-up.d/deny_ip ]; then
for ip in `cat /etc/network/if-pre-up.d/deny_ip`
do
iptables -I INPUT -s $ip -j DROP
done
fi
# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : ' --log-level=debug || echo "26"
iptables -A INPUT -j DROP || echo "27"
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : ' --log-level=debug || echo "28"
iptables -A FORWARD -j DROP || echo "29"
※「|| echo "数字"」についてはうまく動かない時の切り分け用です。
実行権限の付与
# chmod 755 /etc/network/if-pre-up.d/iptables-up
IF閉塞直後にIPTABLESを初期化するスクリプトの作成
作成したファイル:/etc/network/if-post-down.d/iptables-down
#!/bin/sh # 基本設定 # (全てのパケットを通す) iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # 初期化 iptables -F iptables -Z iptables -X
実行権限の付与
# chmod 755 /etc/network/if-post-down.d/iptables-down
・IPTablesの実行
# /etc/network/if-pre-up.d/iptables-up
#
# iptables -nL -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
30 2740 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
911 52760 ACCEPT all -- * * 192.168.0.0/24 0.0.0.0/0
329 69179 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 LOG all -f * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 7 prefix `[IPTABLES FRAGMENT] : '
0 0 DROP all -f * * 0.0.0.0/0 0.0.0.0/0
0 0 DROP tcp -- * * !192.168.0.0/24 0.0.0.0/0 multiport dports 135,137,138,139,445
0 0 DROP udp -- * * !192.168.0.0/24 0.0.0.0/0 multiport dports 135,137,138,139,445
0 0 LOG_PINGDEATH icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8
0 0 LOG_PINGDEATH icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 0
0 0 LOG_PINGDEATH icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 3
0 0 LOG_PINGDEATH icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 11
0 0 DROP all -- * * 0.0.0.0/0 255.255.255.255
0 0 DROP all -- * * 0.0.0.0/0 224.0.0.1
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:113 reject-with tcp-reset
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 limit: up to 5/min burst 20 mode srcip htable-expire 120000
0 0 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 LOG flags 0 level 7 prefix `[IPTABLES_TCP_DNS_DROP] : '
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
1 69 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 limit: up to 5/min burst 20 mode srcip htable-expire 120000
0 0 LOG udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 LOG flags 0 level 7 prefix `[IPTABLES_UDP_DNS_DROP] : '
0 0 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 LOG flags 0 level 7 prefix `[IPTABLES_MAIL_ACCEPT] : '
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 5 LOG flags 0 level 7 prefix `[IPTABLES INPUT] : '
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 5 LOG flags 0 level 7 prefix `[IPTABLES FORWARD] : '
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 1464 packets, 761K bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- * * 0.0.0.0/0 !192.168.0.0/24 multiport sports 135,137,138,139,445
0 0 DROP udp -- * * 0.0.0.0/0 !192.168.0.0/24 multiport sports 135,137,138,139,445
Chain LOG_PINGDEATH (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 4
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 7 prefix `[IPTABLES PINGDEATH] : '
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
→想定通りの結果が得られていることを確認します。
ULOGについて
"-j LOG" を使用した場合は上記設定だけでsyslogにアクセスログを吐き始めます。
ただし、web上でも見たい場合(IPTable log analyzerを使用する場合)はmysqlに吐き出す必要があり、その場合は"-j ULOG" を使用します。
設定方法についてはIPTable log analyzerにまとめています。