テストサーバ用にDnsmasqで内向きのDNSサーバを構築する

 仕事場には、メインのパソコンを刷新したタイミングで「勉強がてらインストールして遊んでみよう」とUbuntuで構築したLinuxサーバが稼働しています。余りパーツだけで組んだとは思えない何でもござれのいかした奴で、バックアップやメディア配信など様々な用途で活躍しながら、同時にWebまわりのあれこれもインストールされてテストとお勉強用に酷使されています。

 当初はLAN内だけで使用していたマシンですが、活用範囲が広がるにつれ、外からもアクセスしたくなるのは自然な流れというやつです。ただ、「外からはグローバルIPアドレス、内からはプライベートIPアドレスでアクセスする」みたいな使い分けはしたくありません。めんどくさいから。
 そこで、LANの内側からも外側からも同じ名前でアクセスできるように、内向きのDNSサーバをたてました…ので、その作業メモです。

スポンサーリンク

BINDを使うのかと思ったらDnsmasqというのが簡便で良いらしい

 テスト用に使う名前は、ムームードメインで専用のサブドメインを割り当ててあります。

 今後サブドメインを増やすとしてもたかだか数個でしょうから、そんなもののために大げさなソフトは必要ありません。ググってみたら多くのサイトで「簡易サーバに最適」と紹介されていたDnsmasqを今回は使用することにしました。

 とりあえずコマンドを叩いてパッケージをインストール。

$ sudo apt-get install dnsmasq

 続いて /etc/dnsmasq.conf を開いて設定を編集します。すべてコメントアウトされているので、必要な設定箇所を有効にしていきます。

#(ポート番号の設定)
# Listen on this specific port instead of the standard DNS port
# (53). Setting this to zero completely disables DNS function,
# leaving only DHCP and/or TFTP.
port=53

(略)

#(ドメインついてないホスト名だけの問い合わせは上位DNSに流さない)
# Never forward plain names (without a dot or domain part)
domain-needed
#(プライベートIPアドレスの問い合わせは上位DNSに流さない)
# Never forward addresses in the non-routed address spaces.
bogus-priv

(略)

#(DHCPサーバ機能は使わない)
# If you want dnsmasq to provide only DNS service on an interface,
# configure it as shown above, and then use the following line to
# disable DHCP and TFTP on it.
no-dhcp-interface=enp3s0

「とりあえず tsrv.oiio.jp(仮名) が問い合わせされた時にプライベートIP返してくれて、あとは全部上位に確認投げてくれたらいいよ」というレベルで満足なので、よくわかってないままなんとなくの設定になってます。
 保存して、Dnsmasqを再起動…の前に、53番ポートで動いている邪魔なやつ(systemd-resolved)がいるので、そいつを殺します。手順は下記のサイトに書いてました。

 でもこのエントリ書くためにもう1回ググって見直してたら、こんな手順を踏まなくても /etc/systemd/resolved.conf を開いて DNSStubListener=no に設定して systemd-resolved をリスタートさせれば良かっただけみたい。まあいいや。

 邪魔者はいなくなったので、Dnsmasqを起動してやりましょう。

$ sudo systemctl start dnsmasq

/etc/hosts ファイルにアドレスを登録する

 テスト用サーバには tsrv.oiio.jp というサブドメインが割り当てられています。LAN内からこの名前が呼び出された時は、テストサーバのプライベートIPアドレスを返すように hosts ファイルに登録してやります。

127.0.0.1       localhost.localdomain localhost xxxxx
192.168.0.11    tsrv.oiio.jp

 これで、外からアクセスする時のムームーDNSから取得するグローバルIPアドレスと、内からアクセスする時のテストサーバを示すプライベートIPアドレスが、同じ名前でアクセスできるようになった…はず。

resolv.conf に上位DNSサーバを記述する

 DnsmasqではLAN内の既知のアドレスしか変換できないので、他の問い合わせについては上位DNSに投げてもらわないといけません。

 その上位DNSを示すアドレス情報は /etc/resolv.conf ファイルから取得しているみたいなので、そこにプロバイダから指定されたアドレスを記述してやれば良いはずです。
 当該ファイルの nameserver 127.0.0.53 となっている行を 8.8.8.8 に書き換えます。

# Generated by NetworkManager
nameserver 8.8.8.8

 Dnsmasqを再起動します。

$ sudo systemctl restart dnsmasq

 ここまで済んだらルータの設定画面を開き、DHCPで配布するDNSサーバアドレスをこのLinuxサーバのアドレスに書き換えます。

 これで設定完了です。スマホのWiFiをオンオフ切り替えながら、どちらの場合も同じ名前でアクセスできることを確認します。

サーバを再起動させると、resolv.conf が勝手に書き換えられてしまう

 できたと思ったのも束の間、Linuxサーバを再起動させるとLAN内のパソコンが一切外につながらなくなる症状が発生しました。確認してみると、resolv.conf の中身が元の nameserver 127.0.0.53 に書き戻されています。
「Generated by NetworkManager」ってコメント書いてあったのそういうことかー、手動で書き換えるところじゃないんだなーこれ。

 じゃあどこから情報を引っ張ってきてるんだろうとググってたら /etc/network/interfaces からだという記述を見つけたので、そこにDNSサーバアドレスを入れてみる。

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

dns-nameservers 8.8.8.8

 でも駄目です。相変わらず resolv.conf は nameserver 127.0.0.53 という内容から変化しません。しばらくあれこれ試しましたがググって出てくる情報も不思議と統一感がないし、いじってるうちにどこをいじったかわからなくなるのも怖いので、「どうせ再起動なんて滅多にしないからいいや」と割り切ることにしました。人力で resolv.conf を書き換えてDNSが動くようにして、再起動がかかった時はまた人力対応。いつかわかったらちゃんと対応しようってことにして先送りです。

 …で、それから2カ月くらいして、コンソールに「再起動が必要です」と表示されるようになってしまったので、あらためてもう1回情報をあさってみることにしました。
 その結果出た答えは、「/etc/NetworkManager/NetworkManager.conf を開いて dns をオフに設定すればOKかもしれない」というものでした。

 編集前に一度サーバを再起動させて、あえて resolv.conf が NetworkManager に書き換えられることを確認。その後で上記 conf ファイルを次のように編集します。

[main]
plugins=ifupdown,keyfile
dns=none        ### この行を追加

 そしたら NetworkManager を再起動。

$ sudo systemctl restart NetworkManager

 resolv.conf ファイルを開いてみると、namesever の行が 8.8.8.8 になっていました。やった!

 ひとまず望み通りの動作はしてくれるようになったので一件落着です…と言いたいとこですが、やっぱりなんだか気持ち悪さが残る状態ではあります。多分、下記あたりが無理矢理になっちゃってるんじゃないかと。

なんか引っかかるんだよねリスト
  • 127.0.0.53 というアドレスは、どうもスタブをさしているらしい。
  • 本来はDNSStubListener=noでスタブであるsystemd-resolvedを止めるべきで、そうしなかったからこのアドレスが出てきてたんじゃないか?
  • 上の手順で止めてたら、ここは127.0.0.1になってんじゃなかろうか?
  • NetworkManager の DNS は Dnsmasq が動いてるとあちこちで見かけた。自分がインストールしたDnsmasqとは別のDnsmasqが裏で動いてたんじゃないか?
  • そっちのDnsmasqが読込む設定がどこかにあったんじゃないか?
  • /etc/resolvconf/resolv.conf.d/の下のファイルを読んでくるらしいから、ここにファイルを作って dns-nameservers 8.8.8.8 と記述してやれば良かったんじゃないか?
  • 上位DNSが1個しか指定されてない状態だから、本当は dnsmasq.conf 内の strict-order を有効にして、セカンダリDNSまで指定すべきじゃないか?

 でもまあ動いてるからいいや。

コメント

  1. Johnc357 より:

    Rattling nice pattern and good subject matter, hardly anything else we need D. eeedfgdgggdc

スポンサーリンク