#norelated
 #navi(Solaris でファイアーウォールを作ろう)
 *目次 [#sc014392]
 #contents
 
 *変更点の概要 [#t63fad2b]
 [[其の4>Solaris でファイアーウォールを作ろう/其の4]]で今後の課題としていたものなどから、以下の機能を追加しました。
 
 -ルールにプロトコルを指定できるようにした。(ICMP, TCP, UDP)
 -ルールに送信元、あて先ポート番号(TCP・UDP)を指定できるようにした。
 -アドレス、ポート、プロトコルの指定時に、ワイルドカードとして「*」(アスタリスク)が利用できるようにした。
 
 これでやっと一番単純なファイアーウォールの機能である「ポートフィルタリング」ができるようになりました。もともと、ルールを定義する fwall_rule_t 構造体には「ポート」や「プロトコル」をメンバーとして入れておいたので、fwall モジュール側では、たいした変更はしてません。単純に、各パケットの「ポート」や、「プロトコル」もチェックするようにしただけ。
 
 *ご注意 [#gc14f71c]
 ここで紹介しているプログラムは、カーネルモジュールを含んでいます。そのため、プログラム上に問題があった場合(可能性大)にはシステムが PANIC し、場合によってはファイルシステムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。
 
 *ソースコードとダウンロード [#p1173f3b]
 ソースファイル: [[fwall_5.tar>src:fwall_5.tar]] (2005/03/11 コード大幅更新。機能的には変わってません。)
 ソースファイル: [[fwall-0.5.tar.gz>http://github.com/downloads/kaizawa/fwall/fwall-0.5.tar.gz]] (2005/03/11 コード大幅更新。機能的には変わってません。)
 
 |>|CENTER:tar ファイルに含まれるファイルの概要|h
 |[[Makefile>source:fwall_5/Makefile]]|	fwall モジュール、fwalladm コマンド用の makefile|
 |[[fwall.c>source:fwall_5/fwall.c]]| 	fwall カーネルモジュールのメインモジュール。&br;open(9E) や close(9E) 等のエントリポイントが書かれている。|
 |[[fwall_rule.c>source:fwall_5/fwall_rule.c]]| 	fwall カーネルモジュールのルールに関わる操作用のモジュール。&br;設定されたルールにもとづいて、IP パケットを通過させたり、破棄したりする。&br;fwalladm コマンドからの ioctl() コマンド(=M_IOCTLメッセージ)を解釈し、通過を許可/拒否する IP を動的に追加・変更・削除できる。|
 |[[fwall.h>source:fwall_5/fwall.h]] 	|fwall モジュール、fwalladm コマンド共通のヘッダーファイル。&br;fwall_rule_t 構造体は、fwall モジュール、fwalladm コマンド双方で参照・利用される構造体。 fwall モジュールは fwalladm コマンドから指示されたルールを fwall_rule_t 構造体のリンクリストとして保持している。|
 |[[fwalladm.c>source:fwall_5/fwalladm.c]]| 	fwall モジュールのフィルタールールを変更するコマンド&br;IP デバイスを open() し、そのストリームに fwall モジュールを PUSH。その後、ioctl() を使ってルールの追加、削除、参照コマンドを fwall モジュールに伝える。|
 |[[fwallcntl>source:fwall_5/fwallcntl]]| 	fwall の開始、停止を行うためのシェルスクリプト&br;fwallcntl start で、fwall モジュールをシステム上のすべての NIC の STREA に挿入&br;fwallcntl stop で、NIC の STREAM から fwall モジュールを抜き、モジュールをアンロードする。|
 |Makefile|	fwall モジュール、fwalladm コマンド用の makefile|
 |fwall.c| 	fwall カーネルモジュールのメインモジュール。&br;open(9E) や close(9E) 等のエントリポイントが書かれている。|
 |fwall_rule.c| 	fwall カーネルモジュールのルールに関わる操作用のモジュール。&br;設定されたルールにもとづいて、IP パケットを通過させたり、破棄したりする。&br;fwalladm コマンドからの ioctl() コマンド(=M_IOCTLメッセージ)を解釈し、通過を許可/拒否する IP を動的に追加・変更・削除できる。|
 |fwall.h|fwall モジュール、fwalladm コマンド共通のヘッダーファイル。&br;fwall_rule_t 構造体は、fwall モジュール、fwalladm コマンド双方で参照・利用される構造体。 fwall モジュールは fwalladm コマンドから指示されたルールを fwall_rule_t 構造体のリンクリストとして保持している。|
 |fwalladm.c| 	fwall モジュールのフィルタールールを変更するコマンド&br;IP デバイスを open() し、そのストリームに fwall モジュールを PUSH。その後、ioctl() を使ってルールの追加、削除、参照コマンドを fwall モジュールに伝える。|
 |fwallcntl| 	fwall の開始、停止を行うためのシェルスクリプト&br;fwallcntl start で、fwall モジュールをシステム上のすべての NIC の STREA に挿入&br;fwallcntl stop で、NIC の STREAM から fwall モジュールを抜き、モジュールをアンロードする。|
 
 各ソースはこちらで参照していただくこともできます。~
 >>
 http://github.com/kaizawa/fwall
 <<
 
 本プログラムは Sparc マシンの 64bit Solaris 9、Solaris 10 上で動作を確認しております。
 
 *使い方 その他 [#y651de98]
 **コンパイル&インストール [#n085fefd]
 
 [[「其の4」>Solaris でファイアーウォールを作ろう/其の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        
 
 **モジュールのロード [#nf3f2b7e]
 
 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
 &br;
  # /usr/local/bin/fwalladm
  >
 
 **ルールの追加 [#mfdb0d73]
 
 パケットの「プロトコル」と、「ポート」を見るようになったために、fwalladm コマンドの「add rule」と「insert rule」が変更されました。ルールの追加時に、これらの情報も指定する必要があります。ただし、「*」(アスタリスク)を指定すればワイルドカードになり、常に「マッチ」となります。&br;
 新規のルールの設定の仕方は以下のようにします。
 
  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 パケットをすべて許可し、それ以外はすべて破棄するというルールです。&br;
 注)アドレスに0を指定すると、すべてのアドレスに一致することになります。&br;
 「add rule」では、新規ルールをルールの一番最後に追加します。
 
 **ルールの表示 [#l8a8a053]
 
 追加したルールは fwalladm コマンドの「list rule」で確認できます。&br;
 各行は、どのアドレスの、どのプロトコルの、どのポートへの通信が許可されているか否かを表示します。
 
  # /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
 
 **ルールの挿入 [#n06739cc]
 
 既存のルールとルールの間に新規ルールを追加したい場合には「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 番ポートへのパケットを破棄するルールを追加しています。
 
 **ルールの削除 [#m353ff91]
 
 設定したルールを削除する場合には、fwalladm コマンドの「delete rule」を使います。&br;
 以下の例では上記例のルール番号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
 
 **インターフェースの追加 [#d5602e79]
 
 fwall モジュールでパケットの調査を行うネットワークインターフェースを fwalladm コマンドから設定できるようにしました。インターフェースの追加には「add interface」を使います。
 
  # /usr/local/bin/fwalladm
  > add interface hme0
 
 この例では hme0 というネットワークインターフェースを調査対象として追加しています。
 
 **インターフェースの表示 [#l1dea639]
 
 ルールの場合と同じく「list interface」とすると、現在パケットの調査をおこなう対象となっているネットワークインターフェースの一覧が表示されます。
 
  > list interface
  hme
  le
 
 この出力から、現在 hme と le の二つのインターフェースが調査対象になっているのが分かります。
 
 **インターフェースの削除 [#q3659305]
 
 ネットワークインターフェースをパケット調査の対象からはずしたい場合には「delete interface」を使います。
 
  > delete interface hme0
  > list interface
  le
 
 上記例では hme0 を調査対象から削除しています。
 
 **モジュールのアンロード&アンインストール [#e82380bd]
 
 モジュールをアンロードするには「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 環境での利用 [#e140e3ef]
 
 32bit 環境では Makefile32 という Makefile をつかって、コンパイル、インストールが行えます。
 
  # make -f Makefile32
  # make -f Makefile32 install
  # make -f Makefile32 uninstall
 
 これ以外は同じです。
 
 *今後の課題 [#u9adf003]
 
 +プロトコル違反パケットや、異常なアクセスを拒否する&br;
 これは・・・いつか・・・・きっと・・・ これをやるためにはまず RFC と格闘せねばならんですね。
 +REJECT コマンドの実装&br;
 REJECT「拒否」だと、ICMP メッセージや TCP の RESET パケットを返答しなければいけないので、結構面倒かも・・。「破棄」だけだとそんなに問題にはならないと思うのですが、返答パケットを返すとなると、へたすると通信相手とのパケットの応酬なんかになってしまう恐れが。
 
 #navi(Solaris でファイアーウォールを作ろう)


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS