先日、DNSのワイルドカードレコードを設定しているネームサーバーで、 TXT レコードを追加したら、一部のサブドメインでアクセスできないという事態になりました。
これ、調べてみると、 DNS のワイルドカードレコードを使っている時に起こるもののようです。
知りませんでした・・・。ということで、知識としては上記の記事で事足りるのですが、改めて自分でも手を動かしていろいろと確認したので、それらをメモっておきます。
DNS のワイルドカードレコードとは
ホスト名のところに、ワイルドカード『*』を使うことによって、いちいちサブドメインを指定しなくても、該当レコードを引くことができる機能とのことです。例えば、
test.mori-soft.com IN A 192.168.0.1 *.test.mori-soft.com IN A 192.168.0.2
のようにしていれば、 sample.test.mori-soft.com も mail.test.mori-soft.com も 192.168.0.2 に解決できるというものです。これは便利ですね。
詳しくは、下記なども参照してください。
ワイルドカードドメインの挙動について #dns - Qiita
どの種類のレコードに使うことができるのかは、ネームサーバーによって微妙に異なっているようです( RFC 見れば仕様としてわかるんでしょうが、ま面倒なので端折ります)。いくつかの会社さんを眺めてみると、たいていは、
- A
- AAAA
- MX
- CNAME
あたりは問題なく使えるっぽいです。ほかの種類のレコードはネームサーバーによってまちまちっぽいです。
例えば、お名前.com ならこちらのページに記載があります。ただ、私も使っているさくらインターネットの場合は、残念ながらワイルドカードレコードについての記述は見つけられませんでした(が、後述するように少なくとも CNAME では使えました)。
実験
ワイルドカードレコードについて勉強するのはこれぐらいにして、早速実験してみます。実験は、自分のドメインの mori-soft.com を使ってやります(さくらインターネットのネームサーバーで管理しています)。
なお、さくらインターネットの場合、ワイルドカードレコードの記述が無かったので最初ワイルドカードレコードが使えるかわかりませんでしたが、下記のページ
ドメインコントロールパネルについて知りたい | さくらのサポート情報
の使える文字のところに、アスタリスクが入っていたので、多分使えるだろうなとアテをつけ、サポートに聞いてみたところ、使えるとのことでした。よかった、よかった。
準備
さくらインターネットの『会員メニュー』から『ドメインコントロールパネル』を開きます。自分のドメイン mori-soft.com のゾーン情報の編集を使って、
- エントリ名: *.test
- タイプ: CNAME
- 値: www.mori-soft.com.
という感じでワイルドカードレコードを追加しておきます。
レコードを保存して、しばらくたってから、ワイルドカードレコードが正しく動いていることを確認します。
mor@DESKTOP-DE7IL4F:~$ dig a.test.mori-soft.com ; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> a.test.mori-soft.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3957 ;; flags: qr rd ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;a.test.mori-soft.com. IN A ;; ANSWER SECTION: a.test.mori-soft.com. 0 IN CNAME www.mori-soft.com. www.mori-soft.com. 0 IN CNAME nervous-morse-2798ce.netlify.com. nervous-morse-2798ce.netlify.com. 0 IN A 52.74.166.77 nervous-morse-2798ce.netlify.com. 0 IN A 46.137.195.11 ;; Query time: 59 msec ;; SERVER: 172.31.224.1#53(172.31.224.1) (UDP) ;; WHEN: Thu May 16 13:25:17 JST 2024 ;; MSG SIZE rcvd: 216 mor@DESKTOP-DE7IL4F:~$
別の b.test.mori-soft.com も試します。
mor@DESKTOP-DE7IL4F:~$ dig b.test.mori-soft.com ; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> b.test.mori-soft.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55787 ;; flags: qr rd ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;b.test.mori-soft.com. IN A ;; ANSWER SECTION: b.test.mori-soft.com. 0 IN CNAME www.mori-soft.com. www.mori-soft.com. 0 IN CNAME nervous-morse-2798ce.netlify.com. nervous-morse-2798ce.netlify.com. 0 IN A 52.74.166.77 nervous-morse-2798ce.netlify.com. 0 IN A 13.251.96.10 ;; Query time: 19 msec ;; SERVER: 172.31.224.1#53(172.31.224.1) (UDP) ;; WHEN: Thu May 16 13:59:55 JST 2024 ;; MSG SIZE rcvd: 216 mor@DESKTOP-DE7IL4F:~$
どちらも、 www.mori-soft.com が CNAME として得られ(さらに、それが CNAME になっていて最終的に、 netlify でホストしてるアドレスになっ)ています。ワイルドカードがちゃんと動作してますね。
TXT レコードの追加
次に、不具合を再現するために、ゾーン情報を編集します。
- エントリ名: default.a.test
- タイプ: TXT
- 値: wildcard test
という感じで、 TXT レコードを追加します。
すると今度は、 a.test.mori-soft.com に対しては
mor@DESKTOP-DE7IL4F:~$ dig a.test.mori-soft.com ; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> a.test.mori-soft.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55223 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;a.test.mori-soft.com. IN A ;; AUTHORITY SECTION: mori-soft.com. 3600 IN SOA master.dns.ne.jp. tech.sakura.ad.jp. 2024051603 3600 900 3600000 3600 ;; Query time: 19 msec ;; SERVER: 172.31.224.1#53(172.31.224.1) (UDP) ;; WHEN: Thu May 16 14:03:08 JST 2024 ;; MSG SIZE rcvd: 116 mor@DESKTOP-DE7IL4F:~$
となり、名前の解決をすることができなくなります(ANSWER セクションが 0 件)。ですが、もちろん、 default.a.test.mori-soft.com の TXT レコードに対しては
mor@DESKTOP-DE7IL4F:~$ dig default.a.test.mori-soft.com txt ; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> default.a.test.mori-soft.com txt ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46278 ;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;default.a.test.mori-soft.com. IN TXT ;; ANSWER SECTION: default.a.test.mori-soft.com. 0 IN TXT "wildcard test" ;; Query time: 59 msec ;; SERVER: 172.31.224.1#53(172.31.224.1) (UDP) ;; WHEN: Thu May 16 14:03:50 JST 2024 ;; MSG SIZE rcvd: 100 mor@DESKTOP-DE7IL4F:~$
のように DNS レコードを引くことができます。
また、 b.test.mori-soft.com に対しては
mor@DESKTOP-DE7IL4F:~$ dig b.test.mori-soft.com ; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> b.test.mori-soft.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38340 ;; flags: qr rd ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;b.test.mori-soft.com. IN A ;; ANSWER SECTION: b.test.mori-soft.com. 0 IN CNAME www.mori-soft.com. www.mori-soft.com. 0 IN CNAME nervous-morse-2798ce.netlify.com. nervous-morse-2798ce.netlify.com. 0 IN A 13.251.96.10 nervous-morse-2798ce.netlify.com. 0 IN A 13.215.144.61 ;; Query time: 19 msec ;; SERVER: 172.31.224.1#53(172.31.224.1) (UDP) ;; WHEN: Thu May 16 14:04:21 JST 2024 ;; MSG SIZE rcvd: 216 mor@DESKTOP-DE7IL4F:~$
のように、変わらずDNSレコードを引くことができます。
理由
ワイルドカードレコードがある場合の名前解決方法ですが、JPNIC のこちらの記事にある
具体的には、問い合わせクラスが一致し、問い合わせドメイン名との完全一致がなく、 問い合わせドメイン名と最も近い一致がワイルドカードである場合、システムは、 ワイルドカードにあるリソースレコードが問い合わせドメイン名であるとみなして、 問い合わせドメイン名と一致するリソースレコードのセットをその場で合成します。
という方法のようです。
なので、*.test.mori-soft.com というワイルドカードレコードに対して、 a.test.mori-soft.com を問い合わせても、 default.a.test.mori-soft.com のレコードが存在するので、ワイルドカードには該当しない、となっているようです。この時の判定では、レコードの種類は問題になっていないのがポイントですね。
解決方法
解決方法は最初に紹介した記事にもあった
- エントリ名: a.test
- タイプ: CNAME
- 値: www.mori-soft.com.
のように、a.test.mori-soft.com の A レコードを追加しておくというものになります。こうすれば、 a.test.mori-soft.com の問い合わせに対しては、完全に一致するこのレコードがあるので、問題なくアドレスが解決できます。
実際、
mor@DESKTOP-DE7IL4F:~$ dig a.test.mori-soft.com ; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> a.test.mori-soft.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16112 ;; flags: qr rd ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;a.test.mori-soft.com. IN A ;; ANSWER SECTION: a.test.mori-soft.com. 0 IN CNAME www.mori-soft.com. www.mori-soft.com. 0 IN CNAME nervous-morse-2798ce.netlify.com. nervous-morse-2798ce.netlify.com. 0 IN A 13.215.144.61 nervous-morse-2798ce.netlify.com. 0 IN A 52.74.166.77 ;; Query time: 79 msec ;; SERVER: 172.31.224.1#53(172.31.224.1) (UDP) ;; WHEN: Thu May 16 15:06:29 JST 2024 ;; MSG SIZE rcvd: 216 mor@DESKTOP-DE7IL4F:~$
のように解決できるようになりました。
なお、この場合、 sub.a.test.mori-soft.com に対してもワイルドカードレコードが適用されないので、DNSで問い合わせしても、
mor@DESKTOP-DE7IL4F:~$ dig sub.a.test.mori-soft.com ; <<>> DiG 9.18.18-0ubuntu0.22.04.2-Ubuntu <<>> sub.a.test.mori-soft.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 503 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;sub.a.test.mori-soft.com. IN A ;; AUTHORITY SECTION: mori-soft.com. 1882 IN SOA master.dns.ne.jp. tech.sakura.ad.jp. 2024051604 3600 900 3600000 3600 ;; Query time: 0 msec ;; SERVER: 172.31.224.1#53(172.31.224.1) (UDP) ;; WHEN: Thu May 16 15:06:58 JST 2024 ;; MSG SIZE rcvd: 120 mor@DESKTOP-DE7IL4F:~$
のように NXDOMAIN が返ってきます(これは、 a.test.mori-soft.com のレコード追加前も後も同じです)。なお、sub.b.test.mori-soft.com は問題なくひけます。
まとめ
最初に書いた現象を再現することができました。ワイルドカードレコード、便利だなと思っていたんですが、ちょっと気を付けないとはまるかもしれませんね。