SVCB RRでよく使われる3つのポイントを紹介

2025年08月20日 水曜日


【この記事を書いた人】
山本 和彦

Haskellコミュニティでは、ネットワーク関連を担当。 4児の父であり、家庭では子供たちと、ジョギング、サッカー、スキー、釣り、クワガタ採集をして過ごす。

「SVCB RRでよく使われる3つのポイントを紹介」のイメージ

RFC9460で定義されたSVCB(Service Binding)は、インターネット上のサービスに関する情報を提供するためのRR(Resource Record)です。すでに、以下のような形で使われています。

  1. 暗号化されたDNSサーバの探索
  2. WebサーバがサポートするHTTPのバージョンの表明
  3. 頂点(apex)ドメインを外部Webサービスへの別名として利用

SVCB RRの仕様はかなり込み入っているのですが、この記事では、よく使われている上記3つの例を簡潔に紹介します。

SVCB の書式

暗号化されたDNSサーバの探索」で紹介した例をおさらいしてみましょう。暗号化されたDNSサーバを探索するには、特殊なドメイン名 “_dns.resolver.arpa” に対して SVCB RR を調べるのでした。

% dug @1.1.1.1 _dns.resolver.arpa svcb
...
_dns.resolver.arpa. 300(5 mins) IN  SVCB    1 one.one.one.one. alpn=["h2","h3"] port=443 ipv4hint=[1.1.1.1,1.0.0.1] ipv6hint=[2606:4700:4700::1111,2606:4700:4700::1001] dohpath="/dns-query{?dns}"
_dns.resolver.arpa. 300(5 mins) IN  SVCB    2 one.one.one.one. alpn=["dot"] port=853 ipv4hint=[1.1.1.1,1.0.0.1] ipv6hint=[2606:4700:4700::1111,2606:4700:4700::1001]
...

ここでは、dug (※) が表示する SVCB RR の書式を RFCの表記に近付くように変更しました。
※dugは、以前に「DNS検索コマンドdugの紹介」で紹介しています

SVCBは、以下の要素から構成されます。

  • プライオリティ:数字であり、小さい方が優先度が高い
  • 対象名
  • パラメータ群

SVCB RRには、別名モードでとサービスモードがあります。プライオリティが 0 の場合が別名モード、それ以外がサービスモードです。上記は、サービスモードの例です。

上記の例の対象名は、one.one.one.one です。CloudflareのパブリックDNSサーバは、1.1.1.1というIPアドレスの方が有名ですが、ちゃんと名前も付いているんですね。

上記の例では、プライオリティは 1 と 2 で、0 ではないので、両方ともサービスモードです。1はサービスモードで最も優先度が高く、2はその次に高い値です。プライオリティが1の場合のパラメータ群は、以下の通りです。

  • ALPN(Application Layer Protocol Negotiation):“h2” (HTTP/2)、“h3” (HTTP/3)
  • IPv4アドレス:1.1.1.1、1.0.0.1
  • IPv6アドレス:2606:4700:4700::1111、2606:4700:4700::1001
  • DNS over HTTP のパス:“/dns-query{?dns}”

このように one.one.one.one は、DNS over HTTP2 や DNS over HTTP3 を提供していること、また A RR や AAAA RR を別途検索しなくても、IPアドレスが得られることが分かります。

WebサーバがサポートするHTTPのバージョンの表明

QUICをゆっくり解説(2) ネゴせよ」では、ブラウザが HTTP/3 (HTTP over QUIC) を利用するために以下のような手順が踏まれることを説明しました。

  • ブラウザは、まず HTTP/2 で Web サーバにアクセスする
  • Web サーバは、HTTP/3でもサービスしていることをブラウザに知らせるために、Alt-Svc: h3=":443"という応答ヘッダを返す
  • ブラウザが、そのWebサーバに2回目以降アクセスする場合、Alt-Svc: を参考にして、HTTP/3 を利用する

SVCB RRは、汎用的な RR です。それと同じ書式を持つ別の名前のRRは、互換RRと呼ばれます。互換RRの一つに HTTPS RR があります。

サーバ側が、HTTPS RRを宣言しておくと、ブラウザは、最初のアクセスから HTTP/3 を利用できるようになります。賢明な方は、これまでの例から、HTTPS RR に ALPN を宣言するのだなと推測できたと思いますが、その通りです。

% dug www.google.com https
...
www.google.com. 7490(2 hours)   IN  HTTPS   1 . alpn=["h2","h3"]
...

www.google.com では、HTTP/2に加えて、HTTP/3でもアクセスできるのですね。

なお、サービスモードで、対象名が “.” の場合は、左端の名前と同じという意味です。

頂点ドメインを外部Webサービスへの別名として利用

頂点ドメインとは、自分が管理している一番上のドメインのことです。この記事では、例として example.jp を使います。また、Webサービスは外部に委託しており、その業者から example.jp.example.com が指定されているとします。

我々がやりたいのは、www.example.jp に加えて、example.jp という頂点ドメイン名でも、example.jp.example.com へ誘導することです。実は、CNAME(Canonical Name)の制限により、これが以外と技術的に難しいのです。

CNAME のおさらい

CNAME のおさらいをしましょう。以下の例では、読みやすくするために、DNS RR の一般的な記述方式から TTL(Time To Live) や IN を省略します。@ も使いません。

;; 正しい例
foo.example.jp. A        192.0.2.1
bar.example.jp. CNAME    foo.example.jp.

この例は、bar.example.jp は別名で、その正式名称は foo.example.jp と読みます。

CNAME の制約

CNAMEは、他の RR とは共存できません。つまり、別名には CNAME 以外の RR は書けないのです。たとえば以下のように、bar.example.jp が A RR を持つと、bar.example.jp の IPv4 アドレスが何なのか曖昧になってしまいます。

;; 間違った例
foo.example.jp. A        192.0.2.1
bar.example.jp. CNAME    foo.example.jp.
bar.example.jp. A        192.0.2.2 ;; 間違い

頂点ドメインとCNAME

一般的には、頂点ドメイン名には、NS や MX が宣言されています。そのため、実質的に頂点ドメインには CNAME は書けません。

;; 間違った例
example.jp.     MX    10 mail.example.jp.
example.jp.     NS       ns1.example.jp.
example.jp.     CNAME    www.example.jp. ;; 間違い
www.example.jp. A        192.0.2.3

example.jpでも、Web サービスを提供したいなら、A RR を直書きする必要があります。

;; 正しい例
example.jp.     MX    10 mail.example.jp.
example.jp.     NS       ns1.example.jp.
example.jp.     A        192.0.2.3
www.example.jp. A        192.0.2.3

Web サービスの外注

Web サービスを外注する場合、業者が指定したホスト名を CNAME に書くことになります。

;; 正しい例
example.jp.     MX    10 mail.example.jp.
example.jp.     NS       ns1.example.jp.
www.example.jp. CNAME    example.jp.example.com.

このように、間接参照にしておけば、業者は example.jp.example.com の IP アドレスを自由に変更できます。

頂点ドメインでもアクセスを許したいという要望は、CNAME の制約により、実現できません。

;; 間違った例
example.jp.     MX    10 mail.example.jp.
example.jp.     NS       ns1.example.jp.
example.jp.     CNAME    example.jp.example.com. ;; 間違い
www.example.jp. CNAME    example.jp.example.com.

HTTPS RR

HTTPS RR の別名モードが、CNAME RR の制約を解決します。

;; 正しい例
example.jp.     MX    10 mail.example.jp.
example.jp.     NS       ns1.example.jp.
example.jp.     HTTPS  0 example.jp.example.com.
www.example.jp. HTTPS  0 example.jp.example.com.

おわりに

すでに、いくつかのブラウザでは SVCB/HTTPS RR を活用していますので、読者のみなさんも知らない間に SVCB/HTTPS RR を利用しているかもしれませんね。

山本 和彦

2025年08月20日 水曜日

Haskellコミュニティでは、ネットワーク関連を担当。 4児の父であり、家庭では子供たちと、ジョギング、サッカー、スキー、釣り、クワガタ採集をして過ごす。

Related
関連記事