Chapter 07

構築手順の解説(ネットワーク編:アプリケーション層)

yutafujii
yutafujii
2021.07.03に更新

本書のWiFi構築手順で関連のあるアプリケーション層のプロトコルはDNSです.この章ではDNSについて少し触れたいと思います.

DNS

DNS(Domain Name System)とはドメインネームからIPアドレスを変換するもので,53番ポートを利用して変換が行われます.初期ARPANET[1]ではドメインネーム(ホスト名)とIPアドレスを1箇所で一括管理していたようですが,ネットワークがスケールするに従い,一括管理が難しくなり,DNSという仕組みが考案されたようです.

ドメイン名は複数の英数字がピリオド区切りで並んだもので(例えばwww.netflix.com),全体としては木構造になっています.後ろの文字列ほどルート(根)に近いドメインです.

DNSによる変換を行う際,問い合わせを行うホストをリゾルバと言い,ドメインとIPアドレスのマッピングデータを管理するサーバーをネームサーバーと言います.DNSの仕組み上リゾルバは最低でも一つのネームサーバーのIPアドレスを知っておく必要があるということになります.通常リゾルバはウェブアクセスするクライアント端末ということになります.

今回のWiFiホスティングで必要だったことは以下の2点です:

  1. WiFiをホスティングしたネットワークインターフェイス53番ポートにDNSサーバーを起動しておくこと
  2. DNSサーバーに最低1つのネームサーバーIPを指定しておくこと

今回の構築では結論どちらもdnsmasqの設定と起動によって行なっています.もしdnsmasqが起動していなかった場合,Raspberry Piにおけるパケットの流れは以下のようになります.

wlan0(WiFiをホスティングしているTP-Linkのインターフェイス)

クライアント(192.168.1.3)からDNSの名前解決依頼が来ているが,53番ポートが開いていないのでICMPタイプ3(到達不能メッセージ)が返っている.

wlan1(インターネットと繋がっているインターフェイス)

wlan0からネームサーバーへのリクエストがあれば,wlan1を通過するはずだが,パケットが流れてこない

dnsmasqをwlan0インターフェイスで起動し,ネームサーバーIPを8.8.8.8に設定したことでクライアントはDNSの応答を得ることができるようになります.

wlan0からネームサーバー 8.8.8.8 へのリクエストをカーネルの経路制御テーブルに従って,wlan1へルーティングしている様子が見える.

DNSに関しての最終的な構成は以下のようになります.

Google Public DNS

ところで今回設定した 8.8.8.8 というネームサーバーはGoogleのPublic DNSと呼ばれるものです.

Public DNSはウェブサイトのパフォーマンス向上のために開発されたDNSサーバーであり,実態としてはリゾルバです(つまり,このサーバーではドメインとIPアドレスのマッピング管理はしていない).

このリゾルバは,ロードバランシングとキャッシュ活用により全体としてのレイテンシを下げることができています.すなわち,ロードバランシングによりサーバー負荷耐性を向上しつつ,この場合にキャッシュが各サーバーごとにしか残らない問題を(1)第一陣のサーバーで頻繁に問い合わせがくるドメインは共通のキャッシュを用意(2)その他のドメインはドメイン名でパーティションし,第二陣のサーバーでキャッシュ確認する,という方法で上手に回避しているようです.

To boost the hit rate for cacheable names, it's important to load-balance servers so that the cache is not fragmented. In Google Public DNS, we have two levels of caching. In one pool of machines, very close to the user, a small per-machine cache contains the most popular names. If a query cannot be satisfied from this cache, it is sent to another pool of machines that partition the cache by names. For this second level cache, all queries for the same name are sent to the same machine, where the name is either cached or it isn't.

出所)https://developers.google.com/speed/public-dns/docs/performance

もちろん,今回使ったdnsmasqの設定(dnsmasq.conf)においてDNSネームサーバーにルートネームサーバーIPを指定することも可能です.ルートネームサーバーのIPアドレスは以下のリンクから確認できます.

https://www.internic.net/zones/named.root

実際にdnsmasqの設定でネームサーバーを8.8.8.8から192.112.36.4に変更して再起動(systemctl restart dnsmasq)した場合,このIPアドレスにDNS問い合わせが飛んでいることが確認できます.

Google Public DNSと比較して速いか遅いかというのは正直わかりませんでしたが,今回はGoogleの利点を活かした設定を採用しました.

コマンド用途一覧

最後に本章で使用したネットワークに関するLinuxコマンドと捕捉コマンドの使用例を記載しておきます.

dig

DNS lookup utility

# netflix.comを問い合わせ
$ dig netflix.com

# name server 8.8.8.8にドメインnetflix.comを問い合わせ
$ dig netflix.com @8.8.8.8
脚注
  1. https://en.wikipedia.org/wiki/ARPANET#:~:text=The Advanced Research Projects Agency,the TCP%2FIP protocol suite.&text=The ARPANET was established by,United States Department of Defense. ↩︎