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サーバーを構築できました。