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

構成の要件は、以下の通りです。
内部ネットワークでは、プライベートアドレス(192.168.1.0/24)を使用しており、IP マスカレードを利用してインターネットや外部向けサーバーにアクセスします。
DMZ には、外部公開用の Web サーバーと、DNS サーバーが設置されており、グローバルアドレス(それぞれ、aaa.bbb.ccc.ddd 。aaa.bbb.ccc.eee と表記)を使用しています。
F/W BOX には 3 枚の NIC 、eth0(インターネット側)、eth1(イントラネット側)、eth2(DMZ側)を搭載しています。
F/W のデフォルトターゲット(ポリシー)は INPUT 、FORWARD、OUTPUT ともに拒否(DROP)です。
イントラネットからインターネットへのリクエストはすべて許可、逆は継続パケットのみ許可をしています。
インターネットからイントラネットへのリクエストは拒否します。
イントラネットから DMZ へのリクエストは、http と dns のみ許可、継続パケットはすべて許可しています。
インターネットから DMZ へのリクエストは、http と dns のみ許可、継続パケットはすべて許可しています。
イントラネットに設置されているメンテナンス用ホスト(192.168.1.3)から、F/W BOX への ssh 接続はメンテナンス用に許可しています。
イントラネットに設置されているメンテナンス用ホスト(192.168.1.3)から、F/W BOX および DMZ 上の公開サーバーへは、 ping を使用した生存確認が可能なようにパケットを許可しています。
設定を開始する前に、現在の状態を確認し、不要な設定は削除しておきます。以下はすべての設定を削除する場合の例です。
# 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 |