<Homeへもどる>   <前に戻る>

ipchainsのパケットフィルタリングでセキュリティ強化

 ipchainsはIPマスカレードとして良く知られているのと同時に、
パケットフィルタリングを行う、一種のファイアウォールとしても利用されている。
 だいたいどこを見ても

#ipchains -P forward DENY
#ipchains -A forward -s 192.168.1.0/24 -d 0.0.0.0/0 -j MASQ

 この2行だけは必ずと言っていいほど出てくる。
1行目で基本ポリシーを拒否(DENY)にし、
2行目では送信元IPアドレスが192.168.1.0/24の時、IPマスカレードの処理をするよう設定している。
(宛先の0.0.0.0/0は"全て"の意)
つまり、192.168.1.0/24をローカル(内)側とすると、内側から外側に対するパケットは
IPマスカレードするということで、複数のPCをインターネットに接続できる。
逆にそれ以外は拒否(DENY)している。

 さて、その書式は

ipchains <option> <chain> <アドレス等を含むルール> <option>

のようになる。

option  
-A ルールの追加
-D ルールの削除
-L ルールの表示
-C ルールのテスト
   
-p プロトコルの指定
-s 送信元IPアドレス
-d 宛先IPアドレス
-i インターフェース
-j ターゲットの指定
-l ログ
   
chain  
input 入ってくるパケットをチェック
forward 転送するパケットをチェック
output 出ていくパケットをチェック
   
ルール  
ACCEPT 許可
DENY 拒否
REJECT 拒否。ただし、送信元にICMPを返す
MASQ IPマスカレードする

 一般的に

・基本ポリシーの設定
・IPマスカレードの設定
・フィルタリングの設定

といった順で、スクリプトを書いたりルールを追加していく。
初めのうちは書式がやや複雑で取っ付きにくく、しかも、"どのパケットをどうするか"を
判断していかないとならないので、なかなか難しい。
どのサーバーがどのポートを使うかを知り、内(外)部からのパケットをどのように制御するか、
この辺りはじっくりと吟味し、また勉強していこう。

 とまぁ、知れば知るほど奥の深いipchainsだが、使っていくとなかなか面白い。
ちゃんと設定すればパケットフィルタの役目を果たすし、
比較的安全にサービスを外部に提供したり、
内部から外部へのアクセス制限もかけられるようになるからね。

 ここで重要なのは、基本ポリシーはDENY!ということ。

#ipchains -P input DENY
#ipchains -P output DENY
#ipchains -P forward DENY

 こうしないと、万が一設定が抜けてたり、間違っていたりしてもなかなか気付かない。
逆に、とりあえず全て拒否すれば、使いたい部分だけを個別に指定して許可できる。
感覚的にも”どんなパケットを許可しているか”を把握しているのは安心できる。

 ということで例。もしWEBサーバーを立ててそれを外部に公開したい場合。
(つまり、外部からWEBサーバーにアクセスを許可する)

#ipchains -A input -i eth1 -p tcp -d 0.0.0.0/0 www -j ACCEPT

とする。
WWWの部分は80としてポート番号を直接指定してもOK。
意味としては-Aでルールの追加を表し、inputチェインにそれを行う。
インターフェースはeth1でプロトコルにはTCPを、宛先アドレスは全てを指定し
ポートはWWW(80番)でACCEPTする。といった感じ。
 もし、サーバーの(グローバル)IPアドレスが固定なら、0.0.0.0/0ではなく、
そのIPアドレスを指定しても構わない。
今回は、動的に割り当てられる事を想定して"全て"にした。
おそらく、ほとんどのユーザーがISPより割り当てられる動的なIPだろうから。

ま、こんな感じでftpを解放したり、SSHを利用できるようにしたりと同様に設定していく。
 また、

#/sbin/ipchains -A input -j DENY -l
#/sbin/ipchains -A forward -j DENY -l
#/sbin/ipchains -A output -j DENY -l

として、-l オプションを付けるとログの記録もできる。
これを最後に記述すると、各ルールに於いて拒否したパケットについてログを記録していく。

 で、問題はこの設定は再起動をしたりすると全て消えてしまうということ。
万一にもサーバーがダウンしたりで再起動が必要な場合、再度これを入力しなくてはならない。
しかし、ルールを増やしていくと、いちいちそんなことはやってられない。
そこで、一つのスクリプトとして必要な記述をまとめ、(たとえば/etc/rc.d/firewall などに)
/etc/rc.d/rc.local 内でこのスクリプトを実行するようにするとよい。
 或いは、

#/sbin/ipchains-save -v > /etc/ipchains.rules

として、ルールを保存し、

#/sbin/ipchains-restore < /etc/ipchains.rules

で、設定内容を反映させる方法もある。

パケットを通す通さないはそれぞれの環境によっても変わってくる。
提供するべきサービスを吟味し、通すパケット・通さないパケットを判断しよう。
使いようによってはURLフィルタリング(もどき)なんかもできる。


 最後に、ipchainsの最新版はここからどうぞ→http://www.netfilter.org/ipchains/

<Homeへもどる>   <前に戻る>