TOP » システム設定 » iptables でファイアーウォール構築

iptables でファイアーウォール構築

Linux は Netfilter と呼ばれる強力なパケットフィルタリング機能を持っています。
2.4.x 以降のカーネルで実装された Netfilter コンポーネントは iptables コマンドを操作することができます。
ここではこの iptables を使ってファイアーウォールを構築する方法を紹介します。

iptables の初期化

まずはじめにルールを全て削除します。全ての既存のチェーンをフラッシュし、ユーザーチェーンも削除します。

/sbin/iptables -F
/sbin/iptables -X

デフォルトのポリシーを設定します。
サーバーから出て行くパケット(OUTPUT チェーン)は全て許可します。

/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP

カーネルパラメーターの設定

カーネルのセキュリティーを強化するためにカーネルパラメーターを設定します。

IP フォワーディングを無効にします。

echo “0” > /proc/sys/net/ipv4/ip_forward

ICMP メッセージを載せた IP のパケットには多くの情報が含まれているので ping パケットを無視するように設定します。
PING を実行を許可したい場合は設定しないでください。

echo “1” > /proc/sys/net/ipv4/icmp_echo_ignore_all

ICMP ブロードキャストへのレスポンスを無効にして Smurf アタックを防ぐためにブロードキャスト ping を無視するように設定します。

echo “1” > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

ソースルーティングされたパケットを無効にします。

echo “0” > /proc/sys/net/ipv4/conf/all/accept_source_route

ICMP リダイレクトパケットを受信を無効にします。

echo “0” > /proc/sys/net/ipv4/conf/all/accept_redirects
echo “0” > /proc/sys/net/ipv4/conf/all/secure_redirects

ボーガス(偽物の)エラーメッセージへのレスポンスをしないように設定します。

echo “1” > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

IP の偽造を防ぐためにリバースパスフィルタリングを有効にします。

for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
  echo “1” > $i
done

偽装やソースルーティング、リダイレクトされたパケットをログに記録します。

echo “1” > /proc/sys/net/ipv4/conf/all/log_martians

TCP SYN Flood 攻撃を防ぐために SYN クッキーを有効にします。

echo “1” > /proc/sys/net/ipv4/tcp_syncookies

接続拒否ホストの設定

接続を拒否したいホストのリストはスクリプトの変数として記述します。

DENY_HOST=”
xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx

接続を拒否したいホストからのパケットはログに記録して破棄します。

/sbin/iptables -N deny_host
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 アドレスのリストを使用ます。
以下のコマンドを実行することでそのリストを取得することができます。

# 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

入手したリストに使って iptables の設定を行います。

/sbin/iptables -N abroad_filter
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 -N undesirable_host
/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 -N broad_cast
/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 -N check_flags
/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 チェーンの定義

ループバックインターフェイスの通信を許可します。

/sbin/iptables -A INPUT -i lo -j ACCEPT

Windows の DCE RPC、NetBIOS、Direct Hosting SMB パケットを破棄します。

/sbin/iptables -A INPUT -p tcp -m multiport –sports 135,137,138,139,445 -j DROP
/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 チェーンを設定します。

/sbin/iptables -A INPUT -j deny_host

abroad_filter チェーンを設定します。

/sbin/iptables -A INPUT -j abroad_filter

undesirable_host チェーンを設定します。

/sbin/iptables -A INPUT -j undesirable_host

無効な接続状態のパケットを拒否します。

/sbin/iptables -A INPUT -m state –state INVALID -j DROP

check_flags チェーンを設定します。

/sbin/iptables -A INPUT -j check_flags

パケットが確立済みの接続や関連接続属している場合は通信を許可します。

/sbin/iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

Web サーバーの接続を許可します。

/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 80  -j ACCEPT
/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 25 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 110 -j ACCEPT

SSH サーバーの接続を許可します。

/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 22  -j ACCEPT

ネームサーバーの接続を許可します。

/sbin/iptables -A INPUT -p tcp –dport 53 -j ACCEPT
/sbin/iptables -A INPUT -p udp –dport 53 -j ACCEPT

FTP サーバーの接続を許可します。

/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 21 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m state –state NEW –dport 65500:65535 -j ACCEPT

AUTH サービス用のパケットを拒否します。

/sbin/iptables -A INPUT -p tcp –dport 113 -j REJECT –reject-with tcp-reset

ルールに適用されなかったパケットはログに記録して破棄します。

/sbin/iptables -A INPUT -j LOG –log-prefix “iptables[drop]: ” –log-level debug -m limit –limit 5/second –limit-burst 10
/sbin/iptables -A INPUT -j DROP

ファイアーウォールスクリプトのダウンロード » firewall.sh

ファイアーウォールのメンテナンス

APNIC のサイトから入手したリストは頻繁に更新されているようなので、cron を使って定期的に取得します。
また取得した後は最新のリストを反映するためにファイアーウォールスクリプトを実行します。

# vi /etc/cron.daily/abroad_filter.cron
/etc/cron.daily/abroad_filter.cron
#!/bin/sh
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

カテゴリー
Fedora のインストール
ネットワーク設定
OpenSSH で SSH サーバー構築
NTP で時刻情報サーバー構築
Apache HTTP Server で Web サーバー構築
MySQL でデーターベースサーバー構築
PostgreSQL でデーターベースサーバー構築
PHP で Web アプリケーションサーバー構築
qmail でメールサーバー構築
Samba でファイルサーバー構築
BIND でネームサーバー構築
Tomcat で Web アプリケーションサーバー構築
ProFTPD で FTP サーバー構築
システム設定
CMS でサイト構築
snort でネットワーク進入探知システム構築
ライブラリのインストール