Linux は Netfilter と呼ばれる強力なパケットフィルタリング機能を持っています。
2.4.x 以降のカーネルで実装された Netfilter コンポーネントは iptables コマンドを操作することができます。
ここではこの iptables を使ってファイアーウォールを構築する方法を紹介します。
iptables の初期化
まずはじめにルールを全て削除します。全ての既存のチェーンをフラッシュし、ユーザーチェーンも削除します。
/sbin/iptables -X
デフォルトのポリシーを設定します。
サーバーから出て行くパケット(OUTPUT チェーン)は全て許可します。
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP
カーネルパラメーターの設定
カーネルのセキュリティーを強化するためにカーネルパラメーターを設定します。
IP フォワーディングを無効にします。
ICMP メッセージを載せた IP のパケットには多くの情報が含まれているので ping パケットを無視するように設定します。
PING を実行を許可したい場合は設定しないでください。
ICMP ブロードキャストへのレスポンスを無効にして Smurf アタックを防ぐためにブロードキャスト ping を無視するように設定します。
ソースルーティングされたパケットを無効にします。
ICMP リダイレクトパケットを受信を無効にします。
echo “0” > /proc/sys/net/ipv4/conf/all/secure_redirects
ボーガス(偽物の)エラーメッセージへのレスポンスをしないように設定します。
IP の偽造を防ぐためにリバースパスフィルタリングを有効にします。
echo “1” > $i
done
偽装やソースルーティング、リダイレクトされたパケットをログに記録します。
TCP SYN Flood 攻撃を防ぐために SYN クッキーを有効にします。
接続拒否ホストの設定
接続を拒否したいホストのリストはスクリプトの変数として記述します。
xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx
“
接続を拒否したいホストからのパケットはログに記録して破棄します。
for host in $DENY_HOST
do
/sbin/iptables -A deny_host -s $host -j LOG –log-prefix “iptables[deny_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A deny_host -s $host -j DROP
/sbin/iptables -A deny_host -d $host -j LOG –log-prefix “iptables[deny_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A deny_host -d $host -j DROP
done
日本以外の指定した国のアクセスを拒否
セキュリティー設定の甘い中国や韓国、台湾のサーバーは SPAM の踏み台にいる場合が多いようです。
これらの国からのアクセスが不要な場合はアクセスを遮断することができます。
これにはアジアや太平洋地域の各国の NIC やインターネットサービスプロバイダへの IP アドレスの割り当てを行なう機関である APNIC のサイトで公開されているアジア諸国の IP アドレスのリストを使用ます。
以下のコマンドを実行することでそのリストを取得することができます。
入手したリストに使って iptables の設定を行います。
while read line; do
/sbin/iptables -A abroad_filter -s $line -j LOG –log-prefix “iptables[abroad_filter]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A abroad_filter -s $line -j DROP
done < /usr/local/etc/delegated-apnic-latest
特定の IP アドレスを拒否
RFC で定義されているプライベートネットワークや制限されているアドレス空間、IANA によって予約されているアドレスブロックからのアクセスを拒否します。
このサイトの場合、プライベートアドレスとして 192.168.0.0/16 を使用しているのでその部分はコメントアウトします。
/sbin/iptables -A undesirable_host -s 10.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 10.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -s 172.16.0.0/12 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 172.16.0.0/12 -j DROP
#/sbin/iptables -A undesirable_host -s 192.168.0.0/16 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
#/sbin/iptables -A undesirable_host -s 192.168.0.0/16 -j DROP
/sbin/iptables -A undesirable_host -s 0.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 0.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -s 14.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 14.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -s 127.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 127.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -s 240.0.0.0/4 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 240.0.0.0/4 -j DROP
/sbin/iptables -A undesirable_host -s 39.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 39.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -s 128.0.0.0/16 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 128.0.0.0/16 -j DROP
/sbin/iptables -A undesirable_host -s 191.255.0.0/16 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 191.255.0.0/16 -j DROP
/sbin/iptables -A undesirable_host -s 192.0.0.0/24 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 192.0.0.0/24 -j DROP
/sbin/iptables -A undesirable_host -s 223.255.255.0/24 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 223.255.255.0/24 -j DROP
/sbin/iptables -A undesirable_host -s 24.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 24.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -s 169.254.0.0/16 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 169.254.0.0/16 -j DROP
/sbin/iptables -A undesirable_host -s 192.0.2.0/24 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 192.0.2.0/24 -j DROP
/sbin/iptables -A undesirable_host -s 192.88.99.0/24 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 192.88.99.0/24 -j DROP
/sbin/iptables -A undesirable_host -s 198.18.0.0/15 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 198.18.0.0/15 -j DROP
/sbin/iptables -A undesirable_host -s 224.0.0.0/4 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -s 224.0.0.0/4 -j DROP
/sbin/iptables -A undesirable_host -d 10.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 10.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -d 172.16.0.0/12 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 172.16.0.0/12 -j DROP
#/sbin/iptables -A undesirable_host -d 192.168.0.0/16 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
#/sbin/iptables -A undesirable_host -d 192.168.0.0/16 -j DROP
/sbin/iptables -A undesirable_host -d 0.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 0.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -d 14.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 14.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -d 127.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 127.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -d 240.0.0.0/4 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 240.0.0.0/4 -j DROP
/sbin/iptables -A undesirable_host -d 39.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 39.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -d 128.0.0.0/16 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 128.0.0.0/16 -j DROP
/sbin/iptables -A undesirable_host -d 191.255.0.0/16 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 191.255.0.0/16 -j DROP
/sbin/iptables -A undesirable_host -d 192.0.0.0/24 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 192.0.0.0/24 -j DROP
/sbin/iptables -A undesirable_host -d 223.255.255.0/24 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 223.255.255.0/24 -j DROP
/sbin/iptables -A undesirable_host -d 24.0.0.0/8 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 24.0.0.0/8 -j DROP
/sbin/iptables -A undesirable_host -d 169.254.0.0/16 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 169.254.0.0/16 -j DROP
/sbin/iptables -A undesirable_host -d 192.0.2.0/24 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 192.0.2.0/24 -j DROP
/sbin/iptables -A undesirable_host -d 192.88.99.0/24 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 192.88.99.0/24 -j DROP
/sbin/iptables -A undesirable_host -d 198.18.0.0/15 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 198.18.0.0/15 -j DROP
/sbin/iptables -A undesirable_host -d 224.0.0.0/4 -j LOG –log-prefix “iptables[undesirable_host]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A undesirable_host -d 224.0.0.0/4 -j DROP
ブロードキャストパケットを拒否します。
/sbin/iptables -A broad_cast -d 255.255.255.255 -j LOG –log-prefix “iptables[broad_cast]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A broad_cast -d 255.255.255.255 -j DROP
/sbin/iptables -A broad_cast -d 244.0.0.1 -j LOG –log-prefix “iptables[broad_cast]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A broad_cast -d 244.0.0.1 -j DROP
ポートスキャン検知
ポートスキャンを検知するために、無効な TCP フラグの組み合わせを持つパケットを拒否します。
/sbin/iptables -A check_flags -p tcp –tcp-flags ACK,FIN FIN -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags ACK,FIN FIN -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags ACK,PSH PSH -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags ACK,PSH PSH -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags ACK,URG URG -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags ACK,URG URG -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags FIN,RST FIN,RST -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags FIN,RST FIN,RST -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags SYN,FIN SYN,FIN -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags SYN,RST SYN,RST -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags SYN,RST SYN,RST -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL ALL -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL ALL -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL NONE -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL NONE -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL FIN,PSH,URG -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL FIN,PSH,URG -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL SYN,FIN,PSH,URG -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL SYN,FIN,PSH,URG -j DROP
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG –log-prefix “iptables[check_flags]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A check_flags -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
INPUT チェーンの定義
ループバックインターフェイスの通信を許可します。
Windows の DCE RPC、NetBIOS、Direct Hosting SMB パケットを破棄します。
/sbin/iptables -A INPUT -p udp -m multiport –sports 135,137,138,139,445 -j DROP
/sbin/iptables -A INPUT -p tcp -m multiport –dports 135,137,138,139,445 -j DROP
/sbin/iptables -A INPUT -p udp -m multiport –dports 135,137,138,139,445 -j DROP
deny_host チェーンを設定します。
abroad_filter チェーンを設定します。
undesirable_host チェーンを設定します。
無効な接続状態のパケットを拒否します。
check_flags チェーンを設定します。
パケットが確立済みの接続や関連接続属している場合は通信を許可します。
Web サーバーの接続を許可します。
/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 443 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 8080 -j ACCEPT
メールサーバーの接続を許可します。
/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 110 -j ACCEPT
SSH サーバーの接続を許可します。
ネームサーバーの接続を許可します。
/sbin/iptables -A INPUT -p udp –dport 53 -j ACCEPT
FTP サーバーの接続を許可します。
/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 65500:65535 -j ACCEPT
AUTH サービス用のパケットを拒否します。
ルールに適用されなかったパケットはログに記録して破棄します。
/sbin/iptables -A INPUT -j DROP
ファイアーウォールスクリプトのダウンロード » firewall.sh
ファイアーウォールのメンテナンス
APNIC のサイトから入手したリストは頻繁に更新されているようなので、cron を使って定期的に取得します。
また取得した後は最新のリストを反映するためにファイアーウォールスクリプトを実行します。
wget -q -O – http://ftp.apnic.net/stats/apnic/delegated-apnic-latest | grep ‘^apnic|CN|ipv4\|^apnic|KR|ipv4\|^apnic|TW|ipv4’ | awk ‘BEGIN { FS = “|”; OFMT = “%d”; for (i = 0; i < 32; i++) { pow[32 - i] = 2 ^ i } } { for (j in pow) { if ($5 == pow[j]) print $4 "/" j } }' > /usr/local/etc/delegated-apnic-latest最新のリストを取得
sh /usr/local/etc/firewall.shファイアーウォールスクリプトを実行
cron 実行スクリプトのダウンロード » abroad_filter.cron