デフォルトでは、DNS は平文の接続で送られます。DNS over TLS (DoT) は、暗号化された接続で DNS クエリを送る方法のひとつです。Cloudflare は標準ポート 853 で DNS over TLS に対応しており、RFC 7858 ↗ に準拠しています。
DoT は、標準の DNS トラフィックを TLS で暗号化した TCP 接続の内側に包みます。デバイスとリゾルバーの間にいる第三者が、DNS クエリを読んだり改ざんしたりできなくなります。
Cloudflare は、1.1.1.1、1.0.0.1、および対応する IPv6 アドレス(2606:4700:4700::1111 と 2606:4700:4700::1001)のポート 853 で DNS over TLS (DoT) に対応しています。DoT クライアントが IP アドレスに対応していない場合は、ホスト名 one.one.one.one でも Cloudflare の DoT エンドポイントに接続できます。
スタブリゾルバーは、デバイス上で DNS クエリを DNS リゾルバーへ送るクライアントソフトウェアです。DoT では、スタブリゾルバーは TLS 接続でリゾルバーに接続します。
- 接続の前に、DNS スタブリゾルバーは 1.1.1.1 の TLS 証明書のフィンガープリントを保存します。このフィンガープリントは、証明書の公開鍵情報(Subject Public Key Info、SPKI)の SHA-256 ハッシュを Base64 でエンコードしたもので、SPKI ピンと呼ばれます。スタブリゾルバーはこのピンを使い、接続先が正規の 1.1.1.1 サーバーであることを検証します。
- DNS スタブリゾルバーは
1.1.1.1:853と TCP 接続を確立します。 - DNS スタブリゾルバーは TLS ハンドシェイクを開始します。双方が暗号化パラメータに合意し、クライアントがサーバーの身元を検証する処理です。
- TLS ハンドシェイク中に、1.1.1.1 は自身の TLS 証明書を提示します。
- TLS 接続が確立すると、DNS スタブリゾルバーは暗号化された接続で DNS を送信できます。盗聴や改ざんを防げます。
- TLS 接続上で送る DNS クエリは、すべて TCP 上での DNS 送信 ↗ の仕様に従う必要があります。
kdig -d @1.1.1.1 +tls-ca +tls-host=one.one.one.one example.com
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(1.1.1.1), port(853), protocol(TCP)
;; DEBUG: TLS, imported 138 system certificates
;; DEBUG: TLS, received certificate hierarchy:
;; DEBUG: #1, C=US,ST=California,L=San Francisco,O=Cloudflare\, Inc.,CN=cloudflare-dns.com
;; DEBUG: SHA-256 PIN: GP8Knf7qBae+aIfythytMbYnL+yowaWVeD6MoLHkVRg=
;; DEBUG: #2, C=US,O=DigiCert Inc,CN=DigiCert TLS Hybrid ECC SHA384 2020 CA1
;; DEBUG: SHA-256 PIN: e0IRz5Tio3GA1Xs4fUVWmH1xHDiH2dMbVtCBSkOIdqM=
;; DEBUG: TLS, skipping certificate PIN check
;; DEBUG: TLS, The certificate is trusted.
;; TLS session (TLS1.3)-(ECDHE-X25519)-(ECDSA-SECP256R1-SHA256)-(AES-256-GCM)
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 3395
;; Flags: qr rd ra; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 1
;; EDNS PSEUDOSECTION:
;; Version: 0; flags: ; UDP size: 1232 B; ext-rcode: NOERROR
;; PADDING: 408 B
;; QUESTION SECTION:
;; example.com. IN A
;; ANSWER SECTION:
example.com. 75897 IN A 93.184.216.34
;; Received 468 B
;; Time 2023-06-23 18:05:42 PDT
;; From 1.1.1.1@853(TCP) in 12.1 msCloudflare の DNS over TLS は、TLS 1.3 と TLS 1.2 に対応しています。