どうも、やまもとやまです。
私たちサーバーエンジニアとは切っても切れない関係のドメインとDNS。
ドメインなんてただの記号だろう、と思われがちですが、結構な罠がひそんでいます。
今回はそんなドメインとDNSの罠、ワイルドカードの事例についてご紹介します。
ワイルドカードは便利だな
DNSのゾーン情報にワイルドカードを設定しておけば、色々なサブドメインが同じサーバーを利用している場合に都度レコードを追加しなくてもアクセスが可能です。
例えば、以下の環境を考えます。
- WebサーバーIPアドレス:198.51.100.20
- 対象ドメイン:example.co.jp
またゾーン情報が仮に次のようになっていたとします。
※簡単のため、SOAやNS(ついでにTTL)は省略しています
www.example.co.jp. IN CNAME example.co.jp.
mail.example.co.jp. IN A 198.51.100.20
example.co.jp. IN MX 10 mail.example.co.jp.
*.example.co.jp. IN A 198.51.100.20
いたってシンプルですね。
さて、この状態であれば、https://test.example.co.jp/ であろうが、
https://sample.example.co.jp/ であろうが、198.51.100.20に名前解決されますのでアクセスが可能です。
実際にレコードを引いて確認することもできます。
$ dig test.example.co.jp a
;; ANSWER SECTION:
test.example.co.jp. 600 IN A 198.51.100.20
もちろん他のサブドメインでも問題ありません。
べんりー!
ところが罠
ある日、サブドメイン「test.example.co.jp」でSSL証明書を発行しようと思います。
ドメイン認証のSSL証明書発行のため、今回はDNS認証をしましょうか。
というわけで、TXTレコードを設定しました。
※TXTレコードの中身は適当ですが、証明書会社が発行した指定文字列を想定しています
さて、このTXTレコードを追加した瞬間、、、なんということでしょう、、、text.example.co.jpへのWebアクセスができなくなってしまいました。。。
このままではクレーム待ったなしです。どうしよう!
レコードを引いても名前解決できません。
TXTレコードは正常に引けるようです。
$ dig test.example.co.jp txt
;; ANSWER SECTION:
test.example.co.jp. 600 IN TXT "ssl-verificatoin=xxxxxxxxx"
また、他のサブドメインのレコードも引くことができます。
$ dig sample.example.co.jp a
;; ANSWER SECTION:
sample.example.co.jp. 600 IN A 198.51.100.20
こんなときは、あわてずさわがず、test.example.co.jpのAレコードを設定してあげましょう。
これで無事名前解決できるようになります。
$ dig test.example.co.jp a
;; ANSWER SECTION:
test.example.co.jp. 600 IN A 198.51.100.20
ほっと一安心ですね。
なぜこんなことが起きるのか
さてさて、直観的には名前解決できそうに見えるのにできなくなってしまいます、、
なぜでしょうか?
原因ですが、ワイルドカードレコードの仕組みとして、「(問い合わせクラスで)ドメイン名がDNSゾーン内に存在しない(完全一致するドメイン名がない)場合に適用される」ことによります。
つまり、今回の例で言えば、「example.co.jp.」のゾーンの中のクラス「IN」で、
「test.example.co.jp.」のドメイン名が存在する(TXTのみですが存在します)ため、ワイルドカードは適用外となります。
その結果、対応するAレコードがなく、名前解決に失敗するわけです。
ややこしいですね。
原因は分かったけれど
というわけで原因は分かりましたが、ではこれはどうすれば防げるでしょうか。
正直なところ、レコードを追加する前にゾーン情報を確認して、ワイルドカードがあるかどうか(そして影響ありそうか)チェックするくらいしか適当な方法が思い浮かびません。
そんなわけで、ワイルドカードレコードは便利ではありますが、思わぬトラブルにつながりかねないため、個人的にはどうしても必要な場合を除き使わないのがベターではないかと思っています。
それではまた!