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