最近の無料 Dynamic DNS について (備忘録)

久し振りに Linux から無料の dynamic DNS サービを使う必要が生じたのだが、軽くはまったので、経過を備忘録としてまとめておく。結論から言うと、最新のddclientを使えばほぼ問題ない。

まず、かつて最もメジャーな無料サービスだった dyndns.org は、無料サービスからの脱却をはかっているらしい。2011/11 に無料で登録可能なホストの数を 5 から 1 へと減らし、新規の無料ユーザーは全てDynDNS Pro のトライアルという扱い。トライアル期間(30日)が経過した後でも 1 ホストだけは登録可能という触れ込みだが、クレジットカードの情報を要求されることに抵抗がある。そもそも無料のトライアルページ自体普通にリンクを辿っては見つからないようだ。(かつて無料の real player をできるだけ深い階層に隠し、有料プレイヤーのダウンロードをさせようとしていた real networks のサイトを思い出す。) メリットも少なくない(現在別口で無料サービスの利用を続けているのだが、サービス自体は安定している。さらに、今使用中のルータ WRT54GL のデフォルトのファームウェアでサポートされている)が、フリーライダーの観点からすると残念な状態になっている。

free であることを押しているサービスは無いものか、ということで "free dynamic dns" を Google で検索すると、 http://freedns.afraid.org/ が上位に来る。ぱっと見、FreeBSD をベースにした質実な作りで、使い易そうだ。さっそくサインアップして A レコードを登録して見るが、問題なく動作し、反映も早い。ここを使うことにしたが、スクリプトによる自動更新が難しい。

http://freedns.afraid.org/scripts/freedns.clients.php にクライアントの一覧がある。ルータのファームウェアアップデート(DD-WRT)が一番筋がよさそうだが、ルータの設定をやりなおすのがやや面倒なのでパス。普通のクライアントの中では、inadyn が Ubuntu のパッケージとして存在するようなので入れてみる。/etc/inadyn.conf を適宜設定して走らせてみるが、「ERROR: Invalid update URL (2)」と言われる。Wireshark で見てみると、proxy のセッティングもしていないのに

GET http://freedns.afraid.org:0/dynamic/update.php? HTTP/1.0

などというリクエストを送っており、目を疑う。そりゃ invalid update URL とも返答されるはずだ。inadyn はスクリプト言語では書かれておらず、ソースからパッチをあてるのは面倒そうなので、別のクライアントを探すことに。

次に試したのは afraid-dyndns。こちらは perl ベース。インストールは簡単だったが、"No AccountHash" と(AccountHash を設定したにもかかわらず)言われてしまう。調べてみると、

    split /\s*=\s*/;
    $ARGV{$_[0]} = $_[1];

なる箇所がある。最近の perl では scalar context における split() が @_ に代入されなくなったため、これがまともに動いていない。ここは @_ への明示的代入にして直したが、今度は IP アドレスがわからないという。調べてみると、DomainTools の http://ip-address.domaintools.com/myip.xml がサービスを停止(一時的なものかもしれない。詳細は不明)したためらしい。これも http://checkip.dyndns.org/ をかわりに使えば解決する。具体的には

sub GetExternalIPFromDynDNSOrg {
    my $url = "http://checkip.dyndns.org/";
    my $response = get($url);
    die "Failed fetching IP address!" unless $response;
    if ($response !~ /Current IP Address: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {
	die "Unknown response format from $url: $response";
    }
    return $1;
}

などと定義して使えばいい。

ただ、ここまでやっても今度は "Could not authenticate." と言われる。どうも http://freedns.afraid.org/api/ を見てもよくわからず、そもそも AccountHash についての記述に一貫性がないように見える(base64(sha1('user|pass')) と account hash の文字列自体が違う。仕様が変更された?) inadyn と afraid-dyndns とで、API の呼び方が全く違うのも気にかかる。

さらに他のクライアントも見てみたが、ひどく適当に書かれているもの(ppp0 決めうちや、「スクリプトのこのあたりを『適宜』書き換えろ」というような作り)が目につく。

もう少しいいドキュメントがないかと探すと、Gentoo WIKI にddclient の 3.8.0 より後のものは freedns を使えるとある。3.8.1 をマニュアルでインストールすると、ようやくまともに動くセッティングができあがった。設定は protocol=freedns だけで、特別なことはいらない。ddclient.conf はこんな感じ。

protocol=freedns
use=web
login=login
password=pass
host.name

ddclient の nic_freedns_update() を見てみると、やはりちょっと面倒なことをしている。API の複雑さや遷移、http://freedns.afraid.org/scripts/freedns.clients.php に ddclient がなく、まともに動かないプログラムが多いこと(サンプル数あまりないけど)などから見るに、freedns.afraid.org と外部の開発者達との関係はあまりうまくいっていないのかもしれない。いずれにせよ、グッドラッパーの ddclient に感謝。

freedns.afraid.org 以外のサービスとしては、no-ip も使いやすい。同じ老舗ながら dyndns とは違い、無料サービスをベースに有料のプレミアムサービスで稼ごうという方針を維持している。クライアントは freedns 同様 ddclient で問題なく動く。