Logo address

TCP ポートのアクセス制御

2000/10/07

UNIX の TcpWrapper は UNIX をインターネットにさらす場合の必需品である。TcpWrapper は TCPポートへの外部からのアクセスを制御する事に徹したシンプルなプログラムであり、そのシンプルさ故にバグをいつまでも残す事はないであろう。

Plan9 には UNIX の TcpWrapper に相当するソフトウェアツールは存在しない。その代わり、Plan9 に備えつけのツールだけを使って遥かに強力な制御ができる。

FTP ポート(TCP21)を例に解説しよう。
このアクセスの口は

	/bin/service/tcp21
に存在する。tcp21 は単にシェルスクリプトである。

この中で
(1). TCP21 にアクセスしてきたリモートホストの IP とポート番号
(2). TCP21 コールを受け取ったローカルホストの IP とポート番号
を受け取る事が可能で、その下で匿名アクセス者に許すアクセス空間を指定できる。

Plan9 は1つのホストに複数の IP を割りつける事ができる。その場合に(2) の情報が必要になる。

#!/bin/rc
ifs0=$ifs
ifs=! r=`{cat $3/remote}
ifs=! l=`{cat $3/local}
ifs=$ifs0

switch($l(1)){
case 202.250.160.122
        sysname=plan9
        switch($r(1)){
        case 192.168.[6-9].* 202.16.124.* 202.250.165.*
                exec /bin/ip/ftpd  -a -n/lib/namespace.ftp.plan9.local $*
        case *
                exec /bin/ip/ftpd -a -n/lib/namespace.ftp.plan9 $*
        }
case 202.250.160.40
        sysname=ar
        exec /bin/ip/ftpd -a -n/lib/namespace.ftp.ar $*
}

$3 には例えば

	/net/tcp/90
のような情報が渡される。最後の 90 はコネクション番号である。従って
	cat $3/remote
の内容は
	cat /net/tcp/90/remote
で得られる
	164.46.240.3!18617
と同じものである。

アクセス空間の制御

/lib/namespace.ftp.plan9
# bootes' root
mount -a #s/boot /

# this cuts off everything not mounted below /usr/web
bind  /usr/arisawa/netlib /usr/none

# this cuts off everything not mounted below /usr/none
bind /usr/none /