22.9. ファイアウォールの設定例

ここでは、実際にファイアウォールを構築するまでの手順を今まで解説した内容をベースに以下の構成例の F/W BOX について解説します。

構成の要件は、以下の通りです。

設定を開始する前に、現在の状態を確認し、不要な設定は削除しておきます。以下はすべての設定を削除する場合の例です。

# iptables -/L
# iptables -t nat -L
# iptables -F
# ipables -t nat -F

ポリシー(デフォルトターゲット)を設定します。

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP

破棄するパケットのログ採取を行うためのユーザーチェイン log-drop を作成します。

# iptables -N log-drop
# iptables -A log-drop -j LOG --log-prefix ipf-drop:
# iptables -A log-drop -j DROP

必要に応じて以下も作成すると便利です。

# iptables -N log-reject
# iptables -A log-reject -j LOG --log-prefix ipf-reject:
# iptables -A log-reject -j REJECT
# iptables -N log-accept
# iptables -A log-accept -j LOG --log-prefix ipf-accept:
# iptables -A log-accept -j ACCEPT

必ず破棄する偽装パケット(インターネット側に接続されてている eth0 へのプライベートアドレスやイントラネットアドレスを使用したパケット)用のチェーン fake を作成します。

# iptables -N fake
# iptables -A fake -i eth0 -s 127.0.0.0/8 -j log-drop
# iptables -A fake -i eth0 -s 10.0.0.0/8 -j log-drop
# iptables -A fake -i eth0 -s 172.16.0.0/12 -j log-drop
# iptables -A fake -i eth0 -s 192.168.0.0/16 -j log-drop
# iptables -A fake -i eth0 -s 192.168.1.0/24 -j log-drop
# iptables -A fake -i eth0 -s aaa.bbb.ccc.ddd/nn -j log-drop

fake チェーンを INPUT、FORWARD 各チェーンの先頭に登録します。

# iptables -I INPUT 1 -j fake
# iptables -I FORWARD 1 -j fake

イントラネットからインターネットへのアクセス用チェイン in-out を作成します。要件に合うように内部からの新規リクエストとすべての継続パケットを許可します。ここでは、全てのリクエストを許可していますが、対象のサービスを明示的に許可することでよりセキュアな環境を構築することができます。

# iptables -N in-out
# iptables -A in-out -m state --state ESTABLISHED,RELATED -i eth0 -j ACCEPT
# iptables -A in-out -m state --state ESTABLISHED,RELATED -i eth1 -j ACCEPT
# iptables -A in-out -m state --state NEW -i eth1 -o eth0 -j ACCEPT

in-out チェーンを FORWARD チェーンに追加します。

# iptables -A FORWARD -j in-out

IP マスカレードの指定を行います。

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

DMZ 上でインターネットに公開をするサービスのチェイン dmz-out を作成します。要件に合うようにインターネットからの HTTP(TCP 80 番)と DNS(TCP/UDP 53番)へのリクエストとすべての継続パケットを許可します。

# iptables -N dmz-out
# iptables -A dmz-out -m state --state ESTABLISHED,RELATED -i eth2 -o eth0 -j ACCEPT
# iptables -A dmz-out -m state --state ESTABLISHED,RELATED -i eth0 -o eth2 -j ACCEPT
# iptables -A dmz-out -m state --state NEW -i eth0 -p tcp -d aaa.bbb.ccc.ddd --dport 80 -j ACCEPT
# iptables -A dmz-out -m state --state NEW -i eth0 -d aaa.bbb.ccc.eee --dport 53 -j ACCEPT

dmz-out チェーンを FORWARD チェーンに追加します。

# iptables -A FORWARD -j dmz-out

イントラネットから DMZ 上のサーバーへのアクセスするためのチェイン in-dmz を作成します。要件に合うように、まずはイントラネットからの HTTP(TCP 80 番)と DNS(TCP/UDP 53番)へのリクエストとすべての継続パケットを許可します。

# iptables -N in-dmz
# iptables -A in-dmz -m state --state ESTABLISHED,RELATED -i eth2 -o eth1 -j ACCEPT
# iptables -A in-dmz -m state --state ESTABLISHED,RELATED -i eth1 -o eth2 -j ACCEPT
# iptables -m state --state NEW -i eth1 -p tcp -d aaa.bbb.ccc.ddd --dport 80 -j ACCEPT
# iptables -m state --state NEW -i eth1 -d aaa.bbb.ccc.eee --dport 53 -j ACCEPT

更にイントラネットのメンテナンスマシン(192.168.1.3)から HTTP サーバーと DNS サーバーへ ping を使用して生存確認が可能なようにパケットを許可します。traceroute などを許可する場合は必要に応じて ICMP のタイプを追加します。

# iptables -A in-dmz -p icmp -s 192.168.1.3 --icmp-type echo-request -d aaa.bbb.ccc.ddd -i eth1 -j ACCEPT
# iptables -A in-dmz -p icmp -s 192.168.1.3 --icmp-type echo-request -d aaa.bbb.ccc.eee -i eth1 -j ACCEPT
# iptables -A in-dmz -p icmp --icmp-type echo-reply -s aaa.bbb.ccc.ddd -d 192.168.1.3 -o eth1 -i eth2 -j ACCEPT
# iptables -A in-dmz -p icmp --icmp-type echo-reply -s aaa.bbb.ccc.eee -d 192.168.1.3 -o eth1 -i eth2 -j ACCEPT

in-dmz チェーンを FORWARD チェーンに追加します。

# iptables -A FORWARD -j in-dmz

IP マスカレードの指定を行います。

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth2 -j MASQUERADE

どのルールにもマッチしないパケットは、ログを採取しドロップします。

# iptables -A FORWARD -j log-drop

イントラネットのメンテナンスマシンから F/W BOX に対して生存確認のための ping と、メンテナンスのための SSH アクセスを許可します。

 
# iptables -A INPUT -p tcp -s 192.168.1.3 --dport 22 -d 192.168.1.1 -i eth1 -j ACCEPT
# iptables -A OUTPUT -p tcp -m state --state ESTABLISHED --dport 22 -d 192.168.1.3 -s 192.168.1.1 -j ACCEPT
# iptables -A INPUT -p icmp -s 192.168.1.3 --icmp-type echo-request -d 192.168.1.1 -i eth1 -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type echo-reply -s 192.168.1.1 --d 192.168.1.3 -o eth2 -j ACCEPT

以下のように設定を確認します。

# iptables -L
# iptables -t nat -L

次回のシステム起動時にも設定が有効になるよう /etc/sysconfig/iptables ファイルに設定内容を保存します。

# /etc/init.d/iptables save

システム起動時に iptables を有効にするには以下のように実行します。

# chkconfig iptables on