プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

DNS のワイルドカードレコードについて

先日、DNSのワイルドカードレコードを設定しているネームサーバーで、 TXT レコードを追加したら、一部のサブドメインでアクセスできないという事態になりました。

これ、調べてみると、 DNS のワイルドカードレコードを使っている時に起こるもののようです。

blog.future.ad.jp

知りませんでした・・・。ということで、知識としては上記の記事で事足りるのですが、改めて自分でも手を動かしていろいろと確認したので、それらをメモっておきます。

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 は問題なくひけます。

まとめ

最初に書いた現象を再現することができました。ワイルドカードレコード、便利だなと思っていたんですが、ちょっと気を付けないとはまるかもしれませんね。