ローカルでサーバをあげる

97年12月23日


誕生日だというのに何してるんだか。まぁいいや。 もっと便利にするために, ローカルで squid/named をあげることにした。 これで, ホンのちょっとばかし電話回線の帯域を有効利用できるし, WWW をオフラインで見たりすることができる。 ついでなので, セキュリティ面でもちょっと気になることがあるので, 設定を少々いぢる。

まず, squid を立ち上げる。これは WWW や FTP のキャッシングをやってくれる proxy である。 キャッシュに引っかかってくれれば, ローカルなネットワーク越しでデータが来てくれるので, 電話回線の 28.8Kbps ではなく, LAN の 10,000Kbps でデータが転送される (すごい桁の違いですな) ことになる。 さらに, うまく「先読み」をすることによって, 実質的な転送速度を高めることもできる。 ここで, キャッシングを行なうためのバッファが必要になるのだが, これを確保するために実行ファイルをさらに圧縮した。具体的には, 今までは gzexe を使って圧縮していたが, これを一旦展開して元に戻し, 再び gzip で圧縮し, 圧縮時にくっつくサフィックス .gz を消してファイル名を元に戻した。 というのは, FreeBSD はカーネルの設定次第で gzipped file を直接実行することができる, ということを聞いたからである。 gzip -9 (圧縮率最優先)で圧縮したのはいうまでもない。 また, 今まで圧縮していなかった /sbin やら /bin, /usr/libexec といったファイルも全部圧縮してやった。 これで, 10メガバイト以上の空きディスクができたので, 一度 /var で別パーティションに切った部分を元の / パーティションに戻し, /var パーティションをまるごと /www-cache というパーティションに切り直した。 小さいファイルがたくさんできることが予想され, かつ, ディスクをギリギリまで使えるようしたかったので, 手動でオプションをつけて newfs した。

newfs -m 0 -f 4096 /dev/wd0b
なんて感じ。オプションの意味は, 自分で調べて下さい。

さて, 本題にはいる。squid は FreeBSD の package にもあるのだが, ちょうど FreeBSD の CD を後輩に貸していたので, 自分でコンパイルすることにした。 ソースは, 手元にあったという理由だけで (最近はもっと新しいのが出ているのだが) 1.1.11 を使う。設定ファイルとかの場所をかえなくていいならば, コンパイルは特に難しいことはなく,

% tar zvxf squid-1.1.11.tar.gz
% cd squid-1.1.11
% ./configure
% make all
% su
# make install
などとするだけである。

コンパイルできたら, 設定する。学校のマシンにインストールしたことがあったので, 設定ファイルを書くのも簡単であった。 書き換えたるのは, /usr/local/squid/etc/squid.conf というファイルである。

  1. cache_effective_user の前の # を消して,
     cache_effective_user nobody nogroup 
    を有効にする。理由は, このファイルの中のコメントを見てほしい。
  2. アクセスできるマシンを LAN 内のマシンだけにする (外からアクセスしてくる奴がいるとは思えないが, やっぱりセキュリティ上危険なので)。
    acl all src 10.0.0.0/255.0.0.0
    などと指定。
  3. cache_mem, cache_swap を小さくする。メモリもディスクも小さいので ;_;
  4. 親サーバを指定して squid の階層構造を設定する。 ISP 自体の持つバックボーンを有効利用するためである。
     cache_host www-cache.somewhere.domain parent 3128  3130 default 
    といった指定を書き加える。これは, 自分の接続先の ISP などがプロクシを 用意している場合のみ設定する。もっとも, そのプロクシが squid かどうかなどによっても, いろいろと設定をかえないといけないので, 詳しくは自分の契約先のプロバイダに聞いて欲しい。
設定ファイルができたらためしに実行してみて, クライアントの方から squid 経由で適当にアクセスしてみる。 うまく動いているようだったら, 次回起動と同時に squid が立ち上がるように /etc/rc.local に書き加える。
if [ -x /usr/local/sbin/RunCache -a -f /usr/local/etc/squid/squid.conf ]; then
   /usr/local/squid/bin/RunCache & ; echo -n ' squid'
fi
ところが, これだと起動時には ppp 接続されていないので, DNS による名前の解決ができないといって怒られてしまう。 そこで, 起動時の DNS のチェックを省略するオプション, -D をつけて立ち上げるように指定する。 /usr/local/squid/bin/RunCache の, squid を立ち上げている部分を書き換え。
        squid -sYD $conf >> $logdir/squid.out 2>&1

続いて, DNS の設定である。はっきり言って, DNS なんて設定したことないのだが, まぁ, 適当にやってみる。 FreeBSD 用の参考資料が家にはないので, まぁ, DNS なんてどの UNIX でも一緒でしょう(多分)ということで, Linux のドキュメントを読んで真似する。 Linux の LDP(Linux Documentation Project) の, Cacheing-named と Linux Japan #3 の 「named でオリジナルドメインを」 を読んで適当に設定ファイルを書く。 さらに, IIJ-PPP のパッチでもお馴染の junichi 氏が named の設定ファイルなども公開されているので, さくっとコピーしてきて, 設定ファイルの正当性を確認。

/etc/resolv.conf で nameserver としてローカルホスト 127.0.0.1 を指定し, named を立ち上げる。 ちゃんと名前の解決ができているかを, nslookup コマンドで確かめる。 できていれば, 他の LAN 内のマシンの DNS server の指定を 10.1.1.1 にする。これで, 名前の解決が速くなった(はず)である。

しかし, これだけでは問題がある。 というのは, name server = NAT server なので, このマシンが NAT 鯖として稼働している時は世界中どこからでもアクセスできる。 したがって, ローカルなマシンの名前とか, IP アドレスがばれてしまう。 ばれたところで何もできないだろうが, あんまり気に入らない。 ということで, 外部からの DNS アクセスはフィルタリングしたい。 まず最初に思ったのが, TCPwrapper でフィルタリングする方法。 しかし, inetd から起動されないデーモンである named に対してどのように wrapper を噛ませばいいのかわからなかったのと, 標準的なインストールをした FreeBSD では wrapper が入ってなかったので, 没。 新しめの named だと「外部からの問い合わせには答えない」 といった設定ができるそうであるが, ソースをとってきてそれをコンパイルが面倒なので, 没。 ということで, もっとも簡単な IIJ-PPP の方でフィルタリングすることにした。

また, squid を通さない web のアクセスが増えたのでは, squid をインストールした意味がなくなってしまう。そこで, 同時に squid 経由でない, web のアクセスは通さないようにした。

/etc/ppp/ppp.conf にこういう設定をした。

 set ifilter 0 deny udp src eq 53
 set ifilter 1 deny tcp src eq 80
 set ifilter 2 permit 0/0 0/0
 set ofilter 3 permit 0/0 0/0
設定の意味については, IIJ-PPP のマニュアルを読んで下さい。
番外:テレホーダイ契約
もっと便利に