対象サーバについて
製品名 | OpenBlockS 600 |
OS(kernel ver) | Debian lenny(2.6.29) |
CPU | 600MHz(AMCC PowerPC 405EX) |
メモリ | 1GB(DDR2 SDRAM) |
ストレージ | 8GB(Compact Flash) |
インストール状態確認
# 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にまとめています。