こんにちは、ミツカリCTOの塚本こと、つかびー(@tsukaby0) です。
前回の記事では弊社のインターンの井上さんがDNSの歴史について解説してくれました。
今回はDNSサーバーにフォーカスを当てて説明をしてみたいと思います。DNSサーバーと一言で言ってもフルリゾルバや権威サーバーがあったり、それ以外にもいくつか種類があったりします。書籍等で関係性や問い合わせが図示されていたりしますが、具体的にイメージするのは少し難しいです。そのあたりを詳しく説明してみます。
概要
- 大抵の家庭ではフルリゾルバはISPのDNSサーバーという理解で良いが、詳細は調べようがない
- フルリゾルバの前にフォワーダーがあるケースもある
- エンタープライズでは自社でDNSサーバーを持つことがある
DNSの基礎知識
DNSの基礎は私が書くよりも先人が多く記事を残しているため、そちらをご覧ください。
書籍だと、 DNSがよくわかる教科書 が評判のようです。これの第二版が出るようなので、こちらを買ってみるのも良いと思います。
https://www.sbcr.jp/product/4815622657/
よくある図と疑問
インターネット上の様々な記事でDNSが図解されています。例えば以下はJPNICの例です。

引用元: インターネット10分講座 DNS - JPNIC https://www.nic.ad.jp/ja/newsletter/No22/080.html
この図を見ると確かに概要は理解できますが、「問い合わせを行うためのサーバー」とは何だ?という疑問が湧きます。もちろんこれは概要なので、この図はこれで良いのですが、少し踏み込んだ図ではフルリゾルバという説明が出てきます。しかしまた疑問が湧きます。フルリゾルバの実態とは何なのでしょうか?
その辺りを踏み込んで解説している資料が見つからなかったので、自分で調査、解説しようと思います。
フルリゾルバはISPのDNSサーバー
フルリゾルバとは大抵の家庭においてはISPが提供しているDNSサーバーを指します。ただし、詳細についてはプロバイダ側の社外秘情報に該当すると予想されるため、Web上には情報がありません。
これだけだとつまらないので、もう少し詳細に解説します。
ルーターとプロバイダの認証、IPとDNS配布
まず、一般家庭では、何らかのプロバイダと契約してインターネット回線を利用できるようにすると思います。プロバイダから認証情報を受け取り、ルーターに設定します。この時ルーター内部では認証情報を使って認証し、プロバイダから接続情報を受け取ります。この接続情報にはグローバルIPアドレスやDNSサーバーのアドレスが含まれます。以下は実際に私のルーターに設定されている例です。

(※ちなみに私の場合はSo-net + フレッツ光でv6プラスのサービスを利用しています)
認証時のプロトコルはPPPoEだったりIPv4 over IPv6 (MAP-EまたはDS-Lite)だったりするのですが、DNSから逸れるので割愛します。詳細は各種プロバイダが解説しているため、そちらをご覧ください。
【初心者でも分かる】PPPoE方式とIPoE方式の違いとメリット|ICT Digital Column 【公式】NTTPCコミュニケーションズ
認証が終わった後はルーターにグローバルIPやDNSのアドレスが配られます。これはPPPoEの場合、IPCPで、IPv4 over IPv6の場合、SLAACやDHCPv6という仕組みで配られます。この辺りも詳細は割愛します。以下の記事などをご覧ください。
SLAACとは? IPv6アドレスを設定する仕組みやDHCPv6についても解説
とにかくこのような仕組みでDNSがルーターに設定されます。これによって自分のPCから行われるDNSクエリが成功するようになります。
ルーターとPC間の通信
先程軽く触れましたが、昨今ではプロバイダから家庭のルーターまでIPが配られる時に必ずしもDHCPが使われるとは限りません。しかし、ルーターからPCへIPが配られる場合はDHCPが主流だと思われます。とにかくPCからWifi、LANケーブル等を経由してルーターまで接続するとDHCPなどによって自動でIPなどが配られます。配られた情報は実際に確認することができます。
> scutil --dns DNS configuration resolver #1 search domain[0] : flets-east.jp search domain[1] : iptvf.jp nameserver[0] : 240b:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx nameserver[1] : 192.168.10.1 if_index : 11 (en0) flags : Request A records, Request AAAA records reach : 0x00020002 (Reachable,Directly Reachable Address) (後略)
nameserverという部分にIPv6とIPv4のアドレスが設定されていますが、これはルーターのアドレスです。つまりDNS問い合わせはまずこれらのサーバー(ルーター)に対して行われます。
ルーターはDNSフォワーダーの可能性が高い
ここまでの話を簡単にまとめると、PCのnameserver(DNS)はルーター、ルーターに設定されているDNSはプロバイダから提供されたアドレス、ということになります。
何が言いたいかというと、よくある図ではフルリゾルバは1つだけ表示されていますが、これは半分正解であり実態は異なるということです。

引用元: JPRS用語辞典|再帰的問い合わせ(recursive query) https://jprs.jp/glossary/index.php?ID=0173
実際にはPC(DNSクライアント)とフルリゾルバの間に別種のDNSサーバーが挟まっていることがあります。それらは
- DNSキャッシュサーバー
- DNSフォワーダー
などと言われることがあります。キャッシュサーバーはフルリゾルバが担っていることもありますし、おそらくはそのケースが多いでしょう。フォワーダーは単にDNSクエリを転送するだけのものです。(また、挟まっているDNSサーバーは1つとは限りません。)
私はAtermというNEC製のルーターを利用していますが、どうやらこれに備わっているDNS機能はフルリゾルバやキャッシュサーバーではなく、フォワーダーのようです。
DNSフォワーディング機能とは、本商品に接続されている各パソコンなどからDNSの問い合わせパケットを受け取ると、インターネット上のDNSサーバにフォワーディングして問い合わせ、問い合わせたIPアドレスを各パソコンに回答する機能です。本商品に接続されたパソコンなどからは、本商品がDNSサーバとして動作しているように見えます。
引用元: https://www.aterm.jp/function/wg2600hs2/guide/dns_proxy.html
人によって環境は異なりますが、私の場合はルーターは単なるフォワーダーでフルリゾルバはISPが提供しているもの、と言えそうです。
プロバイダではなく光回線サービス事業者がDNSサーバーを提供する
先程も少し書きましたが、私はSo-netというプロバイダとNTT東日本のフレッツ光を利用しています。基本的にNTT側は回線の提供でサービスの提供はプロバイダ、という認識でした。そのため、So-netのDNSを利用しているのだと思っていましたが、どうやらフレッツ、あるいはIPv6環境においては少し事象が異なるようです。
先程のスクリーンショットの通りルーターに設定されたDNSは 2404:1a8:7f01:a::3 でした。このアドレスでネット検索するとNTT東日本のDNSという情報が出てきます。ただし、公式情報なのかどうか少し怪しいところはあります。
フルリゾルバは変えられる
大抵の場合は、ルーターによって自動でPCが利用するDNSが設定されますし、プロバイダがDNS(フルリゾルバ)を提供してくれるため、我々ネット回線ユーザーは特にDNSを意識する必要はありません。しかし、やろうと思えば意図的に利用するDNSを変更できます。
よくある有名な方法としては、GoogleのPublic DNSを利用する方法です。
これについては解説している記事は多いので詳細は割愛します。自身のPCのDNS設定を 8.8.8.8 などに変えるだけです。
他にも自前でDNSサーバーを建てるという方法もあります。例えばDNSで有名なBindというソフトウェアがありますが、これを使って自分でDNSサーバーを建てることができます。
詳細なやり方については割愛します。以下の記事などが参考になります。
フルリゾルバとDNSキャッシュサーバーはほぼ同じ意味
おそらくDNSについて学習しているとフルリゾルバと言ったりDNSキャッシュサーバーと言ったりする資料が出てきますが、これら2つはほぼ同じ意味と捉えても良いかもしれません。ただし、違いについては理解しておくと良いかもしれません。
例えば先ほどBindを例に出しましたが、Bindは設定ファイルに応じて
- 権威サーバーとして振る舞うのか
- フルリゾルバ(自分で名前解決する)として振る舞うのか
- DNSキャッシュサーバー(自分で解決せずにフォワード)として振る舞うのか
- DNSフォワーダー(キャッシュもしない)として振る舞うのか
を切り替えることができます。
より詳細には、以下のような設定オプションが存在しますので、これらを組み合わせることで実現します。
recursionは再帰的問い合わせをするかどうかなので、これによって権威サーバーかその他かが決まります。
forwardはフォワードするかどうか、forwardersは実際にフォワードする先です。
max-cache-ttlという設定もあり、これによってキャッシュを実質しない設定も可能なようです。max-cache-sizeという設定もあるようですが、0に設定すると無制限にキャッシュするという設定になるようなので、こちらは使えなさそうです。
recursionが有効になっており、フルリゾルバとして動くが、自分が解決できないクエリは他のDNSにフォワードするという設定もできるので、フルリゾルバだしキャッシュサーバーだし、フォワーダーでもある、というケースもありそうです。
エンタープライズの場合、社内でDNSサーバーを持つ
ここまでは一般的な家庭や小規模のオフィスを想定した話をしましたが、大企業では話は少し変わってきます。
理由は単純で様々なセキュリティ等の要件から自前でDNSサーバーを持つことが多いからです。つまりISPから提供されたDNSを利用しないケースがありえます。
製品としては例えばInfobloxがあります。公式サイトよりは以下の公式note記事の方が分かりやすいかもしれません。
エンタープライズの場合、様々なセキュリティリスクやコンプライアンス要件を満たすために細かくネットワークを設計する必要があります。上記noteの引用ですが、以下のようなベストプラクティスのシステムアーキテクチャ図は参考になり、面白いですね。気になる方はぜひ記事内の解説をご覧ください。

引用元: Infobloxが考えるあるべきDNSサーバーの構成図 - InfobloxがDNSサーバーとして選ばれる5つの理由 https://note.com/infoblox/n/n7a44183dc9a4
終わり
今回はDNSサーバー、特にフルリゾルバについて調査、解説してみました。私自身はインフラよりはアプリケーション側のITエンジニアですので、間違っている部分もあるかと思います。気づいた方はコメントやX(Twitter)で教えてください!フォローもお待ちしております。
現在、ミツカリではITエンジニアを募集しています。興味のある方はぜひお気軽にご連絡ください!