IPTABLESの基本設定

投稿者: | 2010年8月9日
Pocket

対象サーバについて

製品名 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にまとめています。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です