ipchains

※ファイヤーウォール機能を実現することができるソフトです。
 IPマスカーレードなど、高機能な設定をすることができます。

※kernel自体がIPマスカレードに対応していることが前提です。
 具体的には、以下のオプションがセットされて再構築されている
 必要があります。(Kernel-2.2.xの場合です。2.2より前のものは
 「ipfadm」で行いますが、指定方法が異なりますので、ここでは
 触れません。)

※「ルーティング」「マスカレード」「ポートフォワード」「パケットフィルタ」
 といった用語を理解することが、ipchainsをマスターするのに必要に
 なります。関連のサイトで情報を取得してください。

Kernel-2.2.xの「.config」ファイル
-------------------------------------------------------------------------
CONFIG_FIREWALL=y
CONFIG_INET=y
CONFIG_IP_FIREWALL=y
CONFIG_IP_MASQUERADE=y
CONFIG_IP_MASQUERADE_ICMP=y
-------------------------------------------------------------------------

【ダウンロード】
ftp://ftp.rustcorp.com/ipchains
(これは何故か障害でつながらないようです)

または

http://netfilter.filewatcher.org/ipchains/
(これも何故か障害でつながらないようです)

または

http://netfilter.samba.org/ipchains/
(これも何故か障害でつながらないようです)

または

http://www.gsdr.dc.ufscar.br/download/ISOs/ragnar/net/


【展開】
(以下の作業はrootで行ってください)
# cd /usr/src
# gzip -cd ipchains-1.3.10.tar.gz | tar xvf -

【コンパイル】
# cd /usr/src/ipchains-1.3.10
# make clean
# make

【インストール】
# make install

【バージョンの確認】
# /sbin/ipchains --version

【事前確認】
まず、以下を入力して、IPマスカレードが有効になっているかを
テストしてみてください。

# cat /proc/sys/net/ipv4/ip_forward

ここで「1」が表示されていればOKです。
(そうでないときは、以下のように手で入力します
# echo 1 > /proc/sys/net/ipv4/ip_forward)


【設定】
※ここでの例は、192.168.0.0がルータ・インターネット側(eth0)で、
 192.168.1.0がLAN側(eth1)です。
 (ただしわたしの環境にはDMZ内にPCはありません)


※ipchainsにおけるパケットの評価の順序
 1.Checksum のチェック(通信自体が正常かのチェック)
 2.Sanity のチェック(パケットが正常なフォーマットで来ているかのチェック)
 3.Input-chain のチェック
 4.Demasquerade のチェック
 5.Routing Decision のチェック
  → ここでルーティングするか(LocalかForwardか)を決定します。 
 5-1.Localの時
  ・eth0でもeth1でもなく、lo向けになります。
  ・最後にOutput-chain のチエック
 5-2.Forwardの時
  ・Forward-chainのチェック
  ・最後にOutput-chainのチェック

※チェインとルール
ipchainsでは、「チェイン」と「ルール」の種類と設定オプションは
以下のとおりです。

【チェイン】
 ・チェインの作成(-N)
 ・チェインの削除(-X)
 ・チェインのポリシー変更(-P)
 ・チェインの表示(-L)
 ・チェインを空にする(-F)

【ルール】
 ・ルールの追加(-A)
 ・ルールの削除(-D)
 ・ルールの挿入(-I))
 ・ルールの置換(-R)


システム起動時に自動登録する前に、必ず手で入力してみて、
ネットワークのセキュリティポリシーに沿った動作をしているかを
確認します。

ipchain の指定は、input(パケットが入ってくるときにチェック)、
output(出ていくときにチェック)、forward(他のホストにルーティング
するときにチェック)で行います。許可は「ACCEPT」、禁止は「DENY」で、
IPマスカレードは「MASQ」で指定します。(必ず英大文字で指定)
禁止には「REJECT」もありますが、拒絶したことを通知してしまうので、
禁止は「DENY」の方が良いと思います。


※ipchainの設定方法
以下は、あくまで1つの例にすぎません。実際には各ネットワークにあうように、
自分でアレンジする必要があります。

※設定した順で評価されるので、その辺をうまく考えてください。
 一度ヒットしたルールの次の行以降は評価されません。

---------------------------------------------------------------
◎まず全体としてのポリシーを指定
# ipchains -P input ACCEPT
# ipchains -P output ACCEPT
# ipchains -P forward DENY

◎外部から、LAN内のアドレスを偽って入ってくるのを禁止する
# ipchains -A input -i eth0 -s 192.168.1.0/24 -d 0/0 -j DENY

◎LAN内から、インターネットを利用を許可する
# ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ

◎外部からのPing(ICMP)を禁止
# ipchains -A input -i eth0 -p icmp -s 0/0 -d 192.168.1.0/24 -j DENY

◎WindowsのNetBiosパケットが、外部に出ていかないように禁止する
# ipchains -A forward -p tcp -s 192.168.1.0/24 137:139 -d 0/0 1024:65535 -j DENY
# ipchains -A forward -p udp -s 192.168.1.0/24 137:139 -d 0/0 1024:65535 -j DENY

◎WindowsのNetBiosパケットが、外部から入ってくるのを禁止する
# ipchains -A forward -p tcp -s 0/0 137:139 -d 0/0 -j DENY
# ipchains -A forward -p udp -s 0/0 137:139 -d 0/0 -j DENY
※Windows2000がLAN内にあるときは、次の行も指定してください
# ipchains -A forward -p tcp -s 0/0 445 -d 0/0 -j DENY
# ipchains -A forward -p udp -s 0/0 445 -d 0/0 -j DENY

◎外部からLANへのメール(ポート25)を中継する(LAN内のメールサーバを192.168.1.106とします)
# ipchains -A forward -p tcp -s 0/0 1024:65535 -d 192.168.1.106 25 -j ACCEPT

◎LANから外部へメール(ポート25)を中継する(LAN内のメールサーバを192.168.1.106とします)
# ipchains -A forward -p tcp -s 192.168.1.106 25 -d 0/0 1024:65535 -j ACCEPT

◎LANからのFTP(ポート20、21)を許可する(デフォルトポリシーにより外部からは禁止)
# ipchains -A forward -p tcp -s 192.168.1.0/24 1024:65535 -d 0/0 20 -j ACCEPT
# ipchains -A forward -p tcp -s 192.168.1.0/24 1024:65535 -d 0/0 21 -j ACCEPT

◎LANからのtelnet(ポート23)を許可する(デフォルトポリシーにより外部からは禁止)
# ipchains -A forward -p tcp -s 192.168.1.0/24 1024:65535 -d 0/0 23 -j ACCEPT

◎LANからのDNS(ポート53)を許可する(デフォルトポリシーにより外部からは禁止)
# ipchains -A forward -p udp -s 192.168.1.0/24 53 -d 0/0 1024:65535 -j ACCEPT


---------------------------------------------------------------
この他、いろいろ便利な指定もできます。

[-s と -d を入れ替えたルールを一度に設定]
  -b -s 192.168.1.0/24 -d 0/0

 こうすると、次の2行を一行で表現したことになります。
  -s 192.168.1.0/24 -d 0/0
  -s 0/0 -d 192.168.1.0/24

 ただし、ipchains-HOWTOの作者は、個人的にこれが好きでないそうです。
 わたしも、アドレスの指定は一方向で考えたほうが良いと思います。
 ですから、わたしも「-b」オプションは使っていません。

[除外指定]
 -p tcp -s 192.168.1.30 ! 80 → ホスト192.168.1.30のポート80以外のポート
 -p tcp -s ! 192.168.1.30 80 → ホスト192.168.1.30以外のホストのポート80

[ログ記録を残す]
 「-l」(英小文字のエル)オプションを使います。
 パケットの数が少なく、「拒絶」したときに指定すると良いでしょう。

[TOSの設定] パフォーマンスを「-t」でチューニングすることもできます。(例)
  [telnet] -p tcp -d 0/0 telnet -t 0x01 0x10
  [ftp] -p tcp -d 0/0 telnet -t 0x01 0x10
  [ftp-data] -p tcp -d 0/0 ftp -t 0x01 0x08

  以上の例は、次の表(パラメータと主な用途)によります。

  Minimum Delay     :0x01 0x10 ftp/telnet 用
  Maximum Throughput :0x01 0x08 ftp-data 用
  Maximum Reliability  :0x01 0x04 snmp 用
  Minimum Cost     :0x01 0x02 nntp 用
---------------------------------------------------------------


※ipchainsで指定した設定を確認するには、以下のようにします。
# ipchains -L -n
(もっと詳しくみるには「ipchains -L -n -v」とします)

※ipchainsで設定したものを、削除するには、以下のようにします。
# ipchains -D input 〜
# ipchains -D output 〜
# ipchains -D forward 〜
(〜は、設定時に指定した通りそのまま入力します。)
※登録した番号で削除する方法もありますが、「-A」を「-D」に変更する、と
 おぼえた方がルールがおぼえられて良いかと思います。


【ルールのチェイン化】(例)
ルールをそのまま入力しますと、設定が煩雑になります。
そこで、ルールをチェイン化してまとめることができます。
ここでは、インターネット(Global)からLAN(Local)に入ってくる
チェインを例にあげます。

まず、チェインを作成します。(チェイン名は8文字以内)
# ipchains -N glb-loc

次に、ルールをチェイン指定で入力します。
# ipchains -A input -i eth0 -j glb-loc
# ipchains -A glb-loc -i eth0 -p tcp -s 0/0 -d 192.168.1.0/24 ssh -j ACCEPT
# ipchains -A glb-loc -s 0/0 53 -d 192.168.1.0/24 -p udp -j ACCEPT
# ipchains -A glb-loc -j DENY -l

ためしにルールがどの様に指定されたかを確認してください。
# ipchains -L -n -v

チェインを削除するには、以下のようにします。
# ipchains -D input -i eth0 -j glb-loc
# ipchains -F glb-loc
# ipchains -X glb-loc

※「-F」と「-X」をしなければ、再度「-A」することにより、また設定できます。
 各設定は記憶されているので、便利です。(設定と解除を頻繁に繰り返す方は
ぜひ使ってみてください。)

このチェイン化の方法は、ルールを頻繁に設定したり解除したりする
ときには有用ですが、インターネット側へのアクセスがPPPならいざしらず、
Ethernet+ルータの場合は頻繁に変更する必要もそうはないので、
無理に使わなくてもかまいません。

そんなわけで、わたしはチェインを使わずに、いつも「いちいち手打ち」で
やっています。


【起動時に自動的に設定する】

# cd /etc/rc.d
# vi rc.local (例)
-----------------------------------------------------------------
  ・・・・・・
# Starting ipchains......
#  echo 1 > /proc/sys/net/ipv4/ip_forward ←必要に応じてコメント「#」をはずしてください。
/sbin/ipchains -P input ACCEPT
  ・・・・・・
(上でテストした通りを記述します。ただし、「/sbin/ipchains」ではじめてください。)
-----------------------------------------------------------------
「:wq!」で保存終了します。

※システム起動時にあらかじめセットされている指定を除外します。
# cd /etc/sysconfig
# vi ipchains
----------------------------------------------------
:input ACCEPT
:forward DENY
:output ACCEPT
(上記以外をコメント化【行頭に#】または削除します)
----------------------------------------------------
「:wq!」で保存終了します。

※モジュールのロード
 IPマスカレードに各種モジュールを対応できるように、ロードするようにします。
 ためしに手でうって、OKなら起動時に自動的にロードするように設定します。

# depmod -a
# modprobe ip_masq_ftp.o
# modprobe ip_masq_irc.o
# modprobe ip_masq_raudio.o
# modprobe ip_masq_cuseeme.o
# modprobe ip_masq_vdolive.o

その後、

# lsmod

でロードされているか確認します。
ためしに、クライアントマシンからFTPとかを試して動作チェックをします。
OKなら、起動時に自動起動するように設定します。

# cd /etc/rc.d
# vi rc.local
ファイルの最後(ipchains起動の記述の後)に以下を追加します
----------------------------------------
# Load modules for ipchains...
depmod -a
modprobe ip_masq_ftp.o
modprobe ip_masq_irc.o
modprobe ip_masq_raudio.o
modprobe ip_masq_cuseeme.o
modprobe ip_masq_vdolive.o

----------------------------------------
「:wq!」で保存終了します。


再起動して、再度動作チェックしてみてください。
# shutdown -r now