ローカルでニュースサーバもあげる

98年1月14日


Web がみえたので, 次は news である。 ニュースのフィードが受けられるなら別ですが, そうでない, 普通の ISP と契約している場合に, LAN 内のどのマシンでも「オフラインで」 (この言葉にはいろいろ語弊があるけど, とりあえずここでは「PPP 接続をしていない時でも」という意味にとって欲しい) ニュースを読み書きできるようにするには, 何らかの「ニュース記事を外部のサーバからとってくるソフト」 と, 「その記事を LAN 内のマシンに配るソフト」の二つが必要になる。 前者には suck, nntpcache, gnspool といったツールがある。 また, 後者にはごくごく普通の INN などのニュースサーバも使えるが, nntpd などの機能を限定したソフトでも十分だという。 また, これらをひとまとめにした leafnode というツールもあるという。

INN はちょっと大げさであるのでパス。また, スプール取り込みには, 日本製ソフトでドキュメントも日本語でかいてある gnspool を使うことにした。 最近は leafnode がはやりなんだそうだが, 「何でも全自動」というのが恐いのでやめた。

と, こうすると実は Linux JF の Offline-News-mini-HOWTO と全く同じになる。ということで, このドキュメントを参考に, FreeBSD 上でニュースサーバを立ち上げることにする。

うまい具合に, FreeBSD のパッケージの中に gn も nntpd もあるので, こいつらを使わせてもらう。NFS で共有した CDROM からインストールする。

pkg_add /netcdrom/2.2.1-RELEASE/packages/news/jp-gn-gnspool-1.35.tgz
pkg_add /netcdrom/2.2.1-RELEASE/packages/news/nntp-1.5.11.5.tgz
これでインストール終了。続いて, 設定である。

まずは ニュース記事をとってくる

gnspool を使って記事をとってくるのだが, その gnspool の設定を行なう。 ユーザー news の権限でニュース記事をとって来るようにする。 vipw でユーザ news のホームディレクトリを /usr/lib/news にする。 そして, そのディレクトリに .gnrc を書く。とりあえず, 最初はローカルニュースグループのテストグループだけを購読することにする。 こうすれば, 万が一記事の逆流などがおきても他人にかかる迷惑を最低限にすることができる。

こんな感じの .gnrc を書いた。

NNTPSERVER      news.some.domain.some.where
DOMAINNAME      some.domain.some.where
ORGANIZATION    dokoka
UNSUBSCRIBE     all,!hoge.test
NAME            news subsystem
GENERICFROM     1
ARTICLE_LIMIT   0
ARTICLE_LEAVE   0
SELECT_LIMIT    0
GNSPOOL_LANG    EUC
AUTHOR_COPY     /dev/null
NEWSRC          ~/.newsrc
上4行はサイト固有なので, 各自自分のサイトに合わせて書き換えて欲しい。 でもって, スプール用のディレクトリ /var/spool/gnspool, アクティブファイルなど用のディレクトリ /usr/local/news/lib などをオーナー news で作成する。

でもって, 実際にニュースの記事を取り込んでみる。

su news -c "gnspool -h"
とすればいい。ニュースグループのチェックをはじめ, 最初は非常に時間がかかる (かもしれない) が, 我慢しよう。 おわったら, /var/spool/gnspool にファイルができているか確認する。

nntpd の設定

さて, ニュースのスプールディレクトリを NFS で共有すれば, mnews の nspr モードなどを使ってどのマシンからもニュースが読める。しかし, これでは Windows 95 マシンなどでは読めない。ということで, nntp daemon を立ち上げることにする。

となるのだが, これにはまってしまった。 パッケージとしてインストールされているソフトは, どういう設定でコンパイルされているかが全くわからない。 gnspool の方は親切にも /usr/local/share/doc の中にドキュメントがあったので, 何とかわかったものの, nntpd の方は man ページしかドキュメントがなく, そこにも, コンパイル時の設定が書いてない。 実は nntpd は, inetd から起動させて使う時と, 常駐デーモンとして使用する時とで, コンパイル時の設定が違う。 そのうえ, news server として働く時に読み込むファイルの場所 (設定ファイル, ニュース記事のスプールディレクトリなど) などもコンパイル時に決めるのだが, それもどこかわからない。

私は, この nntpd は inetd から立ち上げるタイプであると思い込んでいて, inetd.conf を書き換え, inetd に HUP シグナルを送っても,

telnet localhost nntp
ができないので, 半日ほど悩みまくってしまった。 /var/log/messages に残るメッセージを調べたり, リブートしたり, インストールし直したり, 挙げ句の果てには, 「もしかして CDROM が壊れているのだろうか」 などと CDROM を調べたりした。

ここまで読めばわかるだろうが, 原因は 「packages の nntpd は常駐デーモンとして使うようにコンパイルされていた」 ためである。 inetd.conf を元に戻して nntp ポートを開けて, コマンドラインから nntpd を実行すれば, あなたのマシンはもう nntp server。このことにすぐ気づいていれば, 「あっ」と言う間にサーバが立ち上がったのだ。

気づかない私が悪いともいえるが, せめてこういうことぐらい package の DESC の中に書いといて欲しかった。 また, gnspool のスプールディレクトリと nntpd が期待するスプール先が異なっていたので, 最初は記事をとってきたのに「記事は0」などと表示されて困った。 どこがスプールディレクトリになっているかわからないので,

strings nntpd | less
などとして, それっぽいディレクトリ名を探し出すことによって, スプールを発見した。
ln -s /var/spool/gnspool /var/spool/news
などとやり, さらに, nntp アクセス制限ファイル /usr/local/news/lib/nntp_access (このファイルについては man ページにかいてあったので, すぐにみつけられた) を書き換えて, やっと記事が見えるようになった。 このファイルはこんな感じである。
default no no
host1 read post
host2 read post
localhost read post
当然ながら, host1,host2 というのは, LAN 内の実際のマシン名にする。

ということで, 今回の教訓:「急がば回れ」。 インストールが簡単だからとパッケージ使うより, 自分でコンパイルした方が早かったかも知れない。


普通メールの方が先だろう
番外:テレホーダイ契約