Cosnomi
Cosnomi

医療×IT / 医学生 / Web(React, Flask) / 機械学習(画像認識, Keras)

Twitter / GitHub / Keybase

dnsmasqを用いてhostsファイルからDNSサーバーを立てる【自宅鯖】

LAN 内にある自宅サーバーにドメイン名を用いてアクセスしたいとき、hostsファイルにドメイン名とIPアドレスの対応を記述するという方法が非常に簡単です。(前回の記事)

しかし、これには欠点があります。

  • LAN 内外を出入りする端末(ノート PC など)はいちいち hosts を切り替えなければならない。
  • (Android)スマホでは/etc/hosts を編集できない(root 権限が必要)

前者は Host Switcher のようなソフトがあるので誤魔化せますが、後者についてはプロキシサーバーを立てるなどの対応が必要で、面倒そうです。そこで、今回は各コンピュータの hosts ファイルに対応を書くのではなく、LAN内にDNS サーバーを立てて、LAN 内の端末が自動的にすべて同じ設定でドメイン名を適切に解決できるようにしてみましょう。

dnsmasq

とはいえ、DNS サーバーの設定は面倒そうです。しかし、dnsmasqというソフトウェアを用いれば、/etc/hosts の内容からDNSサーバーを簡単に建てられます。詳細な設定方法については後でお話するとして、概略だけ説明します。

dnsmasq は DNS サーバーとして振る舞いますが、自身の/etc/hosts にあるアドレス以外は他の DNS サーバーに投げます。これによって、既存のhostsファイル の記述をそのまま用いてDNSサーバーを立てることができるのです。

目的の再確認

今回の目的をより詳細に確認してみましょう。

  • LAN 内にあるサーバーのドメイン名はローカル IP で解決する(/etc/hostsを参照する)
  • ドメイン名ではない名前もローカル IP で解決する(/etc/hostsを参照する)
  • 上の 2 つの条件に当てはまらない名前は他の DNS に投げる(8.8.8.8 など)

dnsmasq のインストール

sudo yum install dnsmasq

dnsmasq の設定

設定ファイルは/etc/dnsmasq.confにあります。

以下、私が行った設定を記述します。

  • port は 53 です。デフォルトの DNS サーバーの port なので、おそらく変更の必要はにないでしょう。
  • domain-nameのコメントを外します。これは、domain のみではなく、ホスト名などのいわゆる plain name に対しても dnsmasq は forward(上位に転送)せず、dnsmasq で処理する(すなわち、/etc/hosts を参照する)ということです。
  • bogus-privのコメントアウトを外します。これは、LAN 内の IP アドレスの逆引きを forward しないということです。
  • local=のところに/etc/hosts で処理したいドメイン名を入力します。

ポート開放

sudo firewall-cmd --add-service=dns --zone=public --permanent

DNSサーバーを起動

sudo systemctl start dnsmasq
sudo systemctl enable dnsmasq

ネットワークアダプタの設定

次にアクセス元のマシンで、ネットワークのアダプタの設定を行います。何がしたいかというと、結局、IPv6 を無効にし、IPv4 の primary DNS に dnsmasq のサーバーを指定するだけです。詳しく説明していきます。

アダプタの一覧が表示されるので、使用しているネットワークアダプタを右クリック>プロパティ

IPv6 のチェックを外し、IPv4 を選択しプロパティの設定をします。

既定では「DNS サーバーのアドレスを自動的に取得する」になっていますが、それを「次の DNS サーバーのアドレスを使う」に変更し、primary は dnsmasq のサーバーのアドレスにします。secondary は LAN 外にいるとき(=primary に接続できないとき)に使われるはずなので、普通に 8.8.8.8 とかやっておけばいいと思います。

Windows マシンから試してみる

私は普段使いはWindowsなのでコマンドプロンプトから試してみます。DNS サーバーの挙動を調べるにはnslookupコマンドを使います。例えば、blog.cosnomi.com を新しく建てた DNS サーバー 192.168.1.15:53 で名前解決するには、

nslookup blog.cosnomi.com 192.168.1.15

とします。(port: 53 はdefaultなので書かなくて大丈夫です)

この結果で正しくローカル IP に解決されていることを確認しましょう。

Android スマホでの設定

Android の場合、設定>Wi-Fi からネットワークを選び、DNS サーバーを先程のアドレスにします。DNS だけ変える上手い方法があるのかもしれませんが、私の場合は DHCP を切って、IP アドレスも手動で設定しました。普通に DHCP の自動割り当ての範囲外にやればいいと思います。

iPhoneもするべきことは同じです。

まとめ

dnsmasqを用いて、hostsファイルの設定内容をそのまま用いてDNSサーバーを構築することができました。


コメントフォームは設置していませんので、ご意見・ご感想などはTwitter(@cosnomi)などへお願いします。