1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ddclientでCloudflareのDNSを更新しようとしたときにハマった話

Posted at

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

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?