ちゃっくの泣き言

chakku.jp

Cloudflare DNSのproxied recordはGithub Pagesの検証で失敗する

投稿日時 2025-03-15 12:55

Proxied recordとは

CloudflareのDNSのレコードにはProxied recordとDNS only recordがある。 簡単に説明すると以下のようになる。

正確な説明については以下のページを確認してもらうのがいい。
Cloudflare Proxy status

実際に chakku.jpCNAME g google.comというレコードをproxy statusを有効にして作成してみると、名前解決した際に次のように解決される。 しかし、CNAMEで登録しているのに解決した結果はAレコードになっておりCloudflareのIPを指している。

$ dig g.chakku.jp +nostats +nocomments +nocmd

; <<>> DiG 9.10.6 <<>> g.chakku.jp +nostats +nocomments +nocmd
;; global options: +cmd
;g.chakku.jp.                   IN      A
g.chakku.jp.            260     IN      A       172.67.199.186
g.chakku.jp.            260     IN      A       104.21.42.32

CNAME x x.comというレコードをproxyを無効化してdns only recordとして作成すると、以下のように解決される。 先程の例とは異なり、正しくCNAMEが登録されている。

$ dig x.chakku.jp +nostats +nocomments +nocmd

; <<>> DiG 9.10.6 <<>> x.chakku.jp +nostats +nocomments +nocmd
;; global options: +cmd
;x.chakku.jp.                   IN      A
x.chakku.jp.            300     IN      CNAME   x.com.
x.com.                  300     IN      A       162.159.140.229

このようにproxied recordとして登録すると、Cloudflare DNSサーバーは登録した内容をそのまま公開せずに、 CloudflareのProxyを向くようなAレコードが登録される。

そして、CloudflareのDNSサーバーではA,AAAA,CNAMEレコードを追加する際に、"Proxy status"の欄にデフォルトでチェックが入っている。 これが有効化されていると、proxied recordとなってしまう。

何が問題か

通常の用途においてproxied recordは対して問題にならないと思う。 しかし、DNSサーバーのレコードを確認するようなプログラムと連携する場合に問題が発生する。

例えば、Github Pagesでカスタムドメインを利用する場合に、githubはDNSレコードの検証を行う。 実際に確認するコードは以下。
lib/github-pages-health-check/domain.rb
正確に読んでいないが CNAMEが正しく登録されているかとか AレコードがGithub PagesのIPアドレスに向いているかを確認している。

この検証がCNAMEやAレコードがGithub PagesのIPかを確認するが、proxied recordの場合はCloudflareのIPに向けたレコードを返してしまうため、検証に失敗してしまう。

このような問題があるため、DNSのレコードを検証するようなシステムを利用する場合にはCloudflareのDNSサーバーでのレコード登録は"Proxy status"のチェックを外しておいたほうがいい。