FireWallの構築方法

目次

最近、安全なシステムには何かとファイアーウォールの導入を考えてしまう様で、ソフトウェアファイアーウォールとしてはLinuxのipchainsを導入する企業が多いのではないでしょうか。それは低コストなPCサーバーの妥当な使い方だと思います。Solarisでもまた同じく低コストファイアーウォールを考えている管理者も多いと思いはずです。そこで今回はSolarisだけではなくBSDやIRIXなどでも定番のツールipfilterを紹介します(尚、FreeBSDには標準で装備されています)。ただしファイアーウォールを導入したからといって単純にセキュリティーレベルが確保されるわけではありますん。ファイアーウォールはネットワークパフォーマンスや利便性の低下の原因になる場合もあります。

ipfilterの基本動作
パケットフィルタ
ダイナミックパケットフィルタ
NATの設定
syslogを使ったログ出力
戻る

ipfilterの基本動作

インストール方法はメインページのインストールログを参考にして下さい。ここではSolarisプラットフォームにインストールしているものと仮定していますのでインストール先ディレクトリが/opt/ipfになっている事に注意して下さい。インストールが済めば一度ipfilterの動作確認をしてみましょう。以下の様にして/etc/init.d/ipfbootスクリプトを実行してみてください。

# /etc/init.d/ipboot start

また次の様にすればipfilterを終了させることなく設定ファイルの修正を反映できます。

# /etc/init.d/ipboot reload

ipfilterの設定は/etc/opt/ipf/ipf.confというファイルで行います。ipfilter中に含まれるmkfiltersコマンドはifconfigの結果から最低限必要とされるフィルタのルールを出力します。このコマンドはperlスクリプトであることに注意して実行してください。

# perl /opt/ipf/bin/mkfiltres

いろいろ設定を加えていくと、現在どのような設定が有効になっているかを知りたい場合があると思います。この場合にはipfstatコマンドを起動することによって現在有効になっているルールがipf.conf形式で出力されます。

# /sbin/ipfstat -i

パケットフィルタ

ポリシーのルールは/etc/opt/ipf/ipf.confに記述します。次に設定項目を示しますのでそれを参考に設定ファイルipf.confを作成してください。

pass
行の先頭には必ずpassか次に紹介するblockのどちらかを記述します。passは以降の条件にマッチしたパケットの通過の許可を意味します。

block
blockは、以降の条件にマッチしたパケットの通過の拒否を意味します。

in
2番目には必ずinか次に紹介するoutのどちらかを記述します。inは入力パケットを意味します。

out
outは出力パケットを意味します。

quick
このキーワードを指定するとこの行の条件にマッチした時点で、そのパケットに対してpassかblockの条件を適用し、パケットのマッチング処理を終了します。特に問題がなりかぎり、このキーワードも全ての行に記述しておきましょう。このキーワードを指定しない場合は、ファイルの先頭から順にパケットがその行のルールにマッチするかチェックが行われ、最後にマッチした行のルールがパケットに適用されます。

on xxx
このキーワードはインターフェイスを指定するルールであることを示します。xxxにはインターフェイス名を指定して下さい。

proto tcp
プロトコルを指定します。指定可能なキーワードはtcp udp icmp tcp/udpです。

from any
パケットの始点アドレスを指定します。anyは全てのアドレスを意味するキーワードです。その他にIPアドレスやプレフィックス(127.0.0.0/8)などの表記が使えます。

to x.x.x.x port = xx
パケットの終点アドレスを指定します。ここではx.x.x.xのIPアドレスのxx番ポートを指定しています。名をportの設定はproto tcpを指定した場合のみ有効です。

keep state
ダイナミックにパケットを許可する場合に記述します。一般にTCPのSYN/ACKパケットを通過させる場合に使用します。もちろん戻りパケットの通過を許可している場合そのルールを記述すれば不要です。

all
from any to anyの省略形で全ての通信を意味します。

log
これを記述された行のルールはlogキーワードによって記録される事を意味します。

<優先順位>
例としまして次のルールを参考にしてください。ipfilterの特徴の1つに、初めに全て拒否するルールを記してある事がわかると思います(ここでquickを入れてはいけません)。その後で該当するルールがあればそのルールに従った許可が有効になります。

block in log quick from any to any with ipopts
block in log quick proto tcp from any to any with short

#
block in log all
pass in from 127.0.0.1/32 to 127.0.0.1/32
pass in from 192.168.3.1/32 to any

pass in from 192.168.3.2/32 to any
block out log all
pass out from any to 127.0.0.1/32
pass out from any to
192.168.3.1/32
pass out from any to
192.168.3.2/32

まず初めに入ってくる方向のルールが記されています 。中断は192.168.3.セグメントと192.168.3.セグメントのホストから許可します。下段は,出ていく方のパケットに対するルールです。

<スプーフィング防止>
もっとも基本的なFireWallのセキュアな設定です。外部からローカルに割り振られたIPアドレスで侵入してくるスプーフィングを防ぎます。

block in log quick from any to any with ipopts
block in log quick proto tcp from any to any with short
#
block in log quick on dmfe0 from 127.0.0.0/8 to any
block in log quick on dmfe1 from 127.0.0.0/8 to any

block in log quick on dmfe1 from 10.0.0.0/8 to any
block in log quick on dmfe1 from 169.254.0.0/16 to any
block in log quick on dmfe1 from 172.16.0.0/12 to any
block in log quick on dmfe1 from 192.168.0.0/16 to any

<ループバックの許可>
下記はlocalhostで送受信するパケットの許可を許可ししています。

pass in quick on lo0 all
pass out quick on lo0 all

<Keep Stateを用いた特定のサービスの許可>
下記はwww(
192.168.3.10)で送受信するパケットの許可を許可ししています。(外部→内部)

block in log all
pass in quick on dmfe0 proto tcp from any to 192.168.3.10 port = 80 keep state

これに対し、各NICに対応させたパケットフィルタを行いたい場合は次の様にグループ化します。

block in on dmfe0 log all head 100
pass in quick on dmfe0 proto tcp
from any to 192.168.3.10 port = 80 keep state group 100
block in on dmfe1 log all head 200
pass in quick on dmfe1 proto tcp
from any to 192.168.4.10 port = 80 keep state group 200
block in on dmfe2 log all head 300
pass in quick on dmfe2 proto tcp from 192.168.0.0/24 to any port = 80 keep state group 300

keep stateを用いる事によりこの様に双方(SYN SYN/ACK)のパケットを意識せずにルールを記述できます、これはダイナミックにSYN/ACKパケットが対応することより、ダイナミックパケットフィルタとも呼ばれています。詳しくは次を参考にしてください。

ダイナミックパケットフィルタ

TCPプロトコルで通信を行う場合は、必ず双方向に通信が行われます。これは通信接続が正確に確立されているのかどうかを確認するための手段と考えて下さい。接続要求をサーバーに送るパケットをSYNパケットと呼びます。SYNパケットを受け取ったサーバーはSYN/ACKフラグをセットしたパケットを送信します。サーバーからACKフラグがセットされたパケットをクライアントが受け取り接続が確立します。この様にクアイアントからサーバーに接続を行うとサーバーはクライアントに対する戻りパケットの通信も発生しています。このためipfilterの様なソフトウェアで通信を制限する場合、この戻り方向の通信が制限されない様に設定を行う必要があります。もちろんSYN/ASKの通信はサーバーからクアイアントに対する新規の接続と区別する必要があります。そこでSYN/ASK及びASKを許可するオプションがKeep Stateになります。
尚、UDPには戻りパケットはありませんのでKeep Stateオプションを付ける必要はありません。

NATの設定

ipfilterではNAT(LinuxでいうIPマスカレード)や複数のIPアドレスを利用したNAPTなどの複雑な設定を行うことが可能です。複雑な設定方法はipnatの専門のページを参考にしてください。設定は/etc/opt/ipf/ipnat.confを編集します。

map dmfe1 192.168.0.0/24 -> 192.168.3.1/32 portmap tcp/udp 10000:65000

上記の内容は192.168.0.0/24から192.168.3.1のdmfe1インターフェイスを経由して192.168.3.0/24に向かう全ての通信に対してNAPTを行う設定です。一般では192.168.3.0/24がインターネットになります。NAPTで利用するポート番号は10000から65000に制限していますが、この設定は必須ではありません。設定が済めば次の様に設定を反映して下さい。

# /etc/init.d/ipfboot reload

以上でNAPTは動作します。

syslogを使ったログ出力

ipfilterはsyslogに対応しています。デフォルトではlocal0ファシリティにログ出力しますので/etc/syslog.confに次の1行を追加して下さい。

local0.warning /var/log/ipf.log

syslogの詳しい説明はメインページのUNIXシステム管理を参考にして下さい。そちらでも触れましたがプライオリティーとアクション間ではタブ文字である必要があります。syslog.confに指定した様に/var/log/ipf.logを作成してからsyslogdを再起動します。

touch /var/log/ipf.conf
chmod 644 /var/log/ipf.conf
pkill -HUP syslogd

以上で作業は終了です。


<戻る>