さくらインターネット Advent Calendar 2021 7日目の記事です。
DNSコンテンツサーバ機能を提供するさくらのクラウドの「DNSアプライアンス」では、2021年9月からHTTPSリソースレコード・SVCBリソースレコードをサポートしています。
こちらの紹介記事になります。
HTTPSリソースレコード(HTTPS RR)とは、DNSでHTTPSサーバに接続する際のALPNなどのパラメータを渡すことができる新しいDNSのレコードタイプで、CNAMEと異なりZone APEXにも設定ができるのが特徴です。また、HTTPSレコードがある場合、初回からHTTPS接続を行うHSTS(HTTP Strict Transport Security)としても利用されます。CDNのcloudflareやiOSのSafariではすでにデフォルトで使われております。
HTTPS RR・SVCB RRについては以下の記事も参考になります
HTTP RRの仕様は近いうちにRFCになるかと思います。
HTTP/3対応のサーバの準備
まず、実験に使うサーバを用意します。
さくらのクラウドの仮想サーバを1台作成します。今回はOSにRocky Linux 8.5を使いました。
サーバ起動後、必要なポートを開けます
$ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --permanent --add-port=443/udp $ sudo firewall-cmd --reload
今回の実験ではWebサーバとしてHTTP/3が利用できる Caddy というサーバを使います。
CaddyはGoで書かれており、HTTPS周りの設定を自動で行ったり、Let's EncryptやZeroSSLから証明書を取得してインストールしてくれるなど便利なやつです。
Caddyのインストールはこちらにドキュメントがあります。今回はdnf/rpm系OSなので、
$ sudo dnf install 'dnf-command(copr)' $ sudo dnf copr enable @caddy/caddy $ sudo dnf install caddy $ sudo systemctl start caddy $ sudo systemctl enable caddy
この手順でインストールと起動ができました。
Caddyのデフォルトの設定は /etc/caddy/Caddyfile にあり、コメントを除くと
:80 {
# Set this path to your site's directory.
root * /usr/share/caddy
# Enable the static file server.
file_server
}
のようになってました。癖のある設定ファイルですが、 /usr/share/caddy をドキュメントルートして、静的なファイル配信を行うサーバが port 80 で起動します。
ブラウザからIPアドレスでアクセスするとやや斜めに傾いたデフォルトのページがみれました。

これでCaddyのセットアップは一旦OKです。
DNSレコードの登録
まずは、通常のAレコードからさくらのクラウドのコントロールパネルから追加します。

次に、HTTPSレコードも登録

HTTP RRでは、Svc Priorityに 0 を入れるとエイリアスモードとなります。Zone APEXに指定する際などに使います。今回はエイリアスではないので適当な数値 10 を入れています。
Target Nameはホスト名になりますが、. (ドット) を入れることで同名のAレコードを参照するよう指定できます。
Svc ParamsにサーバにHTTPS接続する際のパラメータを入力します。
alpn=h3,h3-29,h2 ipv4hint=198.51.100.133
CaddyはHTTP/3(h3, h3-29)、HTTP2に対応しているのでALPNをこのように指定しました。ipv4hintのIPはAレコードのIPアドレスと同じです。
登録ができたら、Google Public DNSを使って確認してみます。
{
"Status": 0,
"TC": false,
"RD": true,
"RA": true,
"AD": false,
"CD": false,
"Question": [
{
"name": "caddy.nomadscafe.tokyo.",
"type": 65
}
],
"Answer": [
{
"name": "caddy.nomadscafe.tokyo.",
"type": 65,
"TTL": 30,
"data": "10 . alpn=h3,h3-29,h2 ipv4hint=198.51.100.133"
}
],
"Comment": "Response from ."
}
Caddyの設定
デフォルトではポート80をlistenしているだけなので、HTTPSが利用できるよう設定を変更します。
{
servers :443 {
protocol {
experimental_http3
}
}
}
caddy.nomadscafe.tokyo {
log
root * /usr/share/caddy
file_server
}
これでサーバを再起動すると、HTTP/3を有効にして caddy.nomadscafe.tokyo の証明書取得も行ってくれました。

ブラウザからのHTTPSのアクセスも問題なくできました。Firefoxの開発ツールでHTTP/3で通信していることも確認できました。

Firefoxでは、HTTPS RRの使用が、DNS over HTTPS (DoH)を使用したときに限られています。about:networking とURL入力欄に打ち込むとDNS照会ツールが使えるので、これを使って確認します。
まず、DoHを使用しない場合

HTTP RRは空っぽです。次に DoHを有効にした場合 (cloudflareを使いました)

HTTP RRの欄にHTTPSレコードに入力したものが表示されました。
Aレコードを消して HTTPS レコードを試す
このままでは HTTPS レコードを使ってアクセスしているのか分かりにくいので、Aレコードを消してみることにしました。

svc.nomadscafe.tokyo として新しいAレコードを置き、caddy.nomadscafe.tokyo の Target Nameをそちらに向け、caddy.nomadscafe.tokyo の Aレコードを削除しました。

IPアドレスがUNKOWNになりましたが、HTTPS レコードは表示されます。DoHの有効のFirefoxブラウザでのアクセスもできました。
ただし、リロードを繰り返すとタイミングによって名前解決に失敗したエラーがでることがあります。これは about:config で network.dns.force_waiting_https_rr を true にすることで出なくなりますが、Aレコードがないのがおそらく異常なので、この設定を常用する必要はありません。
macOS CatalinaのSafariはHTTPS RRに対応していないのでアクセスができません。

macOS Big SurやiOS 15のSafariでは特に設定なくアクセスできました。

Chrome(96.0.4664.93)は対応していないのかDoHを有効にしてもアクセスできませんでした。
まとめ
ということで、HTTPSリソースレコードを使って、実験をしてみました。現状メリットが大きいものではないですが、今後使われるようになっていくのでしょう。お試しあれ~