Solaris でファイアーウォールを作ろう/其の5

目次

変更点の概要

其の4で今後の課題としていたものなどから、以下の機能を追加しました。

  • ルールにプロトコルを指定できるようにした。(ICMP, TCP, UDP)
  • ルールに送信元、あて先ポート番号(TCP・UDP)を指定できるようにした。
  • アドレス、ポート、プロトコルの指定時に、ワイルドカードとして「*」(アスタリスク)が利用できるようにした。

これでやっと一番単純なファイアーウォールの機能である「ポートフィルタリング」ができるようになりました。もともと、ルールを定義する fwall_rule_t 構造体には「ポート」や「プロトコル」をメンバーとして入れておいたので、fwall モジュール側では、たいした変更はしてません。単純に、各パケットの「ポート」や、「プロトコル」もチェックするようにしただけ。

ご注意

ここで紹介しているプログラムは、カーネルモジュールを含んでいます。そのため、プログラム上に問題があった場合(可能性大)にはシステムが PANIC し、場合によってはファイルシステムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。

ソースコードとダウンロード

ソースファイル: fwall-0.5.tar.gz (2005/03/11 コード大幅更新。機能的には変わってません。)

tar ファイルに含まれるファイルの概要
Makefilefwall モジュール、fwalladm コマンド用の makefile
fwall.cfwall カーネルモジュールのメインモジュール。
open(9E) や close(9E) 等のエントリポイントが書かれている。
fwall_rule.cfwall カーネルモジュールのルールに関わる操作用のモジュール。
設定されたルールにもとづいて、IP パケットを通過させたり、破棄したりする。
fwalladm コマンドからの ioctl() コマンド(=M_IOCTLメッセージ)を解釈し、通過を許可/拒否する IP を動的に追加・変更・削除できる。
fwall.hfwall モジュール、fwalladm コマンド共通のヘッダーファイル。
fwall_rule_t 構造体は、fwall モジュール、fwalladm コマンド双方で参照・利用される構造体。 fwall モジュールは fwalladm コマンドから指示されたルールを fwall_rule_t 構造体のリンクリストとして保持している。
fwalladm.cfwall モジュールのフィルタールールを変更するコマンド
IP デバイスを open() し、そのストリームに fwall モジュールを PUSH。その後、ioctl() を使ってルールの追加、削除、参照コマンドを fwall モジュールに伝える。
fwallcntlfwall の開始、停止を行うためのシェルスクリプト
fwallcntl start で、fwall モジュールをシステム上のすべての NIC の STREA に挿入
fwallcntl stop で、NIC の STREAM から fwall モジュールを抜き、モジュールをアンロードする。

各ソースはこちらで参照していただくこともできます。

http://github.com/kaizawa/fwall

本プログラムは 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 パケットをすべて許可し、それ以外はすべて破棄するというルールです。
注)アドレスに0を指定すると、すべてのアドレスに一致することになります。
「add rule」では、新規ルールをルールの一番最後に追加します。

ルールの表示

追加したルールは 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」を使います。
以下の例では上記例のルール番号3(Rule 3: 10.0.0.1 -> 10.0.0.2 ALLOW)を削除しています。

# /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

これ以外は同じです。

今後の課題

  1. プロトコル違反パケットや、異常なアクセスを拒否する
    これは・・・いつか・・・・きっと・・・ これをやるためにはまず RFC と格闘せねばならんですね。
  2. REJECT コマンドの実装
    REJECT「拒否」だと、ICMP メッセージや TCP の RESET パケットを返答しなければいけないので、結構面倒かも・・。「破棄」だけだとそんなに問題にはならないと思うのですが、返答パケットを返すとなると、へたすると通信相手とのパケットの応酬なんかになってしまう恐れが。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-01-03 (月) 20:22:10