🌐

Cloudflare を ddclient で DDNS 化する

2020/11/30に公開

実は自分のブログのところで書いた記事の二番煎じなんだけど、自分のものを自分でパクる分には問題ないでしょ……多分。こっちはもうちょっとちゃんと書くよ。

ところで、少なくとも WordPress の地獄ぐてぐて[1]エディタより Zenn のほうが Markdown がもろに使えるだけ書きやすい。

以下本編。


TL;DR

Ubuntu 20.04 Focal Fossa が前提。後 root 。

目的は自宅ネットワークに動的に割り当てられたグローバル IP アドレスを Cloudflare に通達して事実上の DDNS にすること。やり方は、自宅の IP アドレスを拾ってきて、Cloudflare の DNS レコードを書き換える。

  1. ddclient を Launchpad から持ってくる。このとき Focal じゃなくて Groovy のパッケージを選ぶ
  2. dpkg -i ddclient_3.9.1-5_all.deb する
  3. vim /etc/ddclient.conf をいじる
  4. ddclient を叩いて終わり
  1. の設定は以下のようにする:
protocol=cloudflare
use=web,web=myip.dnsomatic.com
ttl=1

zone=example.com
login=<login@mail.com>
password=<Global Cloudflare API Key>

example.com,www.example.com,dogeza.example.com

前書き

AWS だか GCP だか IBM Cloud だか色々クラウドサービスがある中、物好きにも自宅サーバを立ててみたい人は一定数存在する。GCP やらの御一行はとてもじゃないがヤバい知識量を要求するので逃げたくなるのもわかるし、でも色々パソコン上で完結できる……といったジレンマがある。一方自宅鯖は大体ハードウェアの最下層からソフトウェアの頂上まで自分でやらねばならぬので、手間は置いといて、やってることは大体追える範疇だと思う。後電気代と通信量とハードウェア保守費以外の金を考えなくて済む。

さて、奇しくも自宅鯖を選んだ時、以下のような問題が浮上する。

  1. サーバのスペックが間に合わない。
  2. スペースが足りない。
  3. 電源がばくはつすると自宅が全焼して恐ろしいことになる

ここまでは何も考えなくても大体わかることだと思う。でも次みたいな結構シャレにならない問題がある。

  • グローバル IP アドレスが固定で降ってこない[2]

例えば DNS に www.example.com IN A 10.0.0.1 とやっても、グローバル IP アドレスが動的だとアドレスが 10.0.0.10 みたいになったとき手動で書き換えないといけない。また変わった瞬間からレコードをいじるまでは実質的にダウンタイムとなる。

1), 2), 3), 4) のいずれも金で解決できるが、そのようにできる人はそもそもこの記事を読まないと思う。コストは削減せねばならない。……都合よく。

DDNS クライアント, ddclient

DDNS クライアントといっても色々あるっぽい。例示しているときりがないので、ddclient っていうクライアントを使おうと思う。こいつは Cloudflare とうまい具合に喋ってくれて DDNS にかかる作業をうまくこなしてくれる。興味深いことに、Google Domains の DDNS 機能にも対応してくれている。

余談であるが、米・Ubiquiti社のルータ・Edgerouter X の DDNS 機能はつまるところ ddclient であった。むしろ Edgerouter から ddclient の存在を知った。便利。

インストール

Ubuntu 20.04 Focal Fossa でやる。しかし Focal だと apt 経由で入れた場合バージョンが古いせいで Cloudflare とうまく喋ってくれない。これは以下に起因する:

  1. Cloudflare の API は v1 と v4 の2種があり、古い方は v1 で話す
  2. v1 API はすでに提供を終了している

古いほうは v3.8.x 系である。新しい方は v3.9.x 系である。Launchpad のパッケージを見てもらえれば分かる通り、Focal では v3.8.3 で非常に都合が悪い。一方 Groovy は v3.9.1 で非常に都合が良い。別に動くので Groovy のほうの deb をダウンロードして、dpkg -i ddclient_3.9.1-5_all.deb でいいと思う。

私がやった時は依存の問題がいくつかあったが、そちらは apt install で雑に済ませてしまった。大丈夫かどうかはわからないが正常動作している。心配ならそもそも Focal ではなく Groovy を使うべきだろう。Groovy なら apt install ddclient で最新のものが入るはずだ。

ddclient --help でバージョン情報が出てくる。3.9.1 とかなら大丈夫。

設定

予め Cloudflare で DDNS の対象としたいドメイン(サブドメイン)の A レコードを作る。流し込む初期 IP アドレスはなんでもいい。繋がってしまうアドレスだとまずい気がするので、10.0.0.1[3] とでも。

ddclient の設定は話すと長くなるので、宣言的に済ませようと思う。以下の通りである。

$ vim /etc/ddclient.conf
protocol=cloudflare
use=web,web=myip.dnsomatic.com
ttl=1

zone=example.com                     # ----- 1
login=<login@mail.com>               # ----- 2
password=<Global Cloudflare API Key> # ----- 3

www.example.com,yeee.example.com,    # ----- 4

コメントの数字は以下のように対応する:

  1. 対象のドメインに対する Apex ドメイン。
  2. Cloudflare にログインするメールアドレス。
  3. Cloudflare のアカウントに結びつくグローバル API キー。別の奴持ってくるとエラー吐く。
  4. 更新したいドメイン。カンマ区切り。

設定が完了したら ddclient を root ないし sudo で実行すれば更新処理が入る。万が一うまくいっていないようだったら ddclient -v で詳細ログを舐められる。

注意点がある:

  • 間をおかず(5分間隔がベストに思う)更新すると Too Many Request で死ぬ
  • 詳細ログはあまり役に立たない

気をつけられたい。

仕上げに ddclient が定期実行されるようにする。デーモン化するという手もあるが cron でやるとシンプルでいいように思える。cron だと理論上ダウンタイムが最大5分発生するが……。

$ crontab -e
*/5 *  *  * * sudo ddclient

終わりに

固定アドレスがあればやらなくていいことなのでかなりニッチな話になった。コノヨがさしあたり IPv6 で包まれてあれば文字通り湯水の如くアドレス資源を消費できるのだが。早くその日が来ないかなあ。それ以前に日本の悪魔的 IPv6 環境を理解するのが先かな……。

脚注
  1. WP 5.0 から導入されたモダンなエディタ Gutenberg のこと。 ↩︎

  2. 固定で割り当てられている場合はもう読まなくて結構だと思います。 ↩︎

  3. 10.0.0.0 – 10.255.255.255 はプライベート IP アドレスとして予約されている。 ↩︎

Discussion