DNSの参照先設定の誤り

2021年2月2日

DNSサーバの参照先を全然異なるサーバで複数設定しちゃっておかしなことになっている問題、なんだかんだこのトラブルに複数回出会っている気がするので、備忘録もかねて書いておこうと思う。

問題点

大体のDNSサーバの参照先を設定できるクライアントに、よくわかっていない人は全然異なるサーバを設定してしまったりすることがまれにある。

例えばプライマリに外部のDNSサーバ、セカンダリにLAN内のDNSサーバを設定して、「プライマリに最初に名前解決を問い合わせて、見つからなかったらセカンダリに名前解決を問い合わせる」ような動きを期待する設定。

この設定方法は誤りだ。プライマリで名前解決ができない(該当するレコードが存在しないと返却された)場合、クライアントはその時点で諦めてセカンダリに問い合わせしに行くことはない。

ただし、プライマリから応答自体がないような場合にはセカンダリに問い合わせに行く。上記の誤り設定はこちらの挙動を期待してしまっているような設定になってしまっているのだ。

解説

プライマリのDNSサーバと、セカンダリのDNSサーバは上記のような参照のされ方をする関係上、ゾーン転送によって同一のレコードを保持している必要がある。これはあくまで冗長化構成のためであって、複数の異なるDNSサーバを参照させるような思想ではないのだ。

個人的には名前があまりよくないな、と何度も思っている。マスタDNSサーバとスレーブDNSサーバ、みたいな名称の方が勘違いが減るように思っている。

どう構成させるの?

LAN内のホスト名などを管理しているDNSサーバがいたとして、外部のグローバルIPなどへの名前解決も行いたい場合、LAN内にDNSコンテンツ サーバ兼DNSキャッシュサーバとなるDNSサーバ(以下、LAN内DNSサーバ)を構築し、LAN内のクライアントはすべてそのLAN内DNSサーバを参照するように設定する。冗長化したければそのLAN内DNSサーバを冗長化しゾーン転送の設定を入れた上で、各クライアントのプライマリDNSとセカンダリDNSにその冗長化したLAN内DNSサーバを設定すれば良い。

以下は簡単な構成例。

DNS構成例 その1

ただ、これだけでは外部のFQDNを名前解決したいときにできないため、LAN内DNSサーバは外部のDNSのキャッシュサーバとしても機能してもらいたい。

以下は簡単な構成例。


DNS構成例 その2

まぁ、でもちょっといびつな図だよね。なんかLANとインターネットが直結しているし。ということでDMZを間にはさんで、DMZ内にプロキシ的な役割を持つDNSキャッシュサーバを設置しよう。

以下は簡単な構成例。


DNS構成例 その3

なお、ここでDMZ内キャッシュサーバはDNSサーバの機能として外部DNSサーバへ転送を行うけど、自身がクライアントとして設定するDNSの参照先はLAN内DNSサーバにする必要があるので注意だ。

以下は説明の図。


DNS構成例 その4

何気にハマりやすそうなこの設定誤り、自分も今後同じようなことをしないようにこの記事を備忘録としておいておく。