CloudflareでDNS管理をしていますが、固定IPでない自宅インターネット環境をDNSに登録したくて、ddclientを使ってDNSレコードを更新しようとしたところ、すんなりと行かなかったので顛末を記録します。
なおddclientのインストール方法とCloudflareでAPIトークンを発行する手順についてはこちらでは説明いたしません。
CloudflareのアカウントをGoogleアカウントで登録していた
Cloudflareのアカウントを作成する場合、メールアドレスで作成する方法と、GoogleアカウントまたはAppleアカウントで登録する方法があります。
私は、メールアドレスではなくGoogleアカウントで登録をしていました。
Cloudflareが示した認証情報
ddclientをセットアップする際に求められる情報として、メールアドレスとAPIトークンがあります。
しかしAPIトークンを発行したとき、確認用URLとして示されたのが以下のようなコマンドでした。
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify"
-H "Authorization: Bearer 1234567893feefc5f0q5000bfo0c38d90bbeb"
-H "Content-Type:application/json"
認証情報にメールアドレスがなく、代わりにBearerトークンが表示されてますね。
ddclientの動作確認
ddclientの設定を行うにあたり、最初は以下のような設定を記入しておりました。
$ sudo vi /etc/ddclient.conf
login=<Googleアカウントに紐づいてるメールアドレス> \
password=<APIキー> \
※前後省略
これで動作確認をしてみてるんですが、全くうまく動きません。
-v
を付けてログを見てみた結果を抜粋します。
400 Bad Request
が返ってきてますね。なんだか認証に使う情報がマッチしてないように見えます。
UPDATE: updating example.com
DEBUG: proxy =
DEBUG: url = https://api.cloudflare.com/client/v4/zones?name=example.com
DEBUG: server = api.cloudflare.com
CONNECTED: using SSL
SENDING: GET /client/v4/zones?name=example.com HTTP/1.0
SENDING: Host: api.cloudflare.com
SENDING: User-Agent: ddclient/3.9.1
SENDING: Connection: close
SENDING: X-Auth-Email: example@gmail.com
SENDING: X-Auth-Key: 1234567893feefc5f0q5000bfo0c38d90bbeb
SENDING: Content-Type: application/json
SENDING:
RECEIVE: HTTP/1.1 400 Bad Request
対処法
こちらについて、結論から申しますとddclientのプログラムとコンフィグの書き方を変更する必要がありました。
$ sudo vi /usr/sbin/ddclient
4643行目付近
- my $headers = "X-Auth-Email: $config{$key}{'login'}\n";
- $headers .= "X-Auth-Key: $config{$key}{'password'}\n";
- $headers .= "Content-Type: application/json";
+ my $headers = "Content-Type: application/json\n";
+ if ($config{$key}{'login'} eq 'token') {
+ $headers .= "Authorization: Bearer $config{$key}{'password'}";
+ } else {
+ $headers .= "X-Auth-Email: $config{$key}{'login'}\n";
+ $headers .= "X-Auth-Key: $config{$key}{'password'}";
+ }
$ sudo vi /etc/ddclient.conf
login=token \
password=<APIキー> \
※前後省略
これで改めてddclientを実行してみます。
今度は200 OK
が返ってきて、無事にDNSの更新が行われました。
UPDATE: updating example.com
DEBUG: proxy =
DEBUG: url = https://api.cloudflare.com/client/v4/zones?name=example.com
DEBUG: server = api.cloudflare.com
CONNECT: api.cloudflare.com
CONNECTED: using SSL
SENDING: GET /client/v4/zones?name=example.com HTTP/1.0
SENDING: Host: api.cloudflare.com
SENDING: User-Agent: ddclient/3.9.1
SENDING: Connection: close
SENDING: Content-Type: application/json
SENDING: Authorization: Bearer 1234567893feefc5f0q5000bfo0c38d90bbeb
SENDING:
RECEIVE: HTTP/1.1 200 OK
参考