unixで実現するインターネットサーバ(Sun Sparc編)


インターネットとはご存じのように、unixのネットワークから拡大して発展したものである。
現在ではWin95やWin NTで動作する、マイクロソフトのIIS(Internet Information Server)も普及している(と、マイクロソフトは言っている)が、本質的にはunixの方が相性がよろしい。
もちろん、wwwサーバだけならNTでも実現できるがcgiを動作させるためのperlインタプリタなどは、NTに移植こそされているものの問題がないわけではない。
さらにDNSともなるとNTには致命的なセキュリティホールが見つかるなど、NTのTCP/IPはまだまだunixには遠く及ばないようだ。


Sun Microsystemsのワークステーションを使う
ワークステーションの代名詞とも言われるSunにインターネット関連ツールをインストールしてみよう。
元々のOSが、SunOS4.1.xなら苦労なくインストールできる。
なお、SunOS5.x(Solaris)に関しては??である。
あえてSonOS4.1.xを選択した理由として、InternetにはBSD系が強いと言うこともある。
SunOSも5.xからはSystem V系だから4.1.xと比較するとちょっと勝手が違う。


その1:WWW Server
インターネット関連機能の目玉といえば、WWWサーバだ。
ここでは、全世界でのシェアNo1と言われるフリーのソフト、APACHEをインストールすることにする。
このAPACHE,ソースが公開されているし、色々なオプションモジュールが用意されており商用サイトでの使用実績も多いと言われている。
インストールするためには、元ネタが必要だがそれはこちらで入手できる。
主要ワークステーションやPCには、コンパイル済みバイナリも用意されているからそれを持ってくればよい。
嬉しいことに最近は日本語化プロジェクトなるものがあって、何も今更F&Fでインストールに関する説明をするまでもないと思う。
しかし、もっと低レベルな部分を説明するならば..1.ダウンロードした.....tar.gzファイルを適当なディレクトリに置く。
  (たとえば/usr/local/apacheなど)2.gzip -d .....tar.gzで解凍する。
3.tar xvf .....tarで展開する。
通常だと(CD-ROMに含まれるものはソースファイルがないものがあり、作成されるディレクトリ名に違いがあるものも存在する)./srcと./confが作成されているはずである。
(もちろん、他にも./iconsなども)まずは、./confディレクトリで3つのconfigファイルを編集する。
これらファイルをエディタで開いて見れば、設定例とともに説明が書いて有るので決して難しい設定ではない。
詳しくはこちらにゆずる。
設定が終了したら、httpdを実行すればよい。
これでhttpサーバが稼働する。
前記configファイルで設定されたディレクトリが、wwwホームディレクトリとなり同様に(通常は)index.htmlが最初に読み込まれるhtmlファイルである。
−−え?何?gzipが無いって??そうだった。
SunOSにはgzipは含まれていない。
これも、apacheを持ってきたついでに取ってこよう。
たいていのpubには有るはずだ。
gzipは当然の事ながらgzipで圧縮されていない。
tar (tar xvf {filename})で解凍すると、gzipディレクトリが作られて展開される。
展開されたディレクトリでsh -x configureとする事でMakefileが作成される。
その後makeを実行するとgzipが出来上がる。
(/usr/binにコピーすると良い) 解凍はgzip -d {filename}

その2:perlインタプリタ
wwwサーバが動き始めたら、perlを入れてみたくなるだろう。
そう、cgiを使うためのインタプリタだ。
これのインストールはapacheよりは少しだけ手間がかかる。
理由は、使用するシステムに合わせてコンパイルしなくてはならないからだ。
perlのソースはこちらで入手可能だ。
ファイルをダウンロードしたら、適当なディレクトリで解凍する(たとえば/usr/localに置いて、gzi
-d perl-5.003.tar.gz)そして、tarで展開する(tar xvf perl-5.003.tar)とperl5.003ディレクトリが作成されて、各種ファイルができあがる。
さて、コンパイル作業だ。
1.sh Configure -de
  (optionの -desは非問い合わせモードの設定)2.mak
3.make tes
4.make instal
の順番で実行する。
SunOSの場合は、まず間違いなくノーエラーで終了するはずだ。
いくつかのワーニングと、大量のメッセージが出力されるが気にしない。
(4)まで終了すると/usr/bin/perl が出来上がっているはずである。
ここまでの時間はSS1で1時間程度、Pentium Pro-200で3分程度である。
後はcgiファイルからperlを呼ぶだけでよい。
デーモンではないから特別実行させる等の作業は必要ない。


その3:bind
インターネットはDNSで連結されている。
ネームサーバが連鎖的に問い合わせを行って、目的のサイトまでたどり着くのだ。
もちろんSunOSにもDNSは含まれているが、バージョンの古いDNSは(特に)mail関連ソフトが正しく動作しない場合があるので、この際入れ替えよう。
bindをtarで展開するとそのディレクトリに展開される。
安全のため/usr/etc/in.namedをバックアップしておいた方がよい。
その中のMakefileを使用するOSに合わせて変更(コメントを外す)する。
その後make及びmake installとする。
以下にMakefileの変更部分のみを記す。
#(sunos4.x) CC = /usr/bin/cc $(CPPFLAGS) CDEBUG = -g CPPFLAGS = -DSUNOS4 -DSPRINTF_CHAR -DCHECK_UDP_SUM -Dconst= INDOT = in. XFER_INDOT = in. LEX = lex LIBS = -ll #(add "-ldl" to LIBS if your links fail with "dlopen" problems. this indicates # that your libc.so file is screwed up, but it's easier to fix this than that.) PIDDIR = /etc DESTSBIN = /usr/etc DESTEXEC = /usr/etc DESTHELP = /usr/lib COMPINCL = compat/include MANDIR = man CATEXT = $$$$N MANROFF = cat INSTALL_COMPAT = install-compat INSTALL = install IOT = IOT KSYMS = /vmunix KMEM = /dev/kmem UDPSUM = _udp_cksum # (for details on shared library building, see shres/sunos/INSTALL; # note that shres/solaris/INSTALL has some good testing notes for sunos) #uncomment next line to build a shared library version of libresolv #SHRES = shres/sunos # uncomment only one of the pairs of lines below # -- if you use gcc (recommended) # (if -fpic doesn't work, see shres/sunos/PROBLEMS) #SHCC = gcc -DSUNSECURITY $(CPPFLAGS) #PIC= -B/usr/bin/ -fpic -D_res=_res_shlib # -- if you use Sun's cc SHCC = /usr/bin/cc -DSUNSECURITY $(CPPFLAGS) PIC = -pic -D_res=_res_shli
インストール自体はこれで完了する。
/etc に、in.named,in.named.reloadなどのモジュールがインストールされるはずである。
しかし、DNS自体の設定を行わなくてはいけない。
インストールに比較すると、数倍面倒なこの作業は後ほど説明する。
最後になってしまったが、一応注意点を書いておこう。
SunOS4.1.4付属のin.namedは、少々の設定エラーがあっても何とか実行できる。
しかし、インストールするバージョンによっては厳しいチェックではねられる場合もあるし、in.named自体のインストールエラーがあるかも知れない。
従って、in.namedを入れ替える前にDNSの設定を行って、それが正しく動作することをnslooku
で確認しておくべきである。
全く動かない状態からデバッグするのは大変だ。
in.named -d で、/var/tmp/in.named.run のデバッグ情報が出力されるが、何が正しくて何が誤りなのか?一度も動かしたことがなければ判別に苦しむだけだ。
..私がインストールしたのはbind4.9.4だ。
何故か最新版の4.9.5はチェックサムエラーとかで実行できなかった。
−−SunOSのアプリからDNS経由でIPアドレスを引くためには少々の細工が必要だ。
NISのライブラリ入れ替えなどだが、これは考えただけで面倒になるような作業を伴う。
従って私は、SunのDNSは他のマシンのため..と割り切っている。


その4:sendmail
sendmailはメール関連ソフトであり、SunOSにも付属している。
しかし一般的にOSの付属sendmailはバージョンが古く、セキュリティホールが多く見つかっている。
出来ることなら最新版をインストールしたいところだ。
perlのインストールを終えている方は、多少自信が付いたのでは無かろうか?sendmail(8.8.3) gzipで解答してtarで展開するとディレクトリが作られ展開される。
sendmailをインストールする前にbind4.9.xをインストールしておかなくてはいけない。
(usr/libのsendmail関連ファイルをバックアップしておこう) 次にMakefileを編集する。
sendmail-8.8.3/src/Makefilesの中の Makefile.SunOSを編集して(パーミッションを変えてから)DBMDEF= (空白にする)LIBS= -lresolv -l44bsd (追加と削除) #NROFF=....(コメントアウト) #NROFF=....(コメントアウト) #MANDOC=...(コメントアウト) aliases......... # ${NROFF.... (コメントアウト) mailq....... # ${NROFF........ (コメントアウト) newaliases...... # ${NROFF.... (コメントアウト) sendmail.......... # ${NROFF.. (コメントアウト)変更後srcディレクトリで sh makesendmail を実行する。
(決してmakeを実行してはいけない)次に sh makesendmail install を実行するとsendmailが出来上がる(/usr/lib) なお、上記部分をコメントアウトすることによってマニュアルページがインストールされなくなる。
マニュアルページが欲しい方は、libs=以下のコメントアウトを行うべきではない。
ただし、マニュアルページのリフォーマッタがインストールされていなければエラーになるが。


その5:qpopper
sendmailと一対となってmail関連プロトコルを実行するためのpopプロトコルを処理するqpopperのインストールを行わなくてはいけない。
qpopper以外にも、popプロトコルを処理するソフトは存在するから、各自の好みで選んで問題はない。
なお、SunOSにはpopプロトコルを処理できるモジュールは標準で付属していないからこのインストールは必須だ。
qpopper をtarで解凍すると、popperディレクトリが作られ展開される。
Makefileを編集して-DBIND43をCFLAGから削除する。
その後makeを実行してpopperを作成する。
出来たpopperは、/usr/etcにコピーしなくてはいけない。
次に/etc/inetd.confを編集して次のに行を書き加える pop stream tcp nowait root /usr/etc/popper popper pop2 stream tcp nowait root /usr/etc/popper popper また/etc/servicesを編集して次の行を書き加える pop 110/tcp 上記作業によって、例えばクライアントのNetscape mailなどからmail送受信が出来るはずである。
確認作業としては、telnetで110番ポートにアクセスしてみる手がある。
telnet hostname 110

その6:CF
sendmailの設定は、DNS並に面倒だ。
そこで、sendmailのconfiguration tool(cf)を使用する。
cfを解凍し、tarで展開するとディレクトリが作られる。
標準定義ファイルはStandardsディレクトリの中に入っている。
sendmail8.8.3の場合は、sendmail-v5.defを使用するから、このファイルをcfのルートにコピーして名前を変更する(myhost.def) コピーしたものの内容を変更する。
(専用線接続の場合の変更点のみ)###type of sendmail.cf CF_TYPE=R8 #[ostype] OS_TYPE=sunos4 #[general] MX_SENDMAIL=yes MY_DOMAIN=mydomain.co.jp MY_NAME=po OFFICIAL_NAME=*$w.$m* ACCEPT_ADDRESS=*mydomain.co.jp myhost.mydomain.co.jp* DIRECT_DELIVER_DOMAINS=al
変更が終わったら make myhost.cf でmakeすると、myhost.cfが出来上がる。
これを/etcにコピーする。
* sendmail.cfで名乗ったドメイン名をhostsファイルに書くこと。
xxx.xxx.xxx.xx myhost mydomain.co.jp

その7:DNSの設定
さて問題のDNSの設定だが、これにはいくつかのファイルを作らなくてはいけない。
まず第一にin.named(named)が立ち上がるときに最初に読み込むファイル、これが/etc/named.bootだ。
これは以下のように記述する。
説明を簡単にするために、仮想ドメイン名Fast_First.co.jpと,そのIPアドレス202.100.20.8を使用する。
directory /etc 各種ファイルのある場所を示す
cache . root.cache トップドメイン情報のファイルを指定する
primary Fast_First.co.jp. FF.zone このDNSがFast_FirstのプライマリDNSである
primary localhost. localhost.zone お決まりのlocalhost設定
primary 20.100.202.in-addr.arpa. FF.rev 逆引き情報(IPアドレスからドメイン名を引く)
secondary diji_came.co.jp dijicame.zone diji_cameのセカンダリDNSになる。
secondary phs.co.jp phs.zonq phs.co.jpのセカンダリDNSになる。
上記ファイルで指定された、root.cacheとxxxx.zone及びxxxx.revファイルを次に作成する。
通常インターネットに接続されている場合は、root.cacheファイルはjp nicから取ってくることになる。
すなわち、今立ち上げようとするサーバが知らない情報の問い合わせ先だ。
インターネットに接続されていない場合には(だいたい)以下のように記述すればよい。
/etc/root.cache の中身
. 3600000 NS Fast_First.co.jp
Fast_First.co.jp. 3600000 A 202.100.20.8
上記ドメイン名の中で、最後のjpの後に[.]が付いているが、これは重要な意味を持っている。
すなわち最後にドットのある書き方をすれば、そのドメイン名が絶対的ものである(絶対表記)事を示すのだ。
逆にドットを付けなければ相対表記と言うことになり、表記されたドメイン名の後ろに絶対表記されたドメイン名を補完して解釈する。
これは、次に作成するzone及びrevファイルで重要な意味を持つわけだ。
さて、話がうまくつながったところでzoneファイルを作ってみよう。
zoneファイルは、このDNSに問い合わせが来たときに、このzoneファイルに従ってIPアドレスを返答する。
この仮想ドメインFast_First.co.jpには、2つの計算機がぶら下がっていてそれぞれ以下のような名前が付けられているとしよう。
husky.Fast_First.co.jp ( 別名 mikeneko.Fast_First.co.jp ) itachi.Fast_First.co.j
/etc/FF.zone の中身
@ IN SOA Fast_First.co.jp. Webmaster.Fast_First.co.jp. ( ドメイン名とメールアドレス
1997050101 ;serial number シリアル番号
10800 ;refresh 3HR データベース更新頻度
3600 ;retry 1HR リトライ時間
3600000 ;expire 1000HR データ有効期間
86400 ) ;min 24HR データ生存期間
; コメント
IN NS Fast_First.co.jp. ネームサーバの指定
IN NS husky.Fast_First.co.jp. secondary DNSが有れば書く
Fast_First.co.jp. IN A 202.100.20.8 ドメイン名とIPの対応
; コメント
husky IN A 202.100.20.9 ドメイン名とIPの対応
itachi IN A 202.100.20.10 ドメイン名とIPの対応
mikeneko IN CNAME husky
まずシリアル番号だが、普通は日付+連番を使用する。
上位のDNSは、これが更新されているかどうかでファイルの更新を見つける。
従って、本ファイル内容を修正したならば数字を一つ進めることが必要である。
単に日付だけにしてしまうと、一日に一回しか更新が許されないし、未来の日付を使い始めてしまうとキリがない。
この中の[A]レコードと言われる部分が、ドメインネームとIPアドレスの対応表だ。
例えばhuskyは相対表記になっているから、実際にはhusky.Fast_First.co.jpと補完される。
もちろんここを絶対表記にしてhusky.Fast_First.co.jp.と書いても問題ない。
itachiも同じだ。
その下のmikenekoはCNAMEでhuskyと連結されている。
これによって、mikeneko.Fast_First.co.j
はhusky.Fast_First.co.joの別名であることが宣言されるわけだ。
このほかにもHINFO(ホストの個別情報を記入するためのレコード指定)などがある。
上記設定によってドメイン名からIPアドレスを引くことが可能になるはずだ。
しかし、これだけでは事が済まない。
逆にIPアドレスからドメイン名を引く必要があるからだ。
それでは逆引き情報ファイルを作ろう。
/etc/FF.rev の中身
@ IN SOA Fast_First.co.jp. Webmaster.Fast_First.co.jp. ( ドメイン名とメールアドレス
1997050101 ;serial number シリアル番号
10800 ;refresh 3HR データベース更新頻度
3600 ;retry 1HR リトライ時間
3600000 ;expire 1000HR データ有効期間
86400 ) ;min 24HR データ生存期間
; コメント
IN NS Fast_First.co.jp. ネームサーバの指定
IN NS husky.Fast_First.co.jp. secondary DNSが有れば書く
Fast_First.co.jp. IN A 202.100.20.8 IPとドメイン名の対応
8 IN PTR Fast_First.co.jp IPとドメイン名の対応
9 IN PTR husky.Fast_First.co.jp. IPとドメイン名の対応
10 IN PTR itachi.Fast_First.co.jp. IPとドメイン名の対応
上の方の記述はzoneファイルと同じだ。
後は対応部分のAがPTRになって、左右が入れ替わったと思えばよい。
PTRレコードの左側にIPアドレスの下一桁が書いて有るわけだが、何故こう書かれているか?それは少し前に戻ってnamed.bootファイルを見れば分かる。
逆引き情報の所に20.100.202.in-addr.arpa. の記述があるだろう。
これは見て分かるとおり、IPアドレスをひっくり返したわけだが最下位の8ビットが記述されていない。
つまり、FF.revファイルのPTRレコードによって上位桁が補完されているわけだ。
ここまで来れば完成だ!早速テストに入ろう。
DNS自体は完成したが、その情報を計算機が使えるように設定しなくてはいけない。
この設定ファイルが/etc/resolv.conだ。
/tec/resolv.con の中身domain Fast_First.co.j
nameserver 202.100.20.8 このファイルが出来たらnslookupを使用してテストしよう。
nslookupを実行すると、以下のような表示が現れるはずだ。
Default Server Fast_First.co.j
Address 202.100.20.8 >
これに対して、知りたいIPアドレスのドメイン名を入力すると、>husky.Fast_First.co.jp
Server Fast_First.co.j
Address 202.100.20.8 Name husky.Fast_First.co.j
Address 202.100.20.9 と、答えが出るだろう。
もちろんIPアドレスからドメイン名を引くことも可能だ。
もしもnslookupが正しく動作しなかった場合、これは逆引き情報ファイルが間違っている可能性が高い。
nslookupが最初にドメイン名を得ようとして失敗しているのだ。
失敗したままでもnslookupだけ立ち上げたい場合は、一時的にresolv.confを削除しよう。
そうするとnslookupはデフォルトサーバが0.0.0.0であると認識して立ち上がる。
ここで、server=202.100.20.9 と指定すれば、正引きが正しいかどうか程度のデバッグは行える。
インターネット接続においてはDNSが必須だ。
しかしDNSに関する情報は少ないのが現状だ。
このページを読んでも、十分理解できないかも知れない。
逆に何を説明したらよいのか?私にもツボが掴めていないのだ。
そうそう、忘れていた。
SunOSでは、アドレスを引くときにはNISを使うようになっている。
従って、Telnetやftpでドメイン表記を使いたい場合は共通ライブラリの入れ替えなどと言う大変な?事をやらなくてはいけない。
それがイヤなら、NIS経由でDNSの情報を渡すようにするかだ。
いずれにしても面倒なことには違いない。
どうせ面倒なことならライブラリ入れ替えにチャレンジしてみるのも良いかな?失敗すれば二度と起動できなくなる恐怖と、バイナリをエディット出来るソフトを用意して挑戦してみては?