## ipchains mini HOWTO

1999/02/05
おおつかまさひと

    negi@KU3G.org

## はじめに

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

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

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

## 基礎知識

新カーネルはチェインという仕組を使ってファイアウォールの設定を 行ないます。チェインとは鎖のことで，フィルタリングルールのリスト のことです。丁度，鎖の輪一つ一つがルール，それを繋げたものが鎖に なる。そんな図を想像してみて下さい。

カーネルは，この鎖を頭から順にテストしていきます。

カーネルは最初から 3 つのチェインを持っています。`input`， `output`， `forward` の 3 つです。ipfwadm で言う `-I`， `-O`，`-F` にあたります。

`input`

  パケットが入ってくる時にチェックされるチェインです。

`output`

  パケットが外に出ていく時にチェックされるチェインです。

`forward`

  受け取ったパケットを他所に転送する時（こういう動作をルーティ ングといいます）にチェックされるチェインです。

デフォルトでは，各チェインには何のルールもなく，また各チェイン のデフォルトのルールは ACCEPT となっています。このデフォルトのルー ルをポリシーと言い `-P` で設定できます。

## ipchains の使い方

早速 `ipchains` を使ってみましょう。`ipchains` は各チェインにルールを追加 (`-A`) したり削除 ( `-D`) できます。各チェインのルールのリストを見る ( `-L`) こともできます。

###

      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 をインターフェイスとして指定できます。

###

      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

などと表示されましたでしょうか？　見ての通りこの鎖には１つの輪し かありませんが，`-A` によってどんどん追加していけます。

###

      ipchains -D input 1

これはさきほど指定したルールを `input` チェインから削除 します。`-D` は次のようにも記述できます

###

      ipchains -D input -s 192.168.1.0/24 -j DENY

例 1. の `-A` が `-D` にかわっただけですね。`-A` で指定したルールを，そのまま `-D` で指定しても削除することができます。

## チェインの作成と応用

チェインは最初からある `input`，`output`， `forward` 以外にも自分で自由に作ることができます。

###

      ipchains -N ppp-in

これは ppp-in というチェインを作成します。

###

      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`) したりできま す。

しかしこのままでは何の役にも立ちません。チェインは連結することに よって効果を発揮します。

###

      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 といったシンボルだけでなく， チェインも指定することができます。

###

      ipchains -F ppp-in

これは ppp-in チェインの内容を消去します。消去されるのは内容だけ でチェイン自体は消去されません。消去するには `-X` を使います。

###

      ipchains -X ppp-in

ppp-in チェインを消去します。ただし ppp-in チェインの内容が空の 場合にしか消去できません。まず `-F` で空にしてから `-X` で消去します。

## 実践編

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 だけの特別な設定を任意に追加，削 除するといったことが非常に困難でしたが，チェインを使うことにより 非常にスマートに設定することができます。

## IP Masquerade の設定

これまで ipfwadm で設定していた IP Masquerade の設定は，`ipchains` で行なうようになりました。以下のように記述します。

###

      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

- (LinuxDoc 変換：2000/05/12, 中野武雄)
- (DocBook 変換：2001/03/04, 千旦裕司)