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
使い方 その他†使い方†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 モジュールが作れるようです。 追記 †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 |