DynamicDNSとニュースサーバ問題
NetNewsは廃れてしまったのであまり役には立たないかもしれませんが、それに限らずサーバのIPアドレスが動的に変化する場合の対処について説明します。
1.名前で引けないと公開サーバは成り立たない
Webにしてもblogにしても、現在は公開サーバはDNSからグローバルIPアドレスを引けないと成り立ちません。
まず、グローバルIPアドレスは必須です。
CATV等でローカルIPだけというような環境ではまず無理です。
また、一般人が普通のISPに普通のコースで契約した場合はグローバルIPアドレスであってもモデムの電源断等のタイミングでIPアドレスが変化してしまいます。
最低いつでも変化しない「名前」で引ける必要があります。
このようなニーズのためにDynamic DNSというサービスがあります。
ISPが独自にコースとして持っている場合もありますし、Dyndns.orgやMydns.jp等の無料サービスもあります。
どうやってIPアドレスの変更を通知するのかはそれぞれのサービスで異なるので調べてください。
ちなみに私はルータに自動更新機能があるのでそれを使っています。
2.サーバ同士での通信を考える
さて、対クライアントであればこれで解決するのですが、サーバ同士で通信する場合、例えばinnでNetNewsのフィードをする場合、フィード先に先のDynamic DNSサービスで取得した「名前」を通信の相手先として使ってよいのでしょうか。
結論を言うと、サーバソフトによっては「起動時に名前からIPアドレスへの名前解決を行った後にキャッシュして、後は知らない」という酷いものがあります。
例えばinnです(^^;
データベースサーバ等もあるかもしれませんね。
ここではそのinnでどうやって回避するかを説明します。
3.innの名前とIPアドレスとの関連付け
inn 2.2以降はincoming.confというファイルにサーバ間通信するべき相手を記述します。
peer jr4snp {
hostname: jr4snp.spd.jp"
}このような感じで記述するのですが、起動時に一度DNSを引き、IPアドレスを取得後キャッシュして以後はそのIPアドレスかどうかで判断しています。
相手のIPアドレスが変化したらすぐに変更、という訳ではないです。
NewNewsの特性上、厳密に変化を知る必要は無いですが、遅くとも1時間以内には知りたいものです。
まずは、cronを使って、設定ファイルをreloadさせる、という手を使ってみましょう。
このようなスクリプトを作りましょう。
場所は/usr/local/binあたりに、名前は仮にreloadnewsにします。
ctlinndの場所は環境に合わせてください。
#!/bin/sh
/usr/local/news/bin/ctlinnd reload all y > /tmp/reloadnews実行権限を付与することを忘れないで下さい。
# chmod +x reloadnews /etc/crontabに追加です。
実行権限はnewsにします。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
#news
1,6,11,16,21,26,31,36,41,46,51,56 * * * * news /usr/local/news/bin/nntpsend
39 * * * * news /usr/local/news/bin/rnews -U
6 0 * * * news /usr/local/news/bin/news.daily delayrm
0 5 * * 1 news /usr/local/news/bin/expireover -s
5 * * * * news /usr/local/bin/reloadnewsこれで毎時5分に設定ファイルがreloadされます。
これで大体うまく行くのですが、実はDNS自体もいろいろ問題があります。
最低一度はDNSを引かないと最新のIPアドレスを取得できないという問題です。
これもcronを使って定期的にDNSを引くようにすれば良いです。
一応ちゃんと引けたかを残すために/tmpに記録するようにしておきます。
場所は/usr/local/binあたりに、名前は仮にspdlookにします。
#!/bin/sh
host jr4snp.spd.jp > /tmp/spdlook
host jg4dwa.spd.jp >> /tmp/spdlook
以下、接続先を並べる実行権限を付与することを忘れないで下さい。
# chmod +x spdlook /etc/crontabに追加です。
実行権限はrootにします。
7 * * * * root /usr/local/bin/spdlook これで毎時7分にその時点の最新の名前とIPアドレスが参照されます。
おまけ junk行きニュースをactiveに追加。
説明はしません。自己責任でどうぞ。
alt.*以外のactiveに無いニュースが届いた場合、次回より受けつけ可能にします。
/usr/local/bin/addnews
#/bin/sh
awk '{print "/usr/local/news/bin/ctlinnd newgroup",$2}' /var/log/news/unwanted.log | grep -v alt.|sort>/tmp/addnews
sh /tmp/addnews > /tmp/addresult/etc/crontab
7 0 * * * news /usr/local/bin/addnews