この範例は、1999 年の 3 月に開催された LinuxWorld で Michael Neuling と私が発表したチュートリアルから引用しました。これは、与えられた問 題を解決するための唯一の方法ではないですが、多分最も単純なものです。 この範例を有益なものだと思って頂ければ幸いです。
外部ネットワーク (BAD)
│
│
ppp0│
┌───────┐
│192.84.219.1 │ サーバネットワーク (DMZ)
│ │eth0
│ │───────┬──────┬──────┬─
│ │192.84.219.250│ │ │
│ │ │ │ │
│192.168.1.250 │ │ │ │
└───────┘ ┌───┐ ┌───┐ ┌───┐
│ eth1 │ SMTP │ │ DNS │ │ WWW │
│ └───┘ └───┘ └───┘
│ 192.84.219.128 192.84.219.129 192.84.218.130
│
内部ネットワーク (GOOD)
パケットフィルターマシン:
マシンがダウンしているかどうかを知るのに大変役に立ちます。
これもまた、原因分析に役に立ちます。
ping と DNS をより使いやすくするためです。
DMZ 内:
メールサーバ
ネームサーバ
ウェブサーバ
内部ネットワーク:
これらは、許可の対象としてはかなり標準的なことです。内部ネッ トワーク上のマシンに対してほぼ全てを許可することから始めます が、ここでは制限をかけています。
当然、メールは外部へ送信できるようにしたいです。
メールを読む方法です。
WWW と ftp, traceroute, ssh を利用する際に、外部ネームの検索 をするのに必要です。
外部向けウェブサーバと内部ウェブサーバを同期させる方法です。
当然、外部向けウェブサーバへ接続できるべきです。
これは、一般的に広く容認されていることです。つまりファイア ウォールマシンがダウンしているかどうかを、確認できるように するためです(それで外部サイトが壊れていた場合は、非難されま せんので)。
いかなる非対称のルーティングも持っていないので、全てのインター フェースに対して IP 偽装保護を単にオンできます。
# for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
#
今まで通りローカルのループバックトラフィックは許可しますが、それ以外 の全てを拒否します。
# ipchains -A input -i ! lo -j DENY
# ipchains -A output -i ! lo -j DENY
# ipchains -A forward -j DENY
#
インターフェースのセットアップは、大抵ブート時のスクリプト で実行されます。フィルタリングのルールが適用される前にパケット が漏れだすことを防ぐ為に、インターフェースが設定される前に上記 のステップが実行されていることを確認して下さい。
FTP を利用する際には、マスカレードモジュールを組み込む必要があ ります。そうすることで、内部ネットワークからのアクティブとパッ シブ FTP が `ちゃんと動作します'。
# insmod ip_masq_ftp
#
マスカレードを使用して、forward チェインでフィルターをかけることは 最良の方法です。
forward チェインをソース/あて先 インターフェースに合わせて様々なユ ーザ定義チェインに分割して下さい。つまり、問題を取扱いやすい単位 に分解するのです。
ipchains -N good-dmz
ipchains -N bad-dmz
ipchains -N good-bad
ipchains -N dmz-good
ipchains -N dmz-bad
ipchains -N bad-good
ICMP の標準エラーをアクセプトすることは、共通の内容です。したがって、 そのためのチェインを作ります。
ipchains -N icmp-acc
残念なことに、(forward チェインでは)出力インターフェースしか分かり ません。したがって、パケットがどのインターフェースから入ってくるか を見抜くために、ソースアドレスを使用します(偽装保護がアドレスのな りすましを防いでいるので大丈夫です)。
これらのいずれにもマッチしないパケット(明らかに、そのようなことは起 こらないはずですが)は全てログを取ることに注意して下さい。
ipchains -A forward -s 192.168.1.0/24 -i eth0 -j good-dmz
ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j good-bad
ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j dmz-bad
ipchains -A forward -s 192.84.219.0/24 -i eth1 -j dmz-good
ipchains -A forward -i eth0 -j bad-dmz
ipchains -A forward -i eth1 -j bad-good
ipchains -A forward -j DENY -l
パケットが(以下の)エラー ICMP のいずれかならアクセプトされます。 さもなければ、マッチしなかったパケットに対する制御は icmp-acc チェイン から抜けて、呼出し元のチェインに戻されることになります。
ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT
内部ネットワークに対する制限 :
内部ネットワークから DMZ の際にマスカレードはできますが、ここでは行 いません。内部ネットワーク上のどのマシンも悪意のあることをしないは ずなので、拒否される全てのパケットのログを取ります。
Debian の古いバージョンでは、/etc/services 上の `pop3' を`pop-3' と 呼ぶので注意して下さい。このことは RFC1700 と一致していません。
ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.219.128 pop3 -j ACCEPT
ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT
ipchains -A good-dmz -p icmp -j icmp-acc
ipchains -A good-dmz -j DENY -l
ipchains -A bad-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
ipchains -A bad-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
ipchains -A bad-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
ipchains -A bad-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
ipchains -A bad-dmz -p icmp -j icmp-acc
ipchains -A bad-dmz -j DENY
ipchains -A good-bad -p tcp --dport www -j MASQ
ipchains -A good-bad -p tcp --dport ssh -j MASQ
ipchains -A good-bad -p udp --dport 33434:33500 -j MASQ
ipchains -A good-bad -p tcp --dport ftp -j MASQ
ipchains -A good-bad -p icmp --icmp-type ping -j MASQ
ipchains -A good-bad -j REJECT -l
ipchains -A dmz-good -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
ipchains -A dmz-good -p udp -s 192.84.219.129 domain -j ACCEPT
ipchains -A dmz-good -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
ipchains -A dmz-good -p icmp -j icmp-acc
ipchains -A dmz-good -j DENY -l
ipchains -A dmz-bad -p tcp -s 192.84.219.128 smtp -j ACCEPT
ipchains -A dmz-bad -p udp -s 192.84.219.129 domain -j ACCEPT
ipchains -A dmz-bad -p tcp -s 192.84.219.129 domain -j ACCEPT
ipchains -A dmz-bad -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
ipchains -A dmz-bad -p icmp -j icmp-acc
ipchains -A dmz-bad -j DENY -l
ipchains -A bad-good -j REJECT
ipchains -N bad-if
ipchains -N dmz-if
ipchains -N good-if
ipchains -A input -d 192.84.219.1 -j bad-if
ipchains -A input -d 192.84.219.250 -j dmz-if
ipchains -A input -d 192.168.1.250 -j good-if
ipchains -A bad-if -i ! ppp0 -j DENY -l
ipchains -A bad-if -p TCP --dport 61000:65095 -j ACCEPT
ipchains -A bad-if -p UDP --dport 61000:65095 -j ACCEPT
ipchains -A bad-if -p ICMP --icmp-type pong -j ACCEPT
ipchains -A bad-if -j icmp-acc
ipchains -A bad-if -j DENY
ipchains -A dmz-if -i ! eth0 -j DENY
ipchains -A dmz-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT
ipchains -A dmz-if -p UDP -s 192.84.219.129 53 -j ACCEPT
ipchains -A dmz-if -p ICMP --icmp-type pong -j ACCEPT
ipchains -A dmz-if -j icmp-acc
ipchains -A dmz-if -j DENY -l
ipchains -A good-if -i ! eth1 -j DENY
ipchains -A good-if -p ICMP --icmp-type ping -j ACCEPT
ipchains -A good-if -p ICMP --icmp-type pong -j ACCEPT
ipchains -A good-if -j icmp-acc
ipchains -A good-if -j DENY -l
ipchains -D input 1
ipchains -D forward 1
ipchains -D output 1