狐の王国

人は誰でも心に王国を持っている。

AirMac で更新できる DDNS サーバを作る方法

いつの間にか DynDNS が AirMac(Airport) 非対応になってた。前は AirMac のダイナミック・グローバル・ホスト名のところに設定してやれば使えたはずだったのだが。

対応してる他のサービスはないかと思ったのだが、Duia DNS というサービスくらいしかなくて、しかもここは支払いが Paypal を用いた寄付という形なので、Paypal を寄付に使えない日本のアカウントから支払う方法がない。

しかしよく見るとどうやら AirMac のダイナミック・グローバル・ホスト名というのは RFC3007 準拠なのだとか書いてあるページが。あー、いつもの Apple の標準化されたものを採用したら Apple 以外誰も乗ってこなかったパターンですか……。

しかし標準があるということは自分の DNS サーバでも運用できるってことだよな。とりあえず昔から使ってるので bind を用いてやってみることにした。

今回はDDNS用にゾーンを切るのでセカンダリDNSが必要になるが、BuddyNS というサービスを利用してみることにした。

bind の named.conf の allow-transfer にBuddy NS のページ に書いてある IP アドレスを追加する。 ddns 用のゾーンファイルの NS レコードには Secondary DNS のリスト があるのでそちらのうち一つ以上を追加する。

そして AirMacDDNS の更新用のサーバを伝えるために、SRV レコードを追加する。

ゾーンファイルは以下のようになる。

$TTL 86400
@       IN      SOA     ns.example.org.        koshian.example.org. (
        2017042001          ;       Serial
             21600          ;       Refresh
              3600          ;       Retry
            604800          ;       Expire
               900   )      ;       Minimum

                NS      ns.example.org.
                NS      d.ns.buddyns.com.

_dns-update._udp     IN SRV  0 0 53 ns.example.org.

設定が正常に反映されてるかを確認するには host コマンドを使う。

$ host -t srv _dns-update._udp.ddns.example.org
_dns-update._udp.ddns.example.org has SRV record 0 0 53 ns.example.org.

それから更新のために TSIG を設定する。

$ dnssec-keygen -a hmac-md5 -b 512 -n HOST ddns.example.org

意外と時間がかかる……。

終わると2つのファイルが生成されるのだが、どっちも書いてある暗号化文字列は同じ。

$ cat Kddns.example.org.+157+63340.key
ddns.example.org. IN KEY 512 3 157 48HyAjh7blM3vRtrt7L2HMbCkc7RKPIHE9Q92MMb3e+iWQPr1yZ0wtfV pjhHI8KRh8Tl6PE4cRw8mnaQRFskUA==

そして named.conf に鍵を書き込む。

key "example" {
        algorithm hmac-md5;
        secret "48HyAjh7blM3vRtrt7L2HMbCkc7RKPIHE9Q92MMb3e+iWQPr1yZ0wtfV pjhHI8KRh8Tl6PE4cRw8mnaQRFskUA==";
};

zone "example.org" {
        type master;
        file "slave/example.org.zone";
        allow-update {
                127.0.0.1;
                key "example";
        };
};

確認のために nsupdate コマンドでリモートからホスト名を追加してみる。

$ nsupdate
> server ns.example.org
> zone ddns.example.org
> key ddns.example.org 48HyAjh7blM3vRtrt7L2HMbCkc7RKPIHE9Q92MMb3e+iWQPr1yZ0wtfV pjhHI8KRh8Tl6PE4cRw8mnaQRFskUA==
> update add myhome.ddns.example.org 60 A 192.168.0.1
> send
> quit
$ host myhome.ddns.example.org
myhome.ddns.example.org has address 192.168.0.1

うまくいってるようだ。

あとは AirMac(Airport) の「インターネット」→「インターネット・オプション」を開き、「ダイナミック・グローバル・ホスト名を使う」にチェック。上の例だとユーザー名は example 、パスワードは secret に指定した文字列になる。ターミナルからコピペするときに改行コードが紛れることがあるので、一旦エディタにペーストして改行コードを削るといい。

f:id:KoshianX:20170421123823p:plain

しかしこれをやると AirMac は自分で勝手にいろんなレコードを追加してくる。サブドメインを切ったのもそれが理由なのだが、DynDNS やらの DDNS サービスが AirMac に対応しなくなったの同じ理由なのかしらね。

ちなみに macOS にも設定の共有セクションにダイナミック・グローバル・ホスト名を設定する箇所がある。ポート転送で外部に公開してるサービスがあればこういうのを使うのも手かもね。いや macOS を外部公開はあんまりしたくないけれども。

DNS & BIND 第5版

DNS & BIND 第5版

昔勉強し始めた頃は第3版だった DNS & BIND ももう第5版なのね。読み直したりもしないとかなあ。はたまた bind から離れるべきか。

Sugano `Koshian' Yoshihisa(E) <koshian@foxking.org>