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

目次

変更内容の概要

其の1では基本的なファイアーウォールモジュールの枠組みを準備しました。しかし、あれだけではフィルターする IP アドレスもコードに埋め込みなので、使い勝手がものすごく悪いです。なので、モジュールをロード、オープンしたあとでも専用コマンドをつかって、フィルターする IP アドレスを指定できるようにしました。 其の1でハードコーディングした IP アドレスをコマンドから変更できるようにしただけなので、まだ1つの IP アドレスからのパケットを「破棄」することしかできません。(泣)

ご注意

しつこいようですが、これはカーネルモジュールですのでプログラム上に問題があった場合即 system panic につながります。それを踏まえて panic してもよいマシンで検証してください。そんなマシンが無い場合は(普通あんまり無いとおもいますが)残念ながら試さないのが無難です。私も作成過程で何度となく panic させてます。なお、panic に備えて(?) /etc/vfstab の mount option に logging を設定してくのがお勧めです。fsck が走らない分再起動が早いです。(笑)

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

ソースファイル: fwall-0.2.tar.gz

tar ファイルに含まれるファイルの概要
Makefilefwall モジュール、fwalladm コマンド用の makefile
fwall.cfwall モジュールの本体
コマンドからの ioctl() コマンド(=M_IOCTLメッセージ)を解釈し、フィルターする IP を動的に変えられるように変更した。まだ1つの IP アドレスしかフィルタリングできない。
いずれは・・・きっと・・
fwall.hfwall モジュール、fwalladm コマンド共通の header ファイル
今のところあまり存在意義が少ない・・
fwalladm.cfwall モジュールのフィルタールールを変更するコマンド
IP デバイスを open() し、そのストリームに fwall モジュールを PUSH。その後、ioctl() を使って IP アドレスを fwall モジュールに伝える。
実行例: # fwalladm 192.168.49.7

使い方 その他

使い方

Makefile の中で、ネットワークインターフェース(hme0)の指定している個所がありますので、そこを適宜変更します。

ifconfig hme0 modinsert fwall@2

あと make、make install するだけで、モジュールがロードされ、ネットワークインターフェースと IP モジュールの間にに挿入されます。

# make
# make install

この段階ではフィルターする IP アドレスは設定されていません。モジュールと同時に作られる fwalladm コマンドにて拒否したい IP アドレスを指定します。

# /usr/local/bin/fwalladm 192.168.49.7

そうすると、以下のようなメッセージが /var/adm/messages ファイルに記録されます。

Mar 18 01:01:24 u1 fwall: [ID 964665 kern.notice] Return M_IOCACK
Mar 18 01:01:24 u1 fwall: [ID 850347 kern.notice] Rule Changed: 192.168.49.7

このあと、指定したアドレスから packet が到着すると、packet は破棄され、以下のメッセージが記録されます。

Mar 18 01:02:51 u1 fwall: [ID 782524 kern.notice] Packet Dropped

64bit 環境での利用

其の1でも記しましたように、gcc でも version 3.2.2 では 64bit モジュールが作れるようです。
ですので、Makefile を以下のように変更すれば、64bit 環境でも動作可能と思います。
下線の部分が 32bit 版からの変更点です。・・・・がまだ試してません。最近 私も Ultra-1 を手に入れて、どうやら Ultra-1 でも64bit カーネルを動作させることができるようなので今度試してみます。

追記 

2003-03-20 64bit モジュール

Ultra-1 が手に入ったので、早速 Solaris9 をいれて 64bit モードで起動し、以下の方法で 64bit モジュールを作ってテストしてみました。gcc で作った 64bit モジュールでもちゃんと動きました。^^; panic もしませんでした。

   CC = /usr/local/bin/gcc
   PRODUCTS = fwall fwalladm
   CCFLAGS =
   CCKFLAGS = ${CCFLAGS} -D_KERNEL -c -m64
   CCADMFLAGS = ${CCFLAGS} -lnsl
   LDFLAGS = -dn -r
   AUTOPUSH = /etc/autopush
   ECHO = /bin/echo
   CP = /bin/cp
   RM = /bin/rm
   LD = /usr/ucb/ld
   RM = /bin/rm
   CAT = /bin/cat
   AWK = /bin/awk
   MODLOAD = /usr/sbin/modload
   MODUNLOAD = /usr/sbin/modunload
   MODINFO = /usr/sbin/modinfo

   all: $(PRODUCTS)

   clean:
   ${RM} -f fwall fwall.o fwalladm

   fwall: fwall.c fwall.h
   $(CC) ${CCKFLAGS} fwall.c
   $(LD) ${LDFLAGS} fwall.o -o fwall

   fwalladm: fwalladm.c fwall.h
   $(CC) ${CCADMFLAGS} fwalladm.c -o fwalladm

   install:
   -$(CP) fwall /kernel/strmod/sparcv9/fwall
   -$(CP) fwalladm /usr/local/bin/fwalladm
   $(MODLOAD) fwall
   ifconfig hme0 modinsert fwall@2

   uninstall:
   ifconfig hme0 modremove fwall@2
   -$(MODUNLOAD) -i `$(MODINFO) | $(AWK) '/fwall/{ print $1 }'`
   -$(RM) /kernel/strmod/sparcv9/fwall
   -$(RM) /usr/local/bin/fwalladm


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