====================================================================== ipchains-mini-HOWTO Date : Fri 5, 1999 Written by : おおつかまさひと ====================================================================== 0. はじめに ipchains は新カーネルで採用されたファイアウォール設定ツールで す。これまでの ipfwadm とはちょいと操作性が違うので戸惑う人も多 いことでしょう。そんなわけでこの mini HOWTO をお送りします。 前提として ipfwadm をある程度使ったことがある方を対象にさせて いただきます。 この文書は,筆者が 30 Jan, 1999 に fj.os.linux と KU3G ML にポ ストした Message-Id: の記事に少々 の手直しをしたものです。また再配布は改変されない限り原則自由です。 1. 基礎知識 新カーネルはチェインという仕組を使ってファイアウォールの設定を 行ないます。チェインとは鎖のことで,フィルタリングルールのリスト のことです。丁度,鎖の輪一つ一つがルール,それを繋げたものが鎖に なる。そんな図を想像してみて下さい。 カーネルは,この鎖を頭から順にテストしていきます。 カーネルは最初から3つのチェインを持っています。input,output, forward の3つです。ipfwadm で言う -I,-O,-F にあたります。 ○ input パケットが入ってくる時にチェックされるチェインです。 ○ output パケットが外に出ていく時にチェックされるチェインです。 ○ forward 受け取ったパケットを他所に転送する時(こういう動作をルーティ ングといいます)にチェックされるチェインです。 デフォルトでは,各チェインには何のルールもなく,また各チェイン のデフォルトのルールは ACCEPT となっています。このデフォルトのルー ルをポリシーと言い -P で設定できます。 2. ipchains の使い方 早速 ipchains を使ってみましょう。ipchains は各チェインにルール を追加 (-A) したり削除 (-D) できます。各チェインのルールのリスト を見る (-L) こともできます。 例1) ipchains -A input -s 192.168.0.0/24 -j DENY ~~~~~~~~~~~~~~~~~~~~~~~~~ これは「ソースアドレスが 192.168.0.0/24 を持つパケットを DENY す る」というルールを input チェインに追加します。(下線部がルール になります。) ルールに記述できるスイッチには以下のようなものがあります。 -s ソースアドレスを指定します -d ディスティネーションアドレスを指定します -p プロトコルを指定します tcp,udp,icmp 等が記述できます。詳しくは man ページを参照し て下さい。 -j ターゲットを記述します DENY,REJECT,ACCEPT 等が記述できます。チェインを指定すること もできます(後述)。詳しくは man ページを参照して下さい。 -i インターフェイスを指定します eth0,ppp0 等が記述できます。現在 up でないインターフェイスも 指定することができます。つまり接続されていない状態でも ppp0 をインターフェイスとして指定できます。 例2) ipchains -n -L input これは input チェインのルールを見ることができます。-n は IP アド レスを数字で表示するという意味です。先程追加したルールが Chain input (policy ACCEPT): target prot opt source destination ports DENY all ------ 192.168.0.0/24 0.0.0.0/0 n/a などと表示されましたでしょうか? 見ての通りこの鎖には1つの輪し かありませんが,-A によってどんどん追加していけます。 例3) ipchains -D input 1 これはさきほど指定したルールを input チェインから削除します。-D は次のようにも記述できます 例4) ipchains -D input -s 192.168.1.0/24 -j DENY 例1 の -A が -D にかわっただけですね。-A で指定したルールを,そ のまま -D で指定しても削除することができます。 3. チェインの作成と応用 チェインは最初からある input,output,forward 以外にも自分で自由 に作ることができます。 例5) ipchains -N ppp-in これは ppp-in というチェインを作成します。 例6) ipchains -A ppp-in -p tcp -s 0/0 -d 192.168.0.1 smtp -j DENY これは ppp-in というチェインに,「全ての smtp ポートへの接続を DENY する」というルールを追加します。 先程も書きましたが -p はプロトコルの指定(tcp),-s はソースアドレ スの指定(0/0 = 全て) -j はターゲット(DENY)です。 -d は自ホストの IP アドレス smtp は /etc/services に書かれたポー トです。ポートは数字表記でも構いません。 このように作成したチェインには,自由にルールを追加 (-A) したり削 除 (-D) したり,また閲覧 (-L) したりできます。 しかしこのままでは何の役にも立ちません。チェインは連結することに よって効果を発揮します。 例7) ipchains -A input -i ppp0 -j ppp-in これは「パケットが入力されたインターフェイスが ppp0 のとき ppp-in というチェインを選択する」というルールを input チェインに 追加しています。 ppp0 から入ってきたパケットはターゲットが ppp-in と指定されてい ますので,チェイン ppp-in に移ります。 ppp-in チェインには 例6 によって設定したルールがありますので,こ のルールのチェックを受けます。このルールにマッチしなければ, ppp-in チェインを抜け,再び input チェインに戻ってきて次のチェッ クを受けます。 このように -j は DENY,REJECT といったシンボルだけでなく,チェイ ンも指定することができます。 例8) ipchains -F ppp-in これは ppp-in チェインの内容を消去します。消去されるのは内容だけ でチェイン自体は消去されません。消去するには -X を使います。 例9) ipchains -X ppp-in ppp-in チェインを消去します。ただし ppp-in チェインの内容が空の 場合にしか消去できません。まず -F で空にしてから -X で消去します。 5. 実践編 PPP 接続をしている間はファイアウォールを設定し,それ以外はファ イアウォールを設置しない,そういう状況を考えて設定してみましょう。 # pppd は ip-up,ip-down というスクリプトを実行します。前者は接 # 続が確立された時,後者は切断された時に実行されます。ip-up には # 引数が渡ります。$1 は接続に用いるインターフェイス,$2 は tty # デバイス,$3 はシリアルスピード,$4 はローカルの IP アドレス, # $5 はリモート側のIP アドレスです。 ip-up は以下のようになりました。 8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----- #!/bin/sh umask 022 # 変数の設定 iface=$1 device=$2 speed=$3 localip=$4 remoteip=$5 # ppp-in というチェインを作成します /sbin/ipchains -N ppp-in # input チェインに # 「インターフェイスが ppp0 の場合,ターゲットは ppp-in チェイン」 # というルールを追加します /sbin/ipchains -A input -i ppp0 -j ppp-in # 「自サイトの SMTP ポートへの接続を弾く」 # というルールを ppp-in チェインに追加します。 /sbin/ipchains -A ppp-in -p tcp -s 0/0 -d $localip smtp -j REJECT # 「自サイトの NetBIOS ポートへの接続を弾く」 # というルールを ppp-in チェインに追加します。 /sbin/ipchains -A ppp-in -p tcp -s 0/0 -d $localip 137:139 -j DENY /sbin/ipchains -A ppp-in -p udp -s 0/0 -d $localip 137:139 -j DENY # 「自サイトの X server ポートへの接続を弾く」 # というルールを ppp-in チェインに追加します。 /sbin/ipchains -A ppp-in -p tcp -s 0/0 -d $localip 6000 -j DENY # 「自サイトの X font server ポートへの接続を弾く」 # というルールを ppp-in チェインに追加します。 /sbin/ipchains -A ppp-in -p tcp -s 0/0 -d $localip 7000 -j DENY 8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----- ip-down は以下のような感じです 8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----- #!/bin/sh # input チェインから ppp-in ルールを削除します /sbin/ipchains -D input -i ppp0 -j ppp-in # ppp-in チェインを空にします /sbin/ipchains -F ppp-in # ppp-in チェインを削除します /sbin/ipchains -X ppp-in 8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----- これまでの ipfwadm では ppp0 だけの特別な設定を任意に追加,削 除するといったことが非常に困難でしたが,チェインを使うことにより 非常にスマートに設定することができます。 6. IP Masquerade の設定 これまで ipfwadm で設定していた IP Masquerade の設定は, ipchains で行なうようになりました。以下のように記述します。 例10) ipchains -A forward -s 192.168.1.0/24 -d 0.0.0.0/0 -j MASQ 注意) 新カーネルでは,デフォルトでパケットをフォワードしない設定 になっています。以下のようにしてフォワードを有効にします。 echo 1 > /proc/sys/net/ipv4/ip_forward