かなりハマったので自分に対する備忘録も兼ねて記しておきます。
ハマったこと
Raspberry PiをWi-Fiのアクセスポイント兼DHCPサーバーにする方法について、かなり昔に解説しました。
数千円で手軽なフルコントロールできるアクセスポイントが作れるのは非常に便利です。
今回は業務で使用するアクセスポイントを作る必要があり、その要件の一つに「クライアントが使用するDNSサーバーを設定できるようにする」という条件がありました。
つまり、Raspberry Piからのアクセスではなく、実際にRaspberry PiをAPとして使用するデバイス(スマホなど)の使用するDNSサーバーです。
なんでこんなにまどろっこしく書いているかというと、かなりハマったからです。
- Raspberry PiのDNSサーバーは固定できた
→これは簡単。/etc/resolv.confなどなど - なぜかRaspberry PiをAPとして使用するデバイス(以下、クライアント)のDNSサーバーの固定ができない
当初は「Raspberry Piの/etc/resolv.confを修正したら、クライアントの通信もresolv.confに指定したDNSサーバーが使われるだろ!」と安直に考えていたのですが・・・なぜか安定しない。
安定しないってのは「resolv.confに書いているDNSと、キャリア(上位)からDHCPで取得されたDNSサーバーで使用が行ったり来たりするのです。はじめはそんな挙動をしているとは夢にも思わず、定期的にアクセス先のDNSを確認するスクリプトを走らせて初めて気づきました。
上記の通り私はdnsmasqを使用しており、ネットの殆どの記述では「仮に自分が名前解決できないドメインに対するクエリを受け取った場合は、デフォルトでは/etc/resolv.confを参照する」との記載でした。実際にtcpdumpで上流と下流のパケットキャプチャもしたのですが、やはりバウンスする。。
解決策
dnsmasqのドキュメントに沿って、明示的にDHCPオプションでDNS情報を流すことができることを確認。
dhcp-option=option:dns-server,8.8.8.8
上記を/etc/dnsmasq.confに追記するだけです。8.8.8.8はお好みのDNSサーバーを指定する。
確認方法
最も確実なのは(クライアント側でDNS設定を上書きしていない前提)、Raspberry PiのAP側(Wi-Fi側)でのパケットキャプチャです。仮に上記の設定をしていない場合は、受信したDNSクエリは自分のIP宛になっているはずです。つまり、クライアントのDHCP設定でDNSサーバーが自分宛てになっています。
一方、上記の設定を行うと、DNSクエリの宛先はRaspberry Pi自分自身ではなく上記の設定したIPになっているはず(上記例では8.8.8.8)。Raspberry Piは通常のパケットと同様にルーティングだけです。
こんなマニアックな設定は普通はしないと思いますが、もしトラブったら一度試してみてください。
コメント