概要

EdgeRouter X にはビルトインの DDNS 機能1が搭載されていますがドキュメントは具体的な設定例を掲載していません。設定を調整してみたところ EdgeRouter でも Cloudflare の DNS サーバーの AAAA レコードが自動更新されるような設定ができたのでご紹介します。

環境

モデル

EdgeRouter X 5-Port

EdgeOS

v1.10.9

Linux

ubnt 3.10.107-UBNT

ddclient

v3.8.3

libio-socket-inet6-perl

v2.69-2

事前準備(+ファームウェアのアップデート時の作業)

EdgeRouter に搭載されている DDNS クライアントは ddclient です。
EdgeOS v1.x では IPv6 サポートのためには Perl ライブラリーである IO::Socket:INET6 のインストールが必要で、事前準備のほかファームウェアのアップデートの際にも以下を実行する必要があります。

$ sudo apt-get update
$ sudo apt-get install libio-socket-inet6-perl

EdgeRouter におけるパッケージのインストールに関しては公式のドキュメント2も参考にしてください。

設定

続いて CLI から DDNS の設定を行っていきます。
インターフェイス名(ここでは eth0)とホスト名等は適宜読み替えてください。

  • host-name
    • DDNS として IP アドレスが更新されるホスト名を指定します。
  • options
    • ipv6=yes, if-skip=inet6 を含めるのがポイントです。zone= に続けてゾーン名を指定します。
    • ifconfig eth0 から IP アドレスを取得する際、if-skip に指定された文字列までが読み飛ばされます。
  • login
    • Cloudflare のログイン時のメールアドレスを指定します。
  • password
    • Cloudflare の API キー3を指定します。
  • protocol
    • cloudflare 固定です。
$ configure
$ set service dns dynamic interface eth0 service custom-cloudflare host-name ddns.example.com
$ set service dns dynamic interface eth0 service custom-cloudflare options 'ipv6=yes, if-skip=inet6, zone=example.com'
$ set service dns dynamic interface eth0 service custom-cloudflare login ******@*******.**
$ set service dns dynamic interface eth0 service custom-cloudflare password *************************************
$ set service dns dynamic interface eth0 service custom-cloudflare protocol cloudflare
$ commit; save

以上で設定は完了です。Cloudflare の管理画面で AAAA レコードが更新されていれば成功です。

トラブルシューティング

もし IP アドレスが更新されない場合は以下を参考にしてみてください。

CLI から更新状況を確認する

以下のコマンドで最終更新日時と更新されたアドレスが表示できます。

$ show dns dynamic status

CLI から確認した更新状況がおかしい

ddclient は DNS レコードを更新したあとに更新状況をキャッシュに保存します。ただ、ddclient に Cloudflare のレコードを複数個設定した場合、先頭のレコード以外の更新状況が正常にキャッシュされません。また、複数個のホストが設定されている際に特定のホストが失敗した場合に、後続のホストが処理されません。これらは 2021/03 時点で Debian 不安定版最新である 3.9.1-7 においても修正が適用されていません。

ddclient に対して以下の 2 つの PR のパッチを適用することで正常に更新状況が保存され、すべてのホストが処理されるようになります。 EdgeRouter の場合は /usr/sbin/ddclient に実体となる /usr/sbin/ddclient-ubnt へのシンボリックリンクがあります。

CLI から強制的に更新を実行する

/etc/ddclient 以下に ddclient_XXX.conf のような名前で設定ファイルが自動生成されています。
以下のコマンドで /usr/sbin/ddclient を実行すると原因がわかるかもしれません。
(インターフェイス名は読み替えてください)

$ sudo ddclient -verbose -force -file /etc/ddclient/ddclient_eth0.conf

脚注