Solaris でファイアーウォールを作ろう/其の5目次†変更点の概要†其の4で今後の課題としていたものなどから、以下の機能を追加しました。
これでやっと一番単純なファイアーウォールの機能である「ポートフィルタリング」ができるようになりました。もともと、ルールを定義する fwall_rule_t 構造体には「ポート」や「プロトコル」をメンバーとして入れておいたので、fwall モジュール側では、たいした変更はしてません。単純に、各パケットの「ポート」や、「プロトコル」もチェックするようにしただけ。 ご注意†ここで紹介しているプログラムは、カーネルモジュールを含んでいます。そのため、プログラム上に問題があった場合(可能性大)にはシステムが PANIC し、場合によってはファイルシステムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。 ソースコードとダウンロード†ソースファイル: fwall-0.5.tar.gz (2005/03/11 コード大幅更新。機能的には変わってません。)
各ソースはこちらで参照していただくこともできます。 本プログラムは Sparc マシンの 64bit Solaris 9、Solaris 10 上で動作を確認しております。 使い方 その他†コンパイル&インストール†「其の4」の時と同様に、基本的に、make install ではモジュールとコマンドのコピーだけを行い、起動スクリプトと、コマンドでモジュールのロード・アンロード、パケットの調査を行うネットワークインターフェースの指定を行います。 # make /usr/local/bin/gcc -g -D_KERNEL -c -m64 fwall.c /usr/ucb/ld -dn -r fwall.o -o fwall /usr/local/bin/gcc -g -lnsl fwalladm.c -o fwalladm # make install /bin/cp fwall /kernel/strmod/sparcv9/fwall /bin/cp fwalladm /usr/local/bin/fwalladm /bin/cp fwallcntl /usr/local/bin/fwallcntl モジュールのロード†make install が終わった直後は、モジュールのロードも、ルールの設定も行われていません。まずは fwallcntl という起動スクリプトを使って、モジュールをロードし、STREAM に fwall モジュールを挿入します。 # /usr/local/bin/fwallcntl start これによって、システム上のすべてのネットワークインターフェースに関連する STREAM に fwall モジュールが挿入され、パケットを調査する準備ができました。続いてはパケットの通過許可・不許可を決めるルールを設定します。これには fwalladm コマンドを使います。 Usage: fwalladm insert rule <rule number> <protocol> <src port> <dest port> <src address> <destion address> <action> add rule <protocol> <src port> <dest port> <src address> <dest address> <action> delete rule <rule number> list rule add interface <interface> delete interface <interface> list interface # /usr/local/bin/fwalladm > ルールの追加†パケットの「プロトコル」と、「ポート」を見るようになったために、fwalladm コマンドの「add rule」と「insert rule」が変更されました。ルールの追加時に、これらの情報も指定する必要があります。ただし、「*」(アスタリスク)を指定すればワイルドカードになり、常に「マッチ」となります。 add rule <プロトコル> <送信元ポート> <あて先ポート> <送信元アドレス> <あて先アドレス> <動作> 例) # /usr/local/bin/fwalladm > add rule TCP * 80 * * ALLOW > add rule TCP 80 * * * ALLOW > add rule UDP * * 10.0.0.1 10.0.0.2 ALLOW > add rule * * * * * DENY これは、ポート 80 への TCP パケット、または、ポート 80 からの TCP パケットをすべて許可し、また、10.0.0.1 から 10.0.0.2 宛ての UDP パケットをすべて許可し、それ以外はすべて破棄するというルールです。 ルールの表示†追加したルールは fwalladm コマンドの「list rule」で確認できます。 # /usr/local/bin/fwalladm > list rule Rule 0: *(*) -> *(80) TCP ALLOW Rule 1: *(80) -> *(*) TCP ALLOW Rule 2: 10.0.0.1(*) -> 10.0.0.2(*) TCP ALLOW Rule 3: *(*) -> *(*) * DENY ルールの挿入†既存のルールとルールの間に新規ルールを追加したい場合には「insert rule」を使います。 insert rule <ルール番号> <プロトコル> <送信元ポート> <あて先ポート> <送信元アドレス> <あて先アドレス> <動作> 例) # /usr/local/bin/fwalladm insert rule 2 TCP 25 * * * DENY > list rule Rule 0: *(*) -> *(80) TCP ALLOW Rule 1: *(80) -> *(*) TCP ALLOW Rule 2: *(25) -> *(*) TCP DENY Rule 3: 10.0.0.1(*) -> 10.0.0.2(*) TCP ALLOW Rule 4: *(*) -> *(*) * DENY 上記の例ではルール2として 25 番ポートへのパケットを破棄するルールを追加しています。 ルールの削除†設定したルールを削除する場合には、fwalladm コマンドの「delete rule」を使います。 # /usr/local/bin/fwalladm > delete rule 3 > list rule Rule 0: *(*) -> *(80) TCP ALLOW Rule 1: *(80) -> *(*) TCP ALLOW Rule 2: *(25) -> *(*) TCP DENY Rule 3: *(*) -> *(*) * ALLOW インターフェースの追加†fwall モジュールでパケットの調査を行うネットワークインターフェースを fwalladm コマンドから設定できるようにしました。インターフェースの追加には「add interface」を使います。 # /usr/local/bin/fwalladm > add interface hme0 この例では hme0 というネットワークインターフェースを調査対象として追加しています。 インターフェースの表示†ルールの場合と同じく「list interface」とすると、現在パケットの調査をおこなう対象となっているネットワークインターフェースの一覧が表示されます。 > list interface hme le この出力から、現在 hme と le の二つのインターフェースが調査対象になっているのが分かります。 インターフェースの削除†ネットワークインターフェースをパケット調査の対象からはずしたい場合には「delete interface」を使います。 > delete interface hme0 > list interface le 上記例では hme0 を調査対象から削除しています。 モジュールのアンロード&アンインストール†モジュールをアンロードするには「fwallcntl」シェルスクリプトを使います。 # /usr/local/bin/fwallcntl stop また、インストールしたモジュール、コマンドをシステムから削除するためには make を行ったディレクトリ上で「make uninstall」を実行します。 # make uninstall /usr/local/bin/fwallcntl stop fwall module removed from all interface fwall module successfully unloaded /bin/rm /kernel/strmod/sparcv9/fwall /bin/rm /usr/local/bin/fwalladm /bin/rm /usr/local/bin/fwallcntl 32bit 環境での利用†32bit 環境では Makefile32 という Makefile をつかって、コンパイル、インストールが行えます。 # make -f Makefile32 # make -f Makefile32 install # make -f Makefile32 uninstall これ以外は同じです。 今後の課題†
|