hnwの日記

CloudFlareで運用中の独自ドメインをダイナミックDNSとして利用する

CloudFlareといえば無料CDNサービスが有名ですが、高機能な無料DNSサービスも提供しています。筆者は趣味で独自ドメインを管理しており、以前はRoute53を使っていたのですが、昨年の2月からCloudFlareを利用しています(参考:「CloudFlareのCNAME FlatteningをGitHub Pagesで使ってみた」)。10ヶ月ほどの運用で全く不満はありません。

独自ドメインでダイナミックDNS

さて、せっかく独自ドメインを持っているのですから、ダイナミックDNS独自ドメインでやりたいところですよね。実は、各種ダイナミックDNSサービスの自動更新を行ってくれるPerl製のツールddclientが最新版3.8.3からCloudFlareに対応しています。これを使えば独自ドメインのダイナミックDNSがお手軽にできるというわけです。

Debianのddclientにパッチを当てる

今回、筆者はRaspberry Pi 2上でddclientを利用しました。Raspberry Pi 用OSであるRaspbianは現在Debian 8 (jessie) ベースになっているのですが、残念ながらjessieで提供されているddclientのバージョンは3.8.2です。


パッケージ版をあきらめてソースコードから入れてしまうという選択肢もありますが、Debianのパッケージ版だとDebianの流儀でデーモンとして管理できる点が大きなメリットです。そこで、今回はパッケージ版に手動でパッチを当てることにしました。


具体的には、下記手順のようにddclient 3.8.3のtar ballからddclientスクリプトを取り出し、ごく小さなパッチを当てた上でDebianパッケージ版の /usr/sbin/ddclient を書き換えました。

$ sudo apt-get install ddclient libjson-any-perl
$ tar xvjf ddclient-3.8.3.tar.bz2
$ curl -L -O https://gist.github.com/hnw/3e2b08d934ce3d85ff73/raw/ddclient-3.8.3-debian.patch
$ patch -p0 < ddclient-3.8.3-debian.patch
$ sudo cp ddclient-3.8.3/ddclient /usr/sbin/ddclient


ちなみに、ddclientの動作に JSON::Any が無いと怒られるのですが、依存パッケージに含まれていないようなので手動でインストールしています。

設定ファイルを手動で設定する

Debianのddclientインストール時に設定ウィザード的なものがあれこれ質問をしてきて設定ファイルを埋めようとしてくるのですが、当然ながらCloudFlareには対応していません。Escキーを連打するなどして適当にやり過ごしましょう。


その後、改めて設定ファイルを手動で書いていきます。まず、/etc/ddclient.confの設定です。筆者は次のように記述しました。

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

protocol=cloudflare

ssl=yes
use=web
server=www.cloudflare.com
zone=[CloudFlareに預けてあるドメイン名]
login=[CloudFlareのログインメールアドレス]
password=[API key]
[更新したいホスト名のFQDN]


ここまでで動作確認をしてみましょう。この際、CloudFlareの管理コンソールから今回利用したいAレコードをあらかじめ登録しておく必要があるので注意してください。うまくいけば下記のようにCloudFlareのAPIを叩いてレコードが更新されるはずです。

$ sudo ddclient -daemon=0 -debug -verbose -noquiet
(略)
SUCCESS:  home.example.com -- Updated Successfully to 192.0.2.1
$


上記で正常に動作していることを確認したところで、/etc/default/ddclientを書き換え、run_daemon="true"とします。これで5分に1回外向きのIPをチェックし、必要ならCloudFlareのAレコードが自動更新される環境が手に入りました。


下記のようにserviceコマンドを使えば現在の状況が確認もできます。

$ sudo service ddclient status
● ddclient.service - LSB: Update dynamic domain name service entries
   Loaded: loaded (/etc/init.d/ddclient)
   Active: active (running) since Sun 2016-01-03 18:55:28 UTC; 7h ago
  Process: 385 ExecStart=/etc/init.d/ddclient start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/ddclient.service
           └─536 ddclient - sleeping for 230 seconds

Jan 03 18:55:28 raspberrypi systemd[1]: Started LSB: Update dynamic domain name service entries.
Jan 03 21:01:02 raspberrypi ddclient[2282]: WARNING:  TIMEOUT: checkip.dyndns.org after 120 seconds
Jan 03 22:09:44 raspberrypi ddclient[3131]: WARNING:  TIMEOUT: checkip.dyndns.org after 120 seconds
Jan 03 22:31:56 raspberrypi ddclient[3422]: WARNING:  TIMEOUT: checkip.dyndns.org after 120 seconds
Jan 03 23:15:30 raspberrypi ddclient[3947]: WARNING:  TIMEOUT: checkip.dyndns.org after 120 seconds


/var/log/以下のエラーも集約してくれて便利です。どうやら自分のIPアドレスを調べるサービスが落ちていたようですね…。