CloudflareのDNSのレコードにはProxied recordとDNS only recordがある。 簡単に説明すると以下のようになる。
正確な説明については以下のページを確認してもらうのがいい。
Cloudflare Proxy status
実際に chakku.jp
で CNAME 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"のチェックを外しておいたほうがいい。