SVCB / HTTPS レコード
概要
SVCB レコード(Service Binding) と HTTPS レコード は、サービスの接続パラメーターを DNS で公開するためのレコードです。RFC 9460(2023年)で標準化されており、SVCB のレコードタイプ番号は 64、HTTPS のレコードタイプ番号は 65 です。
HTTPS レコードは SVCB の HTTPS 特化型(SVCB の「HTTPS スキーム」バインディング)であり、構造は同じです。HTTPS レコードにより、クライアントは DNS 応答だけで接続先の IP アドレス、対応プロトコル(HTTP/2、HTTP/3)、TLS の暗号化パラメーターなどを事前に取得できます。従来は HTTP の接続開始後に追加のラウンドトリップで取得していた情報を DNS クエリ 1 回に集約でき、接続の高速化につながります。
仕組み
SVCB / HTTPS レコードは AliasMode と ServiceMode の 2 つのモードを持ち、SvcParams で接続先の詳細情報を配信します。
レコードの構造
SVCB / HTTPS レコードには AliasMode と ServiceMode の 2 つのモードがあります。
; AliasMode (SvcPriority = 0)
example.com. IN HTTPS 0 cdn.example.net.
; ServiceMode (SvcPriority >= 1)
example.com. IN HTTPS 1 . alpn=h2,h3 ipv4hint=93.184.216.34 ipv6hint=2606:2800:21f:cb07::
| フィールド | 説明 |
|---|---|
| SvcPriority | 優先度。0 は AliasMode、1 以上 は ServiceMode |
| TargetName | サービスを提供するサーバーのホスト名。ServiceMode で . を指定するとオーナー名自身を意味する |
| SvcParams | キーバリュー形式のサービスパラメーター(ServiceMode のみ) |
AliasMode
SvcPriority が 0 の場合は AliasMode です。ゾーンの頂点(Apex ドメイン)から別のホスト名へのエイリアスを作成します。
example.com. IN HTTPS 0 cdn.example.net.
RFC 1035 ではゾーンの頂点に CNAME を設定できませんが、HTTPS レコードの AliasMode を使うと、CNAME と同等のエイリアス機能を実現できます。Cloudflare、Apple、Google がこの方法で Apex ドメインのエイリアスを実装しています。
ServiceMode
SvcPriority が 1 以上 の場合は ServiceMode です。サービスパラメーターを含みます。
example.com. IN HTTPS 1 . alpn=h2,h3 ipv4hint=93.184.216.34
example.com. IN HTTPS 2 backup.example.com. alpn=h2
SvcPriority の値が小さいレコードが優先されます。上記の例では Priority 1 のレコードが優先的に使用され、接続に失敗した場合に Priority 2 のレコードが使われます。
SvcParams(サービスパラメーター)
ServiceMode で指定できるパラメーターは RFC 9460 で定義されています。
| パラメーター | 説明 |
|---|---|
alpn | Application-Layer Protocol Negotiation。対応するプロトコルのリスト(h2、h3) |
no-default-alpn | デフォルトの ALPN を使わないことを明示する |
port | サービスのポート番号(デフォルトの 443 以外を使う場合) |
ipv4hint | サーバーの IPv4 アドレスのヒント。A レコードの問い合わせを省略できる |
ipv6hint | サーバーの IPv6 アドレスのヒント |
ech | Encrypted Client Hello の設定情報(ECHConfig) |
HTTP/3 の自動検出
alpn=h3 を含む HTTPS レコードが返ると、対応するブラウザーは最初から HTTP/3(QUIC)での接続を試みます。従来は Alt-Svc ヘッダーを受け取るまで HTTP/3 を使えませんでしたが、HTTPS レコードにより初回アクセスから HTTP/3 で接続できます。Chrome、Firefox、Safari はすべてこの動作に対応しています。
Encrypted Client Hello(ECH)
ECH は TLS ハンドシェイクの Client Hello メッセージを暗号化し、接続先のホスト名(SNI)を第三者から隠す技術です。HTTPS レコードの ech パラメーターで ECHConfig を配信します。
example.com. IN HTTPS 1 . alpn=h2,h3 ech=AEX+DQBBuwA...
ECH が有効な場合、クライアントは HTTPS レコードから ECHConfig を取得し、Client Hello の暗号化に使います。DNSSEC で HTTPS レコードの真正性を検証するとより安全です。
設定例
用途に応じた HTTPS レコードの記述パターンを示します。
基本的な HTTPS レコード
example.com. IN HTTPS 1 . alpn=h2,h3 ipv4hint=93.184.216.34 ipv6hint=2606:2800:21f:cb07::
HTTP/2 と HTTP/3 に対応し、IP アドレスのヒントを含む構成です。
Apex ドメインのエイリアス
example.com. IN HTTPS 0 cdn.example.net.
Apex ドメインへのアクセスを CDN にルーティングします。
冗長構成
example.com. IN HTTPS 1 primary.example.com. alpn=h2,h3
example.com. IN HTTPS 2 secondary.example.com. alpn=h2
Priority 1 のサーバーが優先され、障害時に Priority 2 にフォールバックします。
Cloudflare の HTTPS レコード
Cloudflare はプロキシが有効なドメインに対して HTTPS レコードを自動的に付与します。
example.com. IN HTTPS 1 . alpn=h3,h2 ipv4hint=104.16.132.229 ipv6hint=2606:4700::6810:84e5
確認方法
dig で HTTPS レコードを確認するには次のコマンドを使います。
dig HTTPS example.com
出力の ANSWER SECTION に SvcPriority、TargetName、SvcParams が表示されます。
;; ANSWER SECTION:
example.com. 300 IN HTTPS 1 . alpn="h3,h2" ipv4hint=104.16.132.229 ipv6hint=2606:4700::6810:84e5
SVCB レコードを確認する場合は HTTPS の代わりに TYPE64 を指定します。dig のバージョンによっては SVCB キーワードが使えないため、TYPE64 で直接指定します。
dig TYPE64 example.com
+short オプションでパラメーターの値だけを確認する方法も有用です。
dig HTTPS example.com +short
1 . alpn="h3,h2" ipv4hint=104.16.132.229 ipv6hint=2606:4700::6810:84e5
特定のネームサーバーに直接問い合わせるには @ でサーバーを指定します。
dig HTTPS example.com @8.8.8.8
Labee Dev Toolbox の DNS API は現在 SVCB / HTTPS レコードタイプに対応していないため、dig コマンドで確認します。
よくある問題
HTTPS レコードは比較的新しいレコードタイプであるため、リゾルバーの互換性やパラメーターの整合性に関する問題が発生しやすい領域です。
古い DNS リゾルバーが HTTPS レコードを返さない
HTTPS レコード(タイプ 65)は 2023 年に RFC 化された新しいレコードタイプであるため、古い DNS ソフトウェアやファイアウォールがこのレコードタイプを認識せずにドロップすることがあります。クライアントは HTTPS レコードの取得に失敗しても、従来の A / AAAA レコードにフォールバックして接続できます。
AliasMode のループ
HTTPS レコードの AliasMode が別のドメインを指し、そのドメインの HTTPS レコードが元のドメインを指すと、循環参照が発生します。RFC 9460 ではクライアントがループを検出して接続を中断することを規定していますが、デバッグが難しくなります。AliasMode のターゲットが ServiceMode の HTTPS レコードまたは A / AAAA レコードを持つことを確認します。
ipv4hint / ipv6hint と実際の A / AAAA レコードの不一致
ipv4hint や ipv6hint はクライアントへのヒントであり、正式な IP アドレスは A / AAAA レコードが権威です。ヒントの IP アドレスが古いと、クライアントが最初に接続するサーバーと実際のサーバーが異なり、接続が遅延することがあります。IP アドレスを変更する際は A / AAAA レコードと同時に HTTPS レコードのヒントも更新します。
ECH パラメーターの設定ミスでTLS ハンドシェイクが失敗する
ech パラメーターに設定した ECHConfig がサーバー側の設定と一致しない場合、TLS ハンドシェイクが失敗します。ECH をサポートするクライアントは GREASE ECH(RFC 8701)にフォールバックしますが、サーバーが ECH を正しくリトライするよう設定されていないと接続が切断されます。ECH の設定はサーバー側の TLS スタックの対応状況を十分に確認してから有効にします。