DynamicDNSとニュースサーバ問題


NetNewsは廃れてしまったのであまり役には立たないかもしれませんが、それに限らずサーバのIPアドレスが動的に変化する場合の対処について説明します。


1.名前で引けないと公開サーバは成り立たない

Webにしてもblogにしても、現在は公開サーバはDNSからグローバルIPアドレスを引けないと成り立ちません。

まず、グローバルIPアドレスは必須です。

CATV等でローカルIPだけというような環境ではまず無理です。

また、一般人が普通のISPに普通のコースで契約した場合はグローバルIPアドレスであってもモデムの電源断等のタイミングでIPアドレスが変化してしまいます。

最低いつでも変化しない「名前」で引ける必要があります。

このようなニーズのためにDynamic DNSというサービスがあります。

ISPが独自にコースとして持っている場合もありますし、Dyndns.orgMydns.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

最初へ戻る

inserted by FC2 system