Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

さくらのクラウド DNSアプライアンスで HTTPS RR を試してみた

さくらインターネット Advent Calendar 2021 7日目の記事です。

DNSコンテンツサーバ機能を提供するさくらのクラウドの「DNSアプライアンス」では、2021年9月からHTTPSリソースレコード・SVCBリソースレコードをサポートしています。

cloud-news.sakura.ad.jp

こちらの紹介記事になります。

HTTPSリソースレコード(HTTPS RR)とは、DNSHTTPSサーバに接続する際のALPNなどのパラメータを渡すことができる新しいDNSのレコードタイプで、CNAMEと異なりZone APEXにも設定ができるのが特徴です。また、HTTPSレコードがある場合、初回からHTTPS接続を行うHSTS(HTTP Strict Transport Security)としても利用されます。CDNのcloudflareやiOSSafariではすでにデフォルトで使われております。

HTTPS RR・SVCB RRについては以下の記事も参考になります

milestone-of-se.nesuke.com

dev.classmethod.jp

www.janog.gr.jp

datatracker.ietf.org

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 というサーバを使います。

caddyserver.com

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アドレスでアクセスするとやや斜めに傾いたデフォルトのページがみれました。

f:id:kazeburo:20211207111649p:plain

これでCaddyのセットアップは一旦OKです。

DNSレコードの登録

まずは、通常のAレコードからさくらのクラウドのコントロールパネルから追加します。

f:id:kazeburo:20211207111833p:plain

次に、HTTPSレコードも登録

f:id:kazeburo:20211207111902p:plain

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 ."
}

dns.google

Caddyの設定

デフォルトではポート80をlistenしているだけなので、HTTPSが利用できるよう設定を変更します。

{
  servers :443 {
    protocol {
      experimental_http3
    }
  }
}
 
caddy.nomadscafe.tokyo {
  log
  root * /usr/share/caddy
  file_server
}

これでサーバを再起動すると、HTTP/3を有効にして caddy.nomadscafe.tokyo の証明書取得も行ってくれました。

f:id:kazeburo:20211207112353p:plain

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

f:id:kazeburo:20211207112512p:plain

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

まず、DoHを使用しない場合

f:id:kazeburo:20211207112609p:plain

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

f:id:kazeburo:20211207112634p:plain

HTTP RRの欄にHTTPSレコードに入力したものが表示されました。

Aレコードを消して HTTPS レコードを試す

このままでは HTTPS レコードを使ってアクセスしているのか分かりにくいので、Aレコードを消してみることにしました。

f:id:kazeburo:20211207112831p:plain

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

FirefoxのツールにてDNSの確認をします。

f:id:kazeburo:20211207112912p:plain

IPアドレスがUNKOWNになりましたが、HTTPS レコードは表示されます。DoHの有効のFirefoxブラウザでのアクセスもできました。

ただし、リロードを繰り返すとタイミングによって名前解決に失敗したエラーがでることがあります。これは about:confignetwork.dns.force_waiting_https_rrtrue にすることで出なくなりますが、Aレコードがないのがおそらく異常なので、この設定を常用する必要はありません。

macOS CatalinaのSafariHTTPS RRに対応していないのでアクセスができません。

f:id:kazeburo:20211207113107p:plain

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

f:id:kazeburo:20211207113349p:plain

Chrome(96.0.4664.93)は対応していないのかDoHを有効にしてもアクセスできませんでした。

まとめ

ということで、HTTPSリソースレコードを使って、実験をしてみました。現状メリットが大きいものではないですが、今後使われるようになっていくのでしょう。お試しあれ~