開始行:
#norelated
*Solaris でファイアーウォールを作ろう/其の1
*目次 [#s23adbcc]
#contents
*概要 [#ic4b7432]
最近では自宅で ADSL などを利用して常時接続を実現されてい...
|Solaris 9 では [[SunScreen 3.2:http://jp.sun.com/solaris...
以前に DLPI を利用したパケットモニタープログラムを紹介し...
*ご注意 [#y353d87f]
ここで紹介しているプログラムは、カーネルモジュールです。...
あった場合にはシステムが panic し、場合によってはファイ...
こす可能性があります。&br;以下のプログラムはテストプログ...
したがってあくまで個人の検証ためにお使いいただき、重要な...
*ストリームの概要 [#x9176107]
以前にも書きましたが Solaris では各ネットワークプロトコル...
下図は TCP をつかっているプロセスからネットワークデバイス...
#ref(http://www.whiteboard.ne.jp/~admin2/pict/tcpip.gif,a...
&br;
-''ストリームヘッド''&br;
ストリームヘッドはカーネル内のSTREAMSモジュールとユーザプ...
-''ダウンストリーム''&br;
図の上から下へのデータの流れる方向。&br;
ユーザプロセスから書き込まれたデータは右図の下方に向かっ...
-''アップストリーム''&br;
図の下から上へデータが流れる方向。&br;
逆にネットワークから来るデータは、デバイスドライバから上...
-''TCPモジュールと IPモジュール''&br;
この2つのモジュールがいわゆる TCP/IP プロトコルのさまざ...
-''ストリームデバイスドライバ''&br;
ハードウェア(ネットワークカード)とデータのやり取りを行...
#clear
&br;
各モジュール/ドライバ間のデータのやり取りにはそれぞれ取り...
STREAMS については Sun のドキュメントページにある[[STREAM...
*プログラムのイメージ [#z67547f3]
上図のとおり、ネットワークから来るデータは、デバイスドラ...
さて、肝心の追加する自作 STREAMS モジュールですが、これは...
以下のコードで実現しているのは、ソースコード内で指定した...
STREAMS モジュールをつくる上必ずで必要となる「エントリー...
-''コンフィグレーションエントリーポイント'' &br;
これは、KERNEL がモジュールを ロードしたり、アンロードし...
これらには _init(9E)、_info(9E),、_fini(9E). があります。
|_init(9E)| モジュールの初期化ルーチン|
|_info(9E)| モジュール情報取得ルーチン|
|_fini(9E)| モジュール終了処理ルーチン|
これらは絶対必要です。・・・が下記のソースのように大して...
ソース上では分かりにくいかも知れませんが、modlinkage 構造...
modlinkage (modlinkage構造体)
|
+--- modlstrmod (modlstrmod構造体)
|
+--- mod_strmodops
|
+--- fw_fmodsw (fmodsw構造体)
|
+--- fwallinfo (streamtab構造体)
|
+--- rinit(qinit構造体)
| |
| +--- fwall_rput()
| +--- fwall_open()
| +--- fwall_close()
| +--- minfo
|
+--- winit (qinit構造体)
|
+--- fwall_rput()
+--- minfo
途中の構造体群の説明は省きます。man page や Sun のページ...
このツリーの最後に出てくる fwall_rput, fwall_open, fwall_...
|fwall_open()| このモジュールのオープンルーチン。モジュー...
|fwall_close()| このモジュールのクローズルーチン。モジュ...
|fwall_rput()| 下方のモジュール(上図ではデバイスドライバ...
|fwall_wput()| 上方のモジュール(上図では IP モジュール)...
open、close のルーチンはこのモジュールでは特に何もやって...
このモジュールが「何をするか?」を定義する一番重要なとこ...
fwall_rput() も fwall_wput() も最後に putnext() という関...
fwall_rput() が putnext() を呼んだ場合、次のモジュールは ...
*ソースコード [#h19f2acd]
CENTER:[[fwall.c>http://github.com/downloads/kaizawa/fwal...
1 /* Simple filter
2 * /usr/local/bin/gcc -D_KERNEL fwall.c -c
3 * ld -dn -r fwall.o -o fwall
4 */
5
6 /* added headers */
7 #include <sys/modctl.h>
8
9 /* sample headers */
10 #include <sys/types.h>
11 #include <sys/param.h>
12 #include <sys/stream.h>
13 #include <sys/stropts.h>
14 #include <sys/ddi.h>
15 #include <sys/sunddi.h>
16
17 /* header's for network */
18 #include <netinet/in.h>
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <sys/stropts.h>
22 #include <sys/dlpi.h>
23 #include <fcntl.h>
24 #include <sys/signal.h>
25 #include <sys/stream.h>
26 #include <net/if.h>
27 #include <netinet/if_ether.h>
28 #include <netinet/in_systm.h>
29 #include <netinet/tcp.h>
30 #include <netinet/ip.h>
31
32 #define REJECTADDR 0xac1d4958 /* 172.29.73.88 */
33
34
35 static int fwall_open (queue_t*, dev_t*, int, int...
36 static int fwall_rput (queue_t*, mblk_t*);
37 static int fwall_wput (queue_t*, mblk_t*);
38 static int fwall_close (queue_t*, int, int, cred_...
39
40 static struct module_info minfo =
41 { 0xdefe, "fwall", 1, INFPSZ, 512, 128 };
42
43 static struct qinit rinit = {
44 fwall_rput, NULL, fwall_open, fwall_close, NULL...
45
46 static struct qinit winit = {
47 fwall_wput, NULL, NULL, NULL, NULL, &minfo, NUL...
48
49 struct streamtab fwmdinfo={
50 &rinit, &winit, NULL, NULL};
51
52 static struct fmodsw fw_fmodsw ={
53 "fwall", &fwmdinfo, D_NEW | D_MP |D_MTQPAIR };
54
55 struct modlstrmod modlstrmod ={
56 &mod_strmodops, "simple module for test", &fw_f...
57
58 static struct modlinkage modlinkage ={
59 MODREV_1, (void *)&modlstrmod, NULL };
60
61 _init()
62 {
63 return (mod_install(&modlinkage));
64 }
65
66 _info(modinfop)
67 struct modinfo *modinfop;
68 {
69 return (mod_info(&modlinkage, modinfop));
70 }
71
72 _fini(void)
73 {
74 return (mod_remove(&modlinkage));
75 }
76
77
78 static int fwall_open (queue_t* q, dev_t *dev, in...
79 {
80 if (sflag != MODOPEN)
81 return EINVAL;
82 q->q_ptr = WR(q)->q_ptr = NULL;
83 qprocson(q);
84 return (0);
85 }
86
87 static int fwall_close (queue_t *q, int flag, int...
88 {
89 qprocsoff(q);
90 q->q_ptr = WR(q)->q_ptr = NULL;
91 return(0);
92 }
93
94 static int
95 fwall_wput(queue_t *q, mblk_t *mp)
96 {
97 putnext(q, mp);
98 return (0);
99 }
100
101 static int
102 fwall_rput(queue_t *q, mblk_t *mp)
103 {
104 struct ip *ip;
105
106 if (mp->b_datap->db_type == M_DATA) {
107 u_char *rptr = mp->b_rptr;
108 int dlen = mp->b_wptr - mp->b_rptr;
109 char msg[100];
110
111 ip = (struct ip *)&rptr[0];
112
113 sprintf(msg, "%d.%d.%d.%d -> %d.%d.%d.%d Len:...
114 ip->ip_src._S_un._S_un_b.s_b1, ip->ip...
ip->ip_src._S_un._S_un_b.s_b3, ip->ip_src._S_un._S_un_b....
115 ip->ip_dst._S_un._S_un_b.s_b1, ip->ip...
ip->ip_dst._S_un._S_un_b.s_b3, ip->ip_dst._S_un._S_un_b....
116 ip->ip_len, ip->ip_p);
117 cmn_err(CE_CONT, "%s",msg);
118
119 if( ip->ip_src._S_un._S_addr == REJECTADDR){
120 freemsg(mp);
121 cmn_err(CE_CONT, "Packet Dropped");
122 return(0);
123 }
124
125 } /* if M_DATA */
126
127 putnext(q, mp);
128 return (0);
129 }
ソースファイル [[fwall.c>http://github.com/downloads/kaiz...
*使い方 [#zf7012f2]
**コンパイル&インストール [#ad32af91]
コンパイルは本当は kernel モジュールなので Sun の compil...
# /usr/local/bin/gcc fwall.c -D_KERNEL -c
# /usr/ucb/ld -dn -r fwall.o -o fwall
あとは、出来上がった fwall モジュールを しかるべきところ...
# /bin/cp fwall /kernel/strmod/fwall
sun4u マシンで 64bit kernel をつかっていて、64bit モジュ...
# /bin/cp fwall /kernel/strmod/sparcv9/fwall
**ファイアーウォールモジュールをロードする [#q9b39d2d]
上でインストールしたモジュールをロードします。これは modl...
# /usr/sbin/modload fwall
続いて、ロードしたモジュールをデバイスドライバ と IPモジ...
# ifconfig le0 modinsert fwall@2
モジュールが追加されているかどうかを確認します。
# ifconfig le0 modlist
0 arp
1 ip
2 fwall <------ le(デバイスドライバ)と IP モジュールの...
3 le
比較のため、追加される前は以下のように見えます。
# ifconfig le0 modlist
0 arp
1 ip
2 le
上記手順がちょっと面倒くさいので Makefile を作って一気に...
# make
# make install
・・で、コンパイル、ロード、モジュールの追加まで一気に行...
# make uninstall
・・ で、モジュールの取り外し、アンロード、アンインストー...
CENTER:[[Makefile.fwall>src:Makefile.fwall]]
1 CC = /usr/local/bin/gcc
2 PRODUCTS = fwall
3 AUTOPUSH = /etc/autopush
4 ECHO = /bin/echo
5 CP = /bin/cp
6 RM = /bin/rm
7 LD = /usr/ucb/ld
8 RM = /bin/rm
9 CAT = /bin/cat
10 AWK = /bin/awk
11 MODLOAD = /usr/sbin/modload
12 MODUNLOAD = /usr/sbin/modunload
13 MODINFO = /usr/sbin/modinfo
14
15
16 all: $(PRODUCTS)
17
18 clean:
19 rm -f fwall fwall.o
20
21 fwall: fwall.c
22 $(CC) fwall.c -D_KERNEL -c
23 $(LD) -dn -r fwall.o -o fwall
24
25 install:
26 -$(CP) fwall /kernel/strmod/fwall
27 $(MODLOAD) fwall
28 ifconfig le0 modinsert fwall@2
29
30 uninstall:
31 ifconfig le0 modremove fwall@2
32 -$(MODUNLOAD) -i `$(MODINFO) | $(AWK) '/f...
33 -$(RM) /kernel/strmod/fwall
これで、あなたのマシンにも自家製ファイアーウォールが導入...
このコードでは 32 行目で指定している 172.29.73.88 とい...
32 #define REJECTADDR 0xac1d4958 /* 172.29.73.88 */
アドレスは比較が簡単なように16進で表現しました。ここを貴...
あと、ひとつの IP アドレスからのパケット破棄だけではちょ...
113 sprintf(msg, "%d.%d.%d.%d -> %d.%d.%d.%d Len:...
114 ip->ip_src._S_un._S_un_b.s_b1, ip->ip...
115 ip->ip_dst._S_un._S_un_b.s_b1, ip->ip...
116 ip->ip_len, ip->ip_p);
117 cmn_err(CE_CONT, "%s",msg);
次回はもーちょっと機能を充実したものに挑戦してみます。
終了行:
#norelated
*Solaris でファイアーウォールを作ろう/其の1
*目次 [#s23adbcc]
#contents
*概要 [#ic4b7432]
最近では自宅で ADSL などを利用して常時接続を実現されてい...
|Solaris 9 では [[SunScreen 3.2:http://jp.sun.com/solaris...
以前に DLPI を利用したパケットモニタープログラムを紹介し...
*ご注意 [#y353d87f]
ここで紹介しているプログラムは、カーネルモジュールです。...
あった場合にはシステムが panic し、場合によってはファイ...
こす可能性があります。&br;以下のプログラムはテストプログ...
したがってあくまで個人の検証ためにお使いいただき、重要な...
*ストリームの概要 [#x9176107]
以前にも書きましたが Solaris では各ネットワークプロトコル...
下図は TCP をつかっているプロセスからネットワークデバイス...
#ref(http://www.whiteboard.ne.jp/~admin2/pict/tcpip.gif,a...
&br;
-''ストリームヘッド''&br;
ストリームヘッドはカーネル内のSTREAMSモジュールとユーザプ...
-''ダウンストリーム''&br;
図の上から下へのデータの流れる方向。&br;
ユーザプロセスから書き込まれたデータは右図の下方に向かっ...
-''アップストリーム''&br;
図の下から上へデータが流れる方向。&br;
逆にネットワークから来るデータは、デバイスドライバから上...
-''TCPモジュールと IPモジュール''&br;
この2つのモジュールがいわゆる TCP/IP プロトコルのさまざ...
-''ストリームデバイスドライバ''&br;
ハードウェア(ネットワークカード)とデータのやり取りを行...
#clear
&br;
各モジュール/ドライバ間のデータのやり取りにはそれぞれ取り...
STREAMS については Sun のドキュメントページにある[[STREAM...
*プログラムのイメージ [#z67547f3]
上図のとおり、ネットワークから来るデータは、デバイスドラ...
さて、肝心の追加する自作 STREAMS モジュールですが、これは...
以下のコードで実現しているのは、ソースコード内で指定した...
STREAMS モジュールをつくる上必ずで必要となる「エントリー...
-''コンフィグレーションエントリーポイント'' &br;
これは、KERNEL がモジュールを ロードしたり、アンロードし...
これらには _init(9E)、_info(9E),、_fini(9E). があります。
|_init(9E)| モジュールの初期化ルーチン|
|_info(9E)| モジュール情報取得ルーチン|
|_fini(9E)| モジュール終了処理ルーチン|
これらは絶対必要です。・・・が下記のソースのように大して...
ソース上では分かりにくいかも知れませんが、modlinkage 構造...
modlinkage (modlinkage構造体)
|
+--- modlstrmod (modlstrmod構造体)
|
+--- mod_strmodops
|
+--- fw_fmodsw (fmodsw構造体)
|
+--- fwallinfo (streamtab構造体)
|
+--- rinit(qinit構造体)
| |
| +--- fwall_rput()
| +--- fwall_open()
| +--- fwall_close()
| +--- minfo
|
+--- winit (qinit構造体)
|
+--- fwall_rput()
+--- minfo
途中の構造体群の説明は省きます。man page や Sun のページ...
このツリーの最後に出てくる fwall_rput, fwall_open, fwall_...
|fwall_open()| このモジュールのオープンルーチン。モジュー...
|fwall_close()| このモジュールのクローズルーチン。モジュ...
|fwall_rput()| 下方のモジュール(上図ではデバイスドライバ...
|fwall_wput()| 上方のモジュール(上図では IP モジュール)...
open、close のルーチンはこのモジュールでは特に何もやって...
このモジュールが「何をするか?」を定義する一番重要なとこ...
fwall_rput() も fwall_wput() も最後に putnext() という関...
fwall_rput() が putnext() を呼んだ場合、次のモジュールは ...
*ソースコード [#h19f2acd]
CENTER:[[fwall.c>http://github.com/downloads/kaizawa/fwal...
1 /* Simple filter
2 * /usr/local/bin/gcc -D_KERNEL fwall.c -c
3 * ld -dn -r fwall.o -o fwall
4 */
5
6 /* added headers */
7 #include <sys/modctl.h>
8
9 /* sample headers */
10 #include <sys/types.h>
11 #include <sys/param.h>
12 #include <sys/stream.h>
13 #include <sys/stropts.h>
14 #include <sys/ddi.h>
15 #include <sys/sunddi.h>
16
17 /* header's for network */
18 #include <netinet/in.h>
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <sys/stropts.h>
22 #include <sys/dlpi.h>
23 #include <fcntl.h>
24 #include <sys/signal.h>
25 #include <sys/stream.h>
26 #include <net/if.h>
27 #include <netinet/if_ether.h>
28 #include <netinet/in_systm.h>
29 #include <netinet/tcp.h>
30 #include <netinet/ip.h>
31
32 #define REJECTADDR 0xac1d4958 /* 172.29.73.88 */
33
34
35 static int fwall_open (queue_t*, dev_t*, int, int...
36 static int fwall_rput (queue_t*, mblk_t*);
37 static int fwall_wput (queue_t*, mblk_t*);
38 static int fwall_close (queue_t*, int, int, cred_...
39
40 static struct module_info minfo =
41 { 0xdefe, "fwall", 1, INFPSZ, 512, 128 };
42
43 static struct qinit rinit = {
44 fwall_rput, NULL, fwall_open, fwall_close, NULL...
45
46 static struct qinit winit = {
47 fwall_wput, NULL, NULL, NULL, NULL, &minfo, NUL...
48
49 struct streamtab fwmdinfo={
50 &rinit, &winit, NULL, NULL};
51
52 static struct fmodsw fw_fmodsw ={
53 "fwall", &fwmdinfo, D_NEW | D_MP |D_MTQPAIR };
54
55 struct modlstrmod modlstrmod ={
56 &mod_strmodops, "simple module for test", &fw_f...
57
58 static struct modlinkage modlinkage ={
59 MODREV_1, (void *)&modlstrmod, NULL };
60
61 _init()
62 {
63 return (mod_install(&modlinkage));
64 }
65
66 _info(modinfop)
67 struct modinfo *modinfop;
68 {
69 return (mod_info(&modlinkage, modinfop));
70 }
71
72 _fini(void)
73 {
74 return (mod_remove(&modlinkage));
75 }
76
77
78 static int fwall_open (queue_t* q, dev_t *dev, in...
79 {
80 if (sflag != MODOPEN)
81 return EINVAL;
82 q->q_ptr = WR(q)->q_ptr = NULL;
83 qprocson(q);
84 return (0);
85 }
86
87 static int fwall_close (queue_t *q, int flag, int...
88 {
89 qprocsoff(q);
90 q->q_ptr = WR(q)->q_ptr = NULL;
91 return(0);
92 }
93
94 static int
95 fwall_wput(queue_t *q, mblk_t *mp)
96 {
97 putnext(q, mp);
98 return (0);
99 }
100
101 static int
102 fwall_rput(queue_t *q, mblk_t *mp)
103 {
104 struct ip *ip;
105
106 if (mp->b_datap->db_type == M_DATA) {
107 u_char *rptr = mp->b_rptr;
108 int dlen = mp->b_wptr - mp->b_rptr;
109 char msg[100];
110
111 ip = (struct ip *)&rptr[0];
112
113 sprintf(msg, "%d.%d.%d.%d -> %d.%d.%d.%d Len:...
114 ip->ip_src._S_un._S_un_b.s_b1, ip->ip...
ip->ip_src._S_un._S_un_b.s_b3, ip->ip_src._S_un._S_un_b....
115 ip->ip_dst._S_un._S_un_b.s_b1, ip->ip...
ip->ip_dst._S_un._S_un_b.s_b3, ip->ip_dst._S_un._S_un_b....
116 ip->ip_len, ip->ip_p);
117 cmn_err(CE_CONT, "%s",msg);
118
119 if( ip->ip_src._S_un._S_addr == REJECTADDR){
120 freemsg(mp);
121 cmn_err(CE_CONT, "Packet Dropped");
122 return(0);
123 }
124
125 } /* if M_DATA */
126
127 putnext(q, mp);
128 return (0);
129 }
ソースファイル [[fwall.c>http://github.com/downloads/kaiz...
*使い方 [#zf7012f2]
**コンパイル&インストール [#ad32af91]
コンパイルは本当は kernel モジュールなので Sun の compil...
# /usr/local/bin/gcc fwall.c -D_KERNEL -c
# /usr/ucb/ld -dn -r fwall.o -o fwall
あとは、出来上がった fwall モジュールを しかるべきところ...
# /bin/cp fwall /kernel/strmod/fwall
sun4u マシンで 64bit kernel をつかっていて、64bit モジュ...
# /bin/cp fwall /kernel/strmod/sparcv9/fwall
**ファイアーウォールモジュールをロードする [#q9b39d2d]
上でインストールしたモジュールをロードします。これは modl...
# /usr/sbin/modload fwall
続いて、ロードしたモジュールをデバイスドライバ と IPモジ...
# ifconfig le0 modinsert fwall@2
モジュールが追加されているかどうかを確認します。
# ifconfig le0 modlist
0 arp
1 ip
2 fwall <------ le(デバイスドライバ)と IP モジュールの...
3 le
比較のため、追加される前は以下のように見えます。
# ifconfig le0 modlist
0 arp
1 ip
2 le
上記手順がちょっと面倒くさいので Makefile を作って一気に...
# make
# make install
・・で、コンパイル、ロード、モジュールの追加まで一気に行...
# make uninstall
・・ で、モジュールの取り外し、アンロード、アンインストー...
CENTER:[[Makefile.fwall>src:Makefile.fwall]]
1 CC = /usr/local/bin/gcc
2 PRODUCTS = fwall
3 AUTOPUSH = /etc/autopush
4 ECHO = /bin/echo
5 CP = /bin/cp
6 RM = /bin/rm
7 LD = /usr/ucb/ld
8 RM = /bin/rm
9 CAT = /bin/cat
10 AWK = /bin/awk
11 MODLOAD = /usr/sbin/modload
12 MODUNLOAD = /usr/sbin/modunload
13 MODINFO = /usr/sbin/modinfo
14
15
16 all: $(PRODUCTS)
17
18 clean:
19 rm -f fwall fwall.o
20
21 fwall: fwall.c
22 $(CC) fwall.c -D_KERNEL -c
23 $(LD) -dn -r fwall.o -o fwall
24
25 install:
26 -$(CP) fwall /kernel/strmod/fwall
27 $(MODLOAD) fwall
28 ifconfig le0 modinsert fwall@2
29
30 uninstall:
31 ifconfig le0 modremove fwall@2
32 -$(MODUNLOAD) -i `$(MODINFO) | $(AWK) '/f...
33 -$(RM) /kernel/strmod/fwall
これで、あなたのマシンにも自家製ファイアーウォールが導入...
このコードでは 32 行目で指定している 172.29.73.88 とい...
32 #define REJECTADDR 0xac1d4958 /* 172.29.73.88 */
アドレスは比較が簡単なように16進で表現しました。ここを貴...
あと、ひとつの IP アドレスからのパケット破棄だけではちょ...
113 sprintf(msg, "%d.%d.%d.%d -> %d.%d.%d.%d Len:...
114 ip->ip_src._S_un._S_un_b.s_b1, ip->ip...
115 ip->ip_dst._S_un._S_un_b.s_b1, ip->ip...
116 ip->ip_len, ip->ip_p);
117 cmn_err(CE_CONT, "%s",msg);
次回はもーちょっと機能を充実したものに挑戦してみます。
ページ名: