DNSのワイルドカードレコードとは、個別に設定していないサブドメインに対して、共通の応答を返すための仕組みです。
たとえば、次のような設定があります。
*.example.com. IN A 203.0.113.10
この場合、foo.example.com や shop.example.com など、個別にレコードを作っていない名前に対して、203.0.113.10 を返せるようになります。
ただし、DNSのワイルドカードは、ファイル名の * や正規表現のような単純なパターン一致ではありません。
「その名前がDNS上で存在するかどうか」 をもとに動くため、見た目よりもルールは厳密です。
DNSのワイルドカードを理解するときは、次の4点が特に重要です。
*.example.com は example.com 自体には適用されないつまり、ワイルドカードは「すべてに無条件で一致する便利記号」ではなく、未定義名に対するデフォルト応答」として理解するのが正確です。
次のようなゾーン設定を考えます。
example.com. IN A 203.0.113.1
*.example.com. IN A 203.0.113.10
www.example.com. IN A 203.0.113.20
このときの挙動は次のようになります。
example.com → 203.0.113.1www.example.com → 203.0.113.20abc.example.com → 203.0.113.10shop.example.com → 203.0.113.10ここで重要なのは、www.example.com にはワイルドカードが使われないことです。
すでに www.example.com が個別に定義されているため、そちらが優先されます。
*.example.com は example.com には効かないこれは非常によくある誤解です。
*.example.com. IN A 203.0.113.10
この設定だけでは、foo.example.com には効いても、example.com 自体には効きません。
そのため、ルートドメインにも同じIPを向けたい場合は、別途次のような設定が必要です。
example.com. IN A 203.0.113.10
*.example.com. IN A 203.0.113.10
つまり、example.com と *.example.com は別物として考える必要があります。
ワイルドカードは、存在しない名前に対するデフォルト応答です。
たとえば次の設定を見てください。
*.example.com. IN A 203.0.113.10
mail.example.com. IN A 203.0.113.30
この場合、
mail.example.com は個別設定があるため 203.0.113.30test.example.com は未定義なので 203.0.113.10となります。
つまり、ワイルドカードは「個別設定がないときだけ使われる」ということです。
ここは特に誤解が起きやすいポイントです。
たとえば次のような設定があったとします。
*.example.com. IN A 203.0.113.10
app.example.com. IN MX 10 mail.example.com.
このとき、app.example.com という名前自体はすでに存在しています。
では app.example.com A を問い合わせたとき、ワイルドカードの A が使われるのかというと、通常はそう考えません。
理由は、ワイルドカードが働く前提が「その名前が未定義であること」だからです。
つまりこのケースでは、
app.example.com というノードは存在しているA レコードがなければ、A はないものとして扱われるという理解が正確です。
ワイルドカードは、足りないレコード型を補完する仕組みではありません。
これもよく誤解される点です。
*.example.com は、見た目だけで判断すると「foo.example.com のような1階層下だけに効く」ように見えるかもしれません。
しかし実際には、そう単純ではありません。
*.example.com は1階層限定とは言い切れないa.b.example.com のような深い名前にも関係するb.example.com のような途中ノードが存在すると、その枝ではワイルドカードは止まるつまり、
です。
実務では、「途中に存在する名前や委任があるかどうかで挙動が決まる」と理解しておくのが安全です。
次のような設定を見てみます。
*.example.com. IN A 203.0.113.10
sub.example.com. IN NS ns1.subdns.example.net.
この場合、x.sub.example.com の問い合わせは、example.com 側のワイルドカードでは処理されません。
sub.example.com は別のDNSへ委任されているため、その配下は委任先のゾーンが担当します。
つまり、ワイルドカードは委任の境界を越えて適用されません。
ワイルドカードで CNAME を使うこともあります。
*.example.com. IN CNAME app.example.net.
これは、未定義サブドメインをすべて app.example.net に向けたいときの書き方です。
たとえば、
foo.example.comshop.example.comabc.example.comなどを、まとめて別のホスト名へ寄せることができます。
ただし、CNAME を使う場合は次の点に注意が必要です。
CNAME と他の通常レコードを共存させないCNAME を置けないALIAS や ANAME など独自機能を使うことがあるワイルドカードはAレコード専用ではありません。
実際には、次のような型でも考え方自体は同じです。
ただし、使えることと、使うべきことは別です。
Webサーバーやロードバランサへまとめて向ける用途でよく使われます。
未定義のサブドメインを、1つのホスト名に集約したいときに便利です。
技術的に設定できても、意図しないサブドメイン宛メールまで受けてしまう可能性があるため、慎重な運用が必要です。
検証用途などで使われることはありますが、設計意図を明確にして使うべきです。
かなり特殊で、一般的な通常用途として安易に考えないほうが安全です。
この2つは混同されがちですが、まったく別です。
*.example.com. IN A 203.0.113.10
これはDNSの名前解決の設定です。
*.example.com 用のTLS証明書です。
これはHTTPS通信のための証明書です。
つまり、
ということです。
実務では、DNS設定と証明書設定をセットで考える必要があります。
*.example.com. IN A 203.0.113.10
これにより、個別登録していないサブドメインも同じIPへ集約できます。
たとえば、
client-a.example.comclient-b.example.comcampaign-001.example.comのように、利用者や案件ごとにサブドメインを動的に作るケースです。
DNSではワイルドカードでまとめ、実際の出し分けはアプリケーション側で行います。
柔軟な運用ができる反面、想定外のホスト名まで応答してしまうので注意が必要です。
ワイルドカードDNSは便利ですが、DNSだけ設定して終わりではありません。
ワイルドカードを入れると、ランダムなサブドメインでもサーバーまで到達する可能性があります。
そのため、Webサーバーやアプリ側では
といった制御が重要です。
*.example.com を設定すれば example.com にも効く効きません。
別途設定が必要です。
補いません。
名前が存在している時点で別扱いです。
*.example.com は1階層下だけにしか効かないそう言い切るのは不正確です。
*.example.com はどんな深い名前にも全部効くこれも不正確です。
途中に存在する名前や委任があれば止まります。
証明書は別問題です。
DNSのワイルドカードレコードは、未定義の名前に対してデフォルトの応答を返すための仕組みです。
ただし、理解するときは次の点が重要です。
*.example.com は example.com 自体には効かない以上、DNSのワイルドカードレコードについてでした。
最後までお読みいただき、ありがとうございました。