ADSLでお気軽自宅サーバ

ADSLが安くなってきたんで自宅でサーバを上げたいって人は結構いると思います。 このページでは、自宅でお気軽にサーバを上げるにはどうすればいいのかを説明していきます。 サーバの環境ですがこれは私の環境で書いていきます。

機械の準備

機械
IBM ThinkPad 560X
OS
Plan9 Revision 4

NICはDNSの解決のために2枚必要です。

3C589D 1020-102F IRQ15
3CXE589ET 1030-103F IRQ9

こういう至って普通の構成で最終的には自宅でWebサーバを立ち上げるところまで説明します

準備

Windows環境でNICのIOアドレスやIRQを調べておきます。2枚NICを刺すので、あらかじめ1枚の設定を変更しておきます。今回は、IOアドレス0x310, IRQ 15に変えておきました。

ダウンロード

ここからBootable Floppy イメージを取得します。

その前に、EtherLinkIIIのIRQ/Addrを調べておきます。Windows MEなどで調べると後で痛い目をみます。DOSで調べましょう。また、PCMCIA 0に刺しておかないとダメです。

Boot device
First floppy drive
Hard Disk
そのまま
Ethernet(s)
3COM Etherlink III PCMCIA (3C589)
IRQ 10
Addr 300
Video
Generic 800X600 LCD

freebsd.orgとかからrawriteを拾ってきてFloppy Imageを作ります。

作成したフロッピーで起動します。なお、以下キーボードがUSキーボードの設定になってますので、キーボード表面の刻印と違っているものがあります。これは後で変更します。

起動をすると、メッセージが出てきてグラフィカルウィンドウが立ち上がります。左上のウィンドウに設定を行うための質問が出てきます。まず、partdiskでpartdiskを選択。sdC0を選択。d p1でp1を削除。d p2でp2を削除。a p1 0 1024で全パーティションをPlan9に割り当て。t p1 PLAN9でp1をPlan9に設定。wで書き込み。qで終了

prepdiskを選択。/dev/sdC0/plan9に割り付け。デフォルトのままでOK。

,9fat 0 20482
,fs 20482 4052569
,swap 4052569 4128705

wで書き込み。qで終了

mountfsを選択。/dev/sdC0/fsを選択。

configdistを選択。Distributionをnetで選択

confignetを選択。

etherを選択。選択できない場合は、イーサカードの設定が変です。

manualを選択。環境によってはDHCPでもいいです。192.168.1.40/255.255.255.0を与えます。ゲートウェーは192.168.1.1

downloadを選択。しばらく待ちましょう

copydistを選択。またしばらく待ちましょう

bootsetupを選択。で、エラーになるので、別ウィンドウを開き、9fat:を実行し、/n/9fatをマウント

Enable boot methodでplan9を選択。

finishを選択

フロッピーをいれたままReturnを押す。すると、Feel free to turn off your computerと言われる。これで、電源を落とせます。

環境設定

NICを2枚さしますので、この時点で2枚目のNICを刺して接続します。

と思ったのですが、2枚だと後がめんどいのでとりあえず1枚刺しで設定してから2枚に移行します

Plan9でrebootします。user[none]を聞いてきますので、glendaを選んでおきます。この時点で存在するユーザはglendaだけです。

disk/kfscmd allowを実行して、このシステムに対する全権を取得しておきます。

下記の様に入力してplan9.iniを修正する準備をします

disk/kfscmd allow
9fat:
cd /n/9fat
sam plan9.ini

samはエディタです。ether0の記述を参考に、ether1の記述をしておきます。

ether0=type=3C589 port=0x300 irq=10 media=10BaseT //EtherLink III D
ether1=type=3C589 port=0x310 irq=15 media=10BaseT //EtherLink III B

/rc/bin/termrcの下記のコメントをはずします。また、設定を追加します。デフォルトでは2枚目のNICをマウントしないのでその設定を追加します。

if(! test -e /net/ipifc/0/ctl)
	ip/ipconfig -g 192.168.1.1 ether /net/ether0 add 192.168.1.32 255.255.255.0 >/dev/null >[2=1]
bind -a '#l1' /net
ip/ipconfig -g 192.168.1.1 ether /net/ether1 add 192.168.1.33 255.255.255.0 >/dev/null >[2=1]

#if(test -e /net/ipifc/0/ctl)
#	ndb/dns -rf $NDBFILE
ndb/dns -r

disk/kfscmd haltを発行して一旦停止して^t^trで再起動します。下記の様に2つめのNICが認識されています。

#l0: xcur10BaseT 3C589
#l0: 3C589: 10Mbps port 0x300 irq 10: 0020AFFAD7B7
#Y1: 3Com Corporation;3C589D;TP/BNC LAN Card Ver. 2a;00002; irq 10, port 240
#l1: xcur10BaseT 3C589
#l1: 3C589: 10Mbps port 0x310 irq 15: 0060088B00C8

ネットワーク関係のデータベースを設定します。データベースは/lib/ndb/localです。 DNSサーバ、NICのMACアドレス、NICのIPアドレス、ドメイン名などは環境に合わせて変えて下さい。

#
#  files comprising the database, use as many as you like, see ndb(6)
#
database=
	file=/lib/ndb/local
	file=/lib/ndb/common

ipnet=moroohome
	ip=192.168.1.0
	ipmask=255.255.255.0
	dns=dns.nifty.com
	ipgw=192.168.1.1

ip=192.168.1.32
	ether=0060088b00c8 //EtherLink III D
	proto=il
	sys=tp560x
	dom=tp560x.moroo.nanako.jp

ip=192.168.1.33
	ether=0020affad7b7
	proto=il
	dom=tp560xalt.moroo.nanako.jp

dom=dns.nifty.com ip=202.248.37.74

この時点でのplan9.ini, termrc, localを下記に置いておきます。

プログラムの更新

ベル研のサーバに接続して、最新のパッチを当てます。ここでユーザ登録します。ユーザ名とパスワードを覚えておいて下さい。質問に答えると、ダウンロードするコマンドが表示されます。このコマンドを実行すると先ほど入力したユーザ名とパスワードを聞いてきますので答えてやれば自動的に最新の物を持ってきます

ユーザ作成

このところでユーザを作っておきましょう。disk/kfscmd allowを実行しておいて下記の様にします

disk/kfscmd 'newuser jun'

リブートして作成したユーザでログインし、

disk/kfscmd allow
/sys/lib/newuser
mail -c
を実行してユーザディレクトリを作成します。あとでCPUサーバにするので、bootesとnoneの2つのユーザも作っておきます。

キーボード設定

前述の様に、Thinkpad 560Xの日本国内版のキーボードは、US版の配列と違います。そこで、キーボードの設定を変更します。変更するための方法は現時点では下記の2つがあります。愛知大学の方においてある方法は、起動時にキーボードの設定を選択できるなどより望ましいのですが、残念ながらVersion 3のものですので、今回は大阪府立大学の方においてある方法、すなわち、単純にキーボードの設定を変更する方法を用いました。

パッチを当てたkbd.cを下記に置いておきます。

kbd.c

下記の様にしてカーネルを作り直し、置き換えます

mkdir kbd
cd kbd
hget http://kbd.c > kbd.c
bind -bc . /sys/src/9/pc
cd /sys/src/9/pc
mk 'CONF=pcdisk'
disk/kfscmd allow
9fat:
cp 9pcdisk /n/9fat/9pcdisk

cpuサーバへの移行

cpuサーバの所有者の作成

ここまでで作成したものはterminalサーバです。terminalサーバは、認証を行いませんのでインターネットサービスを行うのに不向きです。インターネット上のサーバにするのが目的ですので、これからCPUサーバへ変更します。

まず、CPUサーバ自体の所有者を作成します。先にbootesを作っておきましたので、このユーザを所有者にします。

bootesでログインして、cpurcを書き換えます。ndb/csの設定の直前にipconfigの設定を追加します。また、sysnameの設定をipconfigの設定の前に持っていきます。keyfsの設定のコメントをはずします。il566プロトコルで使用するための名前の変更に関するコメントをはずします。また、cpuサーバでrioを使うためにいくつかの設定をします。設定されたcpurcを下記に置いておきます。ここの記述だとcpuサーバでもrioを動かせる様に書いてありますが、実際には'#i'が設定できないため動かせません。

cpurc

SSHキーの作成

SSHのキーを作成します。

aux/ssh_genkey
chgrp -u bootes /sys/lib/ssh/hostkey.*

ネットワークの設定

ネットワークの設定に認証サーバを追加します。追加した例はここです。

下記の様にして確認してみるのはいいことです。

ndb/ipquery ip your.ip.add.ress auth
ndb/ipquery ip your.ip.add.ress cpu
ndb/ipquery ip your.ip.add.ress ntp

認証の作成

/lib/ndb/authを書き換えます。書き換えた例はここです。

認証サーバの場合、il566とtcp567のサービスを停止します。Plan9ではサービスの起動は/rc/serviceに記述されたtcp*, il*で設定します。認証関係は/rc/bin/service.authです。

cd /rc/bin/service.auth
mv authsrv.il566 il566
mv authsrv.tcp567 tcp567

カーネルの作成

ここでカーネルのコンパイルを行いますが、デフォルトの認証サーバカーネルではデバイスがサポートされていません。そこで、デバイスを追加した認証サーバカーネルの設定を作成します。作成した例はここです。

作成したカーネルのコンフィグレーションをtpauthとします。下記の様にしてカーネルを作ります。この時に、キーボード設定を書き換えるのを忘れない様に。Plan9の場合、/sys/src/9/pcを触らなくてもカーネルを作ることができます。

cd
mkdir cpu
cd cpu
cp どこか/tpauth .
cp ../kbd/kbd.c .
bind -bc . /sys/src/9/pc
cd /sys/src/9/pc
mk 'CONF=tpauth'
9fat:
cp 9tpauth /n/9fat

nvramの作成

swapから最後の1セクタを切り取り、nvramとします

term% cd /dev/sdC0
term% disk/prep plan9
  9fat                  0 20482      (20482 sectors, 10.00 MB)
  fs                20482 4052569   (4032087 sectors, 1.92 GB)
  swap           4052569 4128705   (76136 sectors, 37.17 MB)
>>> d swap
>>> p
  9fat                  0 20482      (20482 sectors, 10.00 MB)
  fs                20482 4052569   (4032087 sectors, 1.92 GB)
  empty          4052569 4128705   (76136 sectors, 37.17 MB)
>>> a swap 4052569 4128704
>>> a nvram 4128704 4128705
>>> p
  9fat                  0 20482      (20482 sectors, 10.00 MB)
  fs                20482 4052569   (4032087 sectors, 1.92 GB)
' swap           4052569 4128704   (76135 sectors, 37.17 MB)
' nvram          4128704 4128705   (1 sectors, 512 B )
>>> w
>>> q

nvramに適当なものを書いて次回の立ち上げ時に聞いてくる様にします

echo boo > /dev/sdC0/nvram

cronとtimesyncの設定

timesyncの設定をntpサーバに変更します。また、cronのログを下記の様にして作成できる様にします

cd /sys/log
touch cron
chgrp -u sys cron
chmod a+aw cron

再起動

rebootします。bootするカーネルを聞いてきますので、tpauthを選びます。先ほどnvramの内容を変更しておいたので、authid, authdom, secstore key, passwordを聞いてきます。authidには、bootesを与えて下さい。authdomはこの機械の属するFQDNを与えます。secstore key, passwordは適当な秘密のパスワードを与えます。

bad nvram key
bad authencation id
bad authencation domain
authid: bootes
authdom: moroo.nanako.jp
secstore key: password1
password; password2
kfs...version...time...

ユーザの設定

ユーザの設定を行います。ユーザの設定は、auth/changeuserコマンドを使います。ここで、bootesも含めてユーザの登録を行います

auth/changeuser bootes
Password: password
Confirm password: password
assign Inferno/POP secret? (y/n) y
make it the same as the plan 9 password? (y/n) y
Expiration date (YYYYMMDD or never)[return = never]: 
Post id: 
User's full name:Bootes
Department #: 
User's email address: bootes@moroo.nanako.jp
Sponsor's email address: 

user bootes installed for Plan 9

ネットワーク関係の設定

il17007を起動する様にします。

disk/kfscmd allow
mv /bin/service/_il17007 /bin/service/il17007

/lib/ndb/localにauthdomの記述を追加します。作成した/lib/ndb/localをここに置いておきます。

factotumを追加します。この設定が必要か不明です

auth/factotum -g 'dom=moroo.nanako.jp proto=p9sk1 user=bootes !password=xxxxxxx'
auth/factotum -g 'dom=moroo.nanako.jp proto=p9sk1 user=jun !password=xxxxxxx'

Webサーバの立ち上げ

Plan9 4th Editionで動作するWebサーバには、ベル研究所が配付している物と、愛知大学の有沢さんが配付している物の2つがあります。 ここでは、ベル研の配付している物の設定を行います

httpdの設定

webサーバの使用する名前空間の定義は、/lib/namespace.httpdで行います。名前空間は、コンソールが立ち上がった状態が起点となります。今回の設定では単純に/usr/web以下にwebドキュメントを展開しているとします。

この場合、httpdは/usr/webを/にbindするので、/lib/namespace.httpdには空のファイルを置いておくだけになります。

httpdはアクセスされたリクエストごとに/sys/lib/httpd.rewriteに記述されている書き換えを行います。もし、バーチャルホストを行うのであれば、これを書き換えます。特に何もしないのであればnamespace.httpdと同じく空のファイルを置いておきます。

httpdの起動は、cpurcで行います。

アクセス制限を行うときは、そのディレクトリに.httploginファイルを置きます。ファイルの中身は下記のような物です。

'Test Web'
foo bar

Test Webがアクセス制限時に表示される名前、fooがユーザ名、barがパスワードです。パスワードは暗号化しない平文で置きます。

CGIは/bin/ip/httpdの下に置きます。/lib/namespace.httpdを書き換えて、適当なディレクトリからbindするのがよいでしょう。

CGIへのアクセスは、常に、http://サーバー/magic/foo の様に行います。fooがCGIのファイルです。

これで当初の目的を達しました

DNSサーバの立ち上げ

グローバルIPが1個しか配付されず、かつ、ADSLルータの内側の機械でDNSを使おうとすると工夫がいります。

この図のような構成の場合、ADSLモデムの部分でNATの設定を行い、下記の書き換えを行う様に通常はします。

portprotocolIP
80tcp192.168.1.32
53udp192.168.1.32

DNSでの問題点は、このNATの書き換えにあります。ドメインmoroo.nanako.jpへの問い合わせは、ADSLモデムのグローバルIPアドレス(200.1.2.3)に行きます。ADSLモデムはこの問い合わせをNATの設定に従って、192.168.1.32(tp560x)に振り替えます。tp560xは、自分が知っているアドレスの場合は、返答を行いますが、自分が知らないアドレスの場合は、DNSサーバに問い合わせます。DNSサーバは、問い合わせが自ドメインかどうかを知らないので、他の機械からの問い合わせと同じく、ADSLモデムのグローバルIPアドレス(200.1.2.3)に問い合わせます。ADSLモデムは、先ほどと同じく、NATで書き換えてtp560xに問い合わせを行ってしまい、無限ループに陥ります。

tp560xが、DNSへの問い合わせを行わない様にすれば、無限ループは避けられますが、この場合、tp560x上でDNSを利用することができません

この問題を解決するために、IPアドレスを複数割り当て、一つのIPアドレスをDNS専用に使用します。Plan9の場合、IPアドレス毎に提供するサービスを限定できますので、DNSへの問い合わせを処理するIPアドレスを追加し、このIPアドレスへの問い合わせでは、自分自身が知らない場合にDNSに問い合わせをさせない様にします。

設定

cpurcの設定で/net.alt以下にIPドライバを追加し、IPアドレスを設定します。そして、問い合わせをこのIPアドレスで処理する様にします。

bind -a '#I' /net.alt
ip/ipconfig -g 192.168.1.1 -x /net.alt ether /net/ether0 add 192.168.1.33 255.255.255.0 >/dev/null >[2=1]
ndb/cs -x /net.alt -f /lib/ndb/external
ndb/dns -rs -x /net.alt -f /lib/ndb/external

ADSLモデムのNATの設定は下記の様にします。

portprotocolIP
80tcp192.168.1.32
53udp192.168.1.33

外部からの問い合わせに対する返答は、/lib/ndb/externalで設定します。


#
#  files comprising the database, use as many as you like, see ndb(6)
#
database=
	file=/lib/ndb/external
	file=/lib/ndb/common

dom=moroo.nanako.jp soa=
	refresh=3600
	ttl=3600
	ns=210.229.24.71
	mb=moroo@nanako.jp
	mx=nu13d.moroo.nanako.jp

ip=210.229.24.71 dom=nu13d.moroo.nanako.jp
ip=210.229.24.71 dom=tp.moroo.nanako.jp