次のページ 前のページ 目次へ

======================================================================
    ipchains-mini-HOWTO

    Date       : Fri 5, 1999
    Written by : おおつかまさひと <negi@KU3G.org>

======================================================================

0. はじめに

 ipchains は新カーネルで採用されたファイアウォール設定ツールで
す。これまでの ipfwadm とはちょいと操作性が違うので戸惑う人も多
いことでしょう。そんなわけでこの mini HOWTO をお送りします。

 前提として ipfwadm をある程度使ったことがある方を対象にさせて
いただきます。

 この文書は,筆者が 30 Jan, 1999 に fj.os.linux と KU3G ML にポ
ストした Message-Id: <m2iudp8qlw.fsf@clotho.KU3G.org> の記事に少々
の手直しをしたものです。また再配布は改変されない限り原則自由です。

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

次のページ 前のページ 目次へ