Last Updated: 2/6/2024, 5:44:57 AM

# Cloudflare ってなんだ?

WARNING

書きかけです。

# 仕組みと構成

設定にあたってほしい知識

昔 NHK のニュースを見ていた時に...

以下のサイトがとても参考になります。

# 環境

今回の環境は、次の通りになります。 バリュー・ドメインで example.com と言うドメインを買いました。 Heroku にアップロードしたウェブアプリに、 Cloudflare を使ってルートドメインを割り当てます。 パソコンは Mac を使いました。

今回の作業の構成
作業OS macOS
サーバ Heroku
レジストラ バリュー・ドメイン
裏技 DNS サーバ Cloudflare

ちなみに Cloudflare 以外にも AWS の Route53 で alias recoed (opens new window) というのを使っても同じことができそう。試してはいません。

# Step 1. アカウントの登録

# Step 2. ドメインの登録

# Step 3. リソースレコードの追加

DNS サーバの設定、1行1行のことをリソースレコードということがあります。

# (1) 固定の IP アドレスが払い出されている場合

# (2) DNS サーバが払い出されている場合

PaaS である Heroku や、あるいはレンタルサーバであるロリポップなどは DDNS を使い固定 IP アドレスではなく DNS サーバをはらい出してくれます。

CNAME レコードを追加します。 これについては後述させていただきます。

Cloudflare に Heroku の DNS サーバを登録 Heroku が出してくれた DNS target を Cloudflare の DNS サーバに登録します。

Cloudflare > DNS > DNS Records

Type  Name        Value                   TTL
CNAME example.com dnstarget.herokudns.com Automatic

ビックリマーク ! がつきますが特に問題ありません。 ビックリマーク ! の上にカーソルを合わせると 次のようなメッセージが表示され、和訳すると以下のようなものです。

このレコードには CNAME Flattening が適用されます。 なぜならルート(即ちエイペックス)CNAME レコードは、 DNS の仕様で制限されているためでしょう。 詳細はこちら
CNAME Flattening will be applied to this record since root (i.e. apex) CNAME records are limited by the DNS specification. Learn more

# Step 4. ネームサーバの変更

VALUE-DOAMIN に登録 Cloudflare > DNS > Cloudflare Nameservers に書かれている DNS サーバを VALUE-DOMAIN に登録する。

VALUE-DOAIMN > ネームサーバーの変更 を開き追記。

# Step 5. TTL が過ぎるのを待つ

TTL が経過するまで待つ。TTL は dig コマンドで確認できる。 3, 4 日待たされました。

# 設定反映前

$ dig @8.8.8.8 +trace python.ms
; <<>> DiG 9.8.3-P1 <<>> @8.8.8.8 +trace python.ms
; (1 server found)
;; global options: +cmd
.	153864	IN	NS	m.root-servers.net.
.	153864	IN	NS	b.root-servers.net.
.	153864	IN	NS	c.root-servers.net.
.	153864	IN	NS	d.root-servers.net.
.	153864	IN	NS	e.root-servers.net.
.	153864	IN	NS	f.root-servers.net.
.	153864	IN	NS	g.root-servers.net.
.	153864	IN	NS	h.root-servers.net.
.	153864	IN	NS	i.root-servers.net.
.	153864	IN	NS	a.root-servers.net.
.	153864	IN	NS	j.root-servers.net.
.	153864	IN	NS	k.root-servers.net.
.	153864	IN	NS	l.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 46 ms

ms.	172800	IN	NS	ns.cocca.fr.
ms.	172800	IN	NS	ns.coccaregistry.org.
ms.	172800	IN	NS	ms-ns.anycast.pch.net.
;; Received 253 bytes from 192.203.230.10#53(192.203.230.10) in 28 ms

python.ms.	86400	IN	NS	ns1.value-domain.com.
python.ms.	86400	IN	NS	ns2.value-domain.com.
;; Received 79 bytes from 185.17.236.111#53(185.17.236.111) in 306 ms

;; connection timed out; no servers could be reached
$ 

# 設定反映後

$ dig python.ms @8.8.8.8 +trace

; <<>> DiG 9.8.3-P1 <<>> python.ms @8.8.8.8 +trace
;; global options: +cmd
.			192234	IN	NS	m.root-servers.net.
.			192234	IN	NS	b.root-servers.net.
.			192234	IN	NS	c.root-servers.net.
.			192234	IN	NS	d.root-servers.net.
.			192234	IN	NS	e.root-servers.net.
.			192234	IN	NS	f.root-servers.net.
.			192234	IN	NS	g.root-servers.net.
.			192234	IN	NS	h.root-servers.net.
.			192234	IN	NS	i.root-servers.net.
.			192234	IN	NS	j.root-servers.net.
.			192234	IN	NS	a.root-servers.net.
.			192234	IN	NS	k.root-servers.net.
.			192234	IN	NS	l.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 436 ms

ms.			172800	IN	NS	ns.cocca.fr.
ms.			172800	IN	NS	ms-ns.anycast.pch.net.
ms.			172800	IN	NS	ns.coccaregistry.org.
;; Received 253 bytes from 192.36.148.17#53(192.36.148.17) in 159 ms

python.ms.		86400	IN	NS	pablo.ns.cloudflare.com.
python.ms.		86400	IN	NS	abby.ns.cloudflare.com.
;; Received 83 bytes from 204.61.216.33#53(204.61.216.33) in 118 ms

python.ms.		300	IN	A	104.24.98.177
python.ms.		300	IN	A	104.24.99.177
;; Received 59 bytes from 173.245.58.100#53(173.245.58.100) in 24 ms
$

# CNAME Flattening

CloudFlare では CNAME Flattening を提供してくれている。 ただ、この機能はおろか CloudFlare が何者なのかさえわからない...。

Cloudflare は CDN に分類されるらしい。CDN が何かも知らない。

有名な大学のビジネスコンテストで1位を取ったらしいけど、 CDN やってくれて高性能な DNS サーバまで提供してくれる。 いまのところ無課金です。

もはや慈善団体以外の何物にも感じられない。 はやくどのタミングで課金されるか調べないと...

ここでは CNAM Flattening について考えます。

# (1) 概要

CloudFlare の CNAME レコードを書き込むと

CNAME example.com jkjfas.herokudns.com
CNAME example.com jkjfas.herokudns.com

CloudFlare の実際の設定は、 A レコードに変換してくれている。

python.ms.		300	IN	A	104.24.99.177
python.ms.		300	IN	A	104.24.98.177

# (2) 仕組み

「権威サーバ」として答えるだけではなく、 「DNS リゾルバ」として A レコードを見つけまで問い合わせ続け、 A レコーをの結果を返す。

CNAME Flattening の導入 (opens new window)
Introducing CNAME Flattening - Cloudflare

CNAME Flattening を実現するために、「権威 DNS サーバ」の構成を、 特定の場合において、「DNS リゾルバ」として動作するように拡張しました。
To accomplish this, we extended our authoritative DNS infrastructure to, in certain cases, act as a kind of DNS resolver.

これによって、もしルートに CNAME があった場合、 直接レコードを返すのではなく
What happens is that, if there's a CNAME at the root, rather than returning that record directly

A レコードを発見するまで CNAME の連なりを再帰的に処理します。
we recurse through the CNAME chain ourselves until we find an A Record.

A レコードを発見した箇所で、A レコードと関連する IP アドレスを返します。
At that point, we return the IP address associated with the A Record.

# (3) 現在の解決策 CNAME Flattening

またその禁止されていることを CNAME で可能にする方法を CNAME Flattening というらしい。

CNAME Flattening を理解し設定する - Cloudflare (opens new window)
Understand and configure CNAME Flattening - Cloudflare

CNAME Flattening は DNS の仕様に反することなくルートドメインに対して CNAME レコードを作成することができます。
CNAME Flattening allows a CNAME record to be created for the root domain without violating DNS specifications.

DNS の仕様 (RFC) によって、ドメインは CNAME レコードと他の異なるタイプの DNS レコードが、 同じ名前を共有するように設定することはできない。 また DNS の仕様 (RFC) は、CNAME レコードではなく A レコードと関係している MX レコードを書くように定めている。
Per DNS specifications (RFCs), a domain cannot have a CNAME record and another DNS record of a different type if both records would share the same name. DNS RFCs also require an MX record to correspond to a related A record and not a CNAME.

あなたの root への CNAME レコード(例えば example.com から example.herokuapp.com への CNAME レコード)が必要になった時、 このような仕様は問題になり得る(なんで?)。 しかもまた root ドメインにおいて、例えば メール配信のための MX レコードのような別の DNS レコードの種類が必要なります。
This is problematic when you need a CNAME for your root (for example, a CNAME from example.com to example.herokuapp.com) but also need another type of DNS record at the root domain such as an MX record for mail delivery.

Typically, the aforementioned situation would cause problems receiving email. However, CNAME Flattening ensures the chain of CNAMEs is followed to an A or AAAA record to allow mail delivery while still adhering to DNS RFCs. The CNAME responses are cached and DNS TTLs are respected.

CNAME Flattening still works if the corresponding DNS CNAME record is "grey clouded" in the DNS app of the Cloudflare dashboard.

# 参考文献

サイトを Cloudflare に登録する 基本は公式サイトに載っている。

  • [Configure Cloudflare and Heroku over HTTPS](Configure Cloudflare and Heroku over HTTPS)

日本語の説明も充実している。

# おわりに

以上になります。ありがとうございました。