
ipchains mini HOWTO

おおつかまさひと

negi@KU3G.org

1999/02/05

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Table of Contents
1. はじめに
2. 基礎知識
3. ipchains の使い方
4. チェインの作成と応用
5. 実践編
6. IP Masquerade の設定

1. はじめに

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

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

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

2. 基礎知識

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

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

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

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

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

3. ipchains の使い方

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

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

Example 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   

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

Example 3.
  ipchains -D input 1                                                  

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

Example 4.
  ipchains -D input -s 192.168.1.0/24 -j DENY                          

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

4. チェインの作成と応用

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

Example 5.
  ipchains -N ppp-in                                                   

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

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

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

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

Example 8.
  ipchains -F ppp-in                                                   

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

Example 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 で行
なうようになりました。以下のように記述します。

Example 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                               

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

