Linux の ipchains は、 Linux IPv4 firewalling コードと ipfwadm を 書き換えたものです。 ipfwadm は BSD の ipfw を書き換えたものだったと思います。 ipchains は Linux のカーネル 2.1.102 以降で IP パケットフィルタを 管理するのに必要です。
以前のコードはフラグメント【訳注: fragment: 断片化されたパケット】を 扱えませんし、 (少なくとも Intel 用では) 32 ビットのカウンタしかありませんし、 TCP/UDP/ICMP 以外の仕様のプロトコルを考慮していませんし、 アトミック(瞬間的)に大きく(ルールを)変更することもできませんし、 逆ルールを満たせませんし、いくつか妙な癖がありましたし、 管理しにくい (ユーザのミスを招きやすい) ものだったと 作者は言っています。
【訳注: この一節は IPCHAINS-HOWTO 第一章 1.2 なぜ? と殆ど同じです。】
私は ipchains を使ったファイアウォールの制御について、ここで深くは述べる つもりはありません。 この件についてはとてもよく出来た HOWTO が次のところにありますから、 ここでは基本についてだけ述べます。 http://netfilter.samba.org/ipchains/HOWTO.htmlに HOWTO があります。
チェインは名前で扱います。 まず、input, output そして forward という組み込み済みチェインがあり、 これらは削除できません。 自分でチェインを作ることができます。 そして、これらのチェインのルールセットに対してルールを追加したり 削除していくことができます。
全てのチェインに対して行える操作は以下の通りです -
チェイン内部でルールを操作するにはいくつかの方法があります -
ipchains はマスカレーディングの操作の置場所としても良い所なので、 この為の操作がいくつかあります -
ファイアウォールルールの変更に関してはタイミングの問題がいくつかあります。 注意深くやらないと、変更している間に不完全なところからパケットを 通してしまいます。 もっとも単純な方法は次のようにすることです -
# ipchains -I input 1 -j DENY # ipchains -I output 1 -j DENY # ipchains -I forward 1 -j DENY
... 変更します ...
# ipchains -D input 1 # ipchains -D output 1 # ipchains -D forward 1 #
この方法は、変更している間に全てのパケットを落します。
これは ipchains について、これまで述べたファイアウォールルールを まとめたものです。
#!/bin/sh # # rc.firewall の記述。 # ## 全てを破棄して最初から始動する。 /sbin/ipchains -F input /sbin/ipchains -F output /sbin/ipchains -F forward ## HTTP 透過プロキシに対してリダイレクトする。 #$IPCHAINS -A input -p tcp -s 192.1.2.0/24 -d 0.0.0.0/0 80 -j REDIRECT 8080 ## あなた自身のチェインを作る。 /sbin/ipchains -N my-chain # サーバに来る email を許可する。 /sbin/ipchains -A my-chain -s 0.0.0.0/0 smtp -d 192.1.2.10 1024:-j ACCEPT # 外側の email サーバに email 接続を許可する。 /sbin/ipchains -A my-chain -s 192.1.2.10 -d 0.0.0.0/0 smtp -j ACCEPT # あなたの web サーバに Web 接続を許可する。 /sbin/ipchains -A my-chain -s 0.0.0.0/0 www -d 192.1.2.11 1024: -j ACCEPT # 外側の Web サーバに Web 接続を許可する。 /sbin/ipchains -A my-chain -s 192.1.2.0/24 1024: -d 0.0.0.0/0 www -j ACCEPT # DNS トラフィックを許可する。 /sbin/ipchains -A my-chain -p UDP -s 0.0.0.0/0 dns -d 192.1.2.0/24 -j ACCEPT ## マスカレードを使っているなら、 # 内側から内側へのトラフィックをマスクしない。 /sbin/ipchains -A forward -s 192.1.2.0/24 -d 192.1.2.0/24 -j ACCEPT # 外部インターフェースを直接マスクしない。 /sbin/ipchains -A forward -s 24.94.1.0/24 -d 0.0.0.0/0 -j ACCEPT # 外側に向かう全ての内部 IP をマスカレードする。 /sbin/ipchains -A forward -s 192.1.2.0/24 -d 0.0.0.0/0 -j MASQ ## 全てを不許可にする。 /sbin/ipchains -P my-chain input DENY
ここでやめてはいけません。 これは完璧なファイアウォールではありませんし、あなたは提供している 他のサービスがあるはずです。 繰り返しますが IPCHAINS-HOWTO を読みましょう。
【訳注: IPCHAINS-HOWTO 日本語訳 もあります。】