<!doctype article public "-//OASIS//DTD DocBook V3.1//EN">
<!--
======================================================================
    ipchains-mini-HOWTO

    Date       : Fri 5, 1999
    Written by : おおつかまさひと &lt;negi@KU3G.org&gt;

======================================================================
-->
<article>
<artheader>
<title>ipchains mini HOWTO</title>
<pubdate>1999/02/05</pubdate>
<author>
 <firstname>おおつかまさひと</firstname>
 <surname></surname>
 <affiliation>
  <address>negi@KU3G.org</address>
 </affiliation>
</author>

<abstract><para>
</para></abstract>

</artheader>

<sect1 id="intro">
<title>はじめに</title>
<para>
　<command>ipchains</command> は新カーネルで採用されたファイアウォール設定
ツールです。これまでの ipfwadm とはちょいと操作性が違うので戸惑う人も多
いことでしょう。そんなわけでこの mini HOWTO をお送りします。
</para><para>
　前提として ipfwadm をある程度使ったことがある方を対象にさせて
いただきます。
</para><para>
　この文書は，筆者が 30 Jan, 1999 に fj.os.linux と KU3G ML にポ
ストした Message-Id: &lt;m2iudp8qlw.fsf@clotho.KU3G.org&gt; の記事に少々
の手直しをしたものです。また再配布は改変されない限り原則自由です。
</para>
</sect1>

<sect1 id="basics">
<title>基礎知識</title>
<para>
　新カーネルはチェインという仕組を使ってファイアウォールの設定を
行ないます。チェインとは鎖のことで，フィルタリングルールのリスト
のことです。丁度，鎖の輪一つ一つがルール，それを繋げたものが鎖に
なる。そんな図を想像してみて下さい。
</para><para>
　カーネルは，この鎖を頭から順にテストしていきます。
</para><para>
　カーネルは最初から 3 つのチェインを持っています。<command>input</command>，
<command>output</command>，
<command>forward</command> の 3 つです。ipfwadm で言う <option>-I</option>，
<option>-O</option>，<option>-F</option> にあたります。
</para><para>
<variablelist>
<varlistentry>
<term><command>input</command></term>
<listitem><para>
パケットが入ってくる時にチェックされるチェインです。
</para></listitem>
</varlistentry>
<varlistentry>
<term><command>output</command></term>
<listitem><para>
パケットが外に出ていく時にチェックされるチェインです。
</para></listitem>
</varlistentry>
<varlistentry>
<term><command>forward</command></term>
<listitem><para>
受け取ったパケットを他所に転送する時（こういう動作をルーティ
ングといいます）にチェックされるチェインです。
</para></listitem>
</varlistentry>
</variablelist>
</para><para>
　デフォルトでは，各チェインには何のルールもなく，また各チェイン
のデフォルトのルールは ACCEPT となっています。このデフォルトのルー
ルをポリシーと言い <option>-P</option> で設定できます。
</para>
</sect1>

<sect1 id="howtouse">
<title>ipchains の使い方</title>
<para>
　早速 <command>ipchains</command> を使ってみましょう。<command>ipchains
</command> は各チェインにルールを追加 (<option>-A</option>) したり削除 (
<option>-D</option>) できます。各チェインのルールのリストを見る (
<option>-L</option>) こともできます。
</para><para>
<example id="ex1">
<title></title>
<programlisting>
  ipchains -A input -s 192.168.0.0/24 -j DENY
                       ~~~~~~~~~~~~~~~~~~~~~~~~~
</programlisting>
</example>
</para><para>
これは「ソースアドレスが 192.168.0.0/24 を持つパケットを DENY する」という
ルールを <command>input</command> チェインに追加します(下線部がルールになり
ます)。
</para><para>
ルールに記述できるスイッチには以下のようなものがあります。
</para><para>
<itemizedlist>
<listitem><para>
<option>-s</option> ソースアドレスを指定します
</para></listitem>
<listitem><para>
<option>-d</option> ディスティネーションアドレスを指定します
</para></listitem>
<listitem><para>
<option>-p</option> プロトコルを指定します
</para><para>
tcp，udp，icmp 等が記述できます。詳しくは man ページを参照して下さい。
</para></listitem>
<listitem><para>
<option>-j</option> ターゲットを記述します
</para><para>
DENY，REJECT，ACCEPT 等が記述できます。チェインを指定すること
もできます(後述)。詳しくは man ページを参照して下さい。
</para></listitem>
<listitem><para>
<option>-i</option> インターフェイスを指定します
</para><para>
eth0，ppp0 等が記述できます。現在 up でないインターフェイスも
指定することができます。つまり接続されていない状態でも ppp0
をインターフェイスとして指定できます。
</para></listitem>
</itemizedlist>
</para>
<para>
<example id="ex2">
<title></title>
<programlisting>
  ipchains -n -L input
</programlisting>
</example>
</para><para>
これは <command>input</command> チェインのルールを見ることができます。
<option>-n</option> は IP アドレスを数字で表示するという意味です。
先程追加したルールが
</para><para>
<screen>
  Chain input (policy ACCEPT):
  target     prot opt     source                destination           ports
  DENY       all  ------  192.168.0.0/24        0.0.0.0/0             n/a
</screen>
</para><para>
などと表示されましたでしょうか？　見ての通りこの鎖には１つの輪し
かありませんが，<option>-A</option> によってどんどん追加していけます。
</para><para>
<example id="ex3">
<title></title>
<programlisting>
  ipchains -D input 1
</programlisting>
</example>
</para><para>
これはさきほど指定したルールを <command>input</command> チェインから削除
します。<option>-D
</option> は次のようにも記述できます
</para><para>
<example id="ex4">
<title></title>
<programlisting>
  ipchains -D input -s 192.168.1.0/24 -j DENY
</programlisting>
</example>
</para><para>
<link linkend="ex1">例 1.</link> の <option>-A</option> が <option>-D</option> 
にかわっただけですね。<option>-A</option> で指定したルールを，そのまま 
<option>-D</option> で指定しても削除することができます。
</para>
</sect1>

<sect1 id="howtomake">
<title>チェインの作成と応用</title>
<para>
チェインは最初からある <command>input</command>，<command>output</command>，
<command>forward</command> 以外にも自分で自由に作ることができます。
</para><para>
<example id="ex5">
<title></title>
<programlisting>
  ipchains -N ppp-in
</programlisting>
</example>
</para><para>
これは ppp-in というチェインを作成します。
</para><para>
<example id="ex6">
<title></title>
<programlisting>
  ipchains -A ppp-in -p tcp -s 0/0 -d 192.168.0.1 smtp -j DENY
</programlisting>
</example>
</para><para>
これは ppp-in というチェインに，「全ての smtp ポートへの接続を
DENY する」というルールを追加します。
</para><para>
先程も書きましたが <option>-p</option> はプロトコルの指定(tcp)，<option>-s
</option> はソースアドレスの指定(0/0 = 全て) <option>-j</option> はターゲット
(DENY)です。
</para><para>
<option>-d</option> は自ホストの IP アドレス <option>smtp</option> は 
<filename>/etc/services</filename> に書かれたポートです。ポートは数字表記でも
構いません。
</para><para>
このように作成したチェインには，自由にルールを追加 (<option>-A</option>) したり
削除 (<option>-D</option>) したり，また閲覧 (<option>-L</option>) したりできま
す。
</para><para>
しかしこのままでは何の役にも立ちません。チェインは連結することに
よって効果を発揮します。
</para><para>
<example id="ex7">
<title></title>
<programlisting>
  ipchains -A input -i ppp0 -j ppp-in
</programlisting>
</example>
</para><para>
これは「パケットが入力されたインターフェイスが ppp0 のとき
ppp-in というチェインを選択する」というルールを <command>input</command> 
チェインに追加しています。
</para><para>
ppp0 から入ってきたパケットはターゲットが ppp-in と指定されてい
ますので，チェイン ppp-in に移ります。
</para><para>
ppp-in チェインには 例6 によって設定したルールがありますので，こ
のルールのチェックを受けます。このルールにマッチしなければ，
ppp-in チェインを抜け，再び <command>input</command> チェインに戻ってきて
次のチェックを受けます。
</para><para>
このように <option>-j</option> は DENY，REJECT といったシンボルだけでなく，
チェインも指定することができます。
</para><para>
<example id="ex8">
<title></title>
<programlisting>
  ipchains -F ppp-in
</programlisting>
</example>
</para><para>
これは ppp-in チェインの内容を消去します。消去されるのは内容だけ
でチェイン自体は消去されません。消去するには <option>-X</option> を使います。
</para><para>
<example id="ex9">
<title></title>
<programlisting>
  ipchains -X ppp-in
</programlisting>
</example>
</para><para>
ppp-in チェインを消去します。ただし ppp-in チェインの内容が空の
場合にしか消去できません。まず <option>-F</option> で空にしてから 
<option>-X</option> で消去します。
</para>
</sect1>


<sect1 id="practice">
<title>実践編</title>
<para>
　PPP 接続をしている間はファイアウォールを設定し，それ以外はファ
イアウォールを設置しない，そういう状況を考えて設定してみましょう。
</para><para><literallayout>
# pppd は ip-up，ip-down というスクリプトを実行します。前者は接
# 続が確立された時，後者は切断された時に実行されます。ip-up には
# 引数が渡ります。$1 は接続に用いるインターフェイス，$2 は tty
# デバイス，$3 はシリアルスピード，$4 はローカルの IP アドレス，
# $5 はリモート側のIP アドレスです。
</literallayout></para><para>
ip-up は以下のようになりました。
</para><para>
<programlisting>
8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----

#!/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&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----
</programlisting>
</para><para>
ip-down は以下のような感じです
</para><para>
<programlisting>
8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----

#!/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&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----8&lt;-----
</programlisting>
</para><para>
　これまでの ipfwadm では ppp0 だけの特別な設定を任意に追加，削
除するといったことが非常に困難でしたが，チェインを使うことにより
非常にスマートに設定することができます。
</para>
</sect1>

<sect1 id="ipmasq">
<title>IP Masquerade の設定</title>
<para>
　これまで ipfwadm で設定していた IP Masquerade の設定は，<command>ipchains
</command> で行なうようになりました。以下のように記述します。
</para><para>
<example id="ex10">
<title></title>
<programlisting>
  ipchains -A forward -s 192.168.1.0/24 -d 0.0.0.0/0 -j MASQ
</programlisting>
</example>
</para><para>
注意) 新カーネルでは，デフォルトでパケットをフォワードしない設定
になっています。以下のようにしてフォワードを有効にします。
</para><para>
<programlisting>
  echo 1 &gt; /proc/sys/net/ipv4/ip_forward
</programlisting>
</para><para>
<simplelist>
<member>
(LinuxDoc 変換：2000/05/12, 中野武雄)
</member><member>
(DocBook 変換：2001/03/04, 千旦裕司)
</member>
</simplelist>
</para>
</sect1>

</article>
