Cosnomi

プログラミングをする医学生。物を作ること、自動化すること、今まで知らなかったことを知ることが好き。TypeScript書いたり、Pythonで機械学習したりなど。

Twitter / GitHub / Keybase
TOP >

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外で使われるはずなので、8.8.8.8などで大丈夫です。

Windows マシンから試してみる

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

nslookup blog.cosnomi.com 192.168.1.15

この結果で正しくローカルIPに解決されていることが確認できるはずです。

Android スマホでの設定

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

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

まとめ

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


最後まで読んでいただきありがとうございます。コメントフォームは設置していません。訂正・意見・感想などはTwitter(@cosnomi)などへお願いします。
記事一覧へ