自宅サーバを外部に公開している。外出先からはDDNSのドメイン名でアクセスできている。
しかし、そのドメイン名に家庭内からアクセスしようとすると名前解決できずエラーになってしまう。
家庭内のローカルIPアドレスで指定すれば正常にアクセスできる(当たり前)が
同じコンテンツなのに、家庭内と外出先とでアクセスするアドレスが違うのが不便すぎる。いちいちアドレスを打ち変えたくない。
自宅サーバを公開している人はみんなぶつかる悩みのはずなんだけど、あまり記事がない。見つけてもこれくらい。dnsmasqという(bindよりは気楽に扱えそうな)DNSソフトウェアがあるらしいが、記事は fedora 用だ。
RaspberrPi だとこの記事が良さそう。
DNSサーバにする RaspberryPi 3 はこれ。有線LANも無線LANも両方有効にしてある。
記事どおり進めるが、その前に update しとく(これやらないとインストール失敗することあり)。
$ sudo -s
# sudo apt-get update
まずは resolvconf のインストール。
# sudo apt-get -y install resolvconf
リゾルバ設定を入れるが、/etc/resolv.conf じゃなくて /etc/network/interfaces を編集すればいいみたい。
# sudo vim /etc/network/interfaces
dns-nameservers の行の記述を変える。
変更前はこう。
変更後はこうした。
末尾が1(192.168.3.1) はドコモ光のルーター。DNS機能を持っている。
反映するためサービス再起度。
# sudo service networking restart
次は dnsmasq のインストール。
$ sudo apt-get -y install dnsmasq
無事インストールされたようだ。
/etc/dnsmasq.conf を書いて設定を入れる。
書き間違ったときに備えて、オリジナルファイルを(ファイル名末尾に.orgをつけて)保存してから編集することにする。
# ls -shal /etc/ | grep dnsmasq
# cp /etc/dnsmasq.conf /etc/dnsmasq.conf.org
# vim /etc/dnsmasq.conf
記事の指定どおり
19行目、21行目、74行目、135行目、144行目(計5箇所)
の行頭シャープ#を消し(設定が有効になる)して保存する。
さらに74行目と144行目は自分の設定に書き換える。
書き換わった行だけ確認。
$ cat /etc/dnsmasq.conf | grep -v "^#" | grep -v "^$"
ちゃんと5行だけ書き換わってるのが分かる。
/etc/hosts も書き換えないといけないらしい。
編集前に、自分自身(DNSサーバになるRaspberryPi3)のホスト名(コンピュータ名)とIPアドレスを確認しておく。
# hostname
ホスト名が pi3 で、IPアドレスが 192.168.3.141 と 192.168.3.41 の2つあると分かる。
もう1台、DNSクライアントにする RaspberryPi ZERO W のホスト名とIPアドレスも確認しておく。
$ hostname
$ ifconfig | grep 192
ホスト名が pi0w で、IPアドレスが 192.168.3.81 と分かる。
DNSサーバに戻って /etc/hosts を編集する。
# vim /etc/hosts
# ip addr | grep inet | fgrep -v "127.0.0.1"
inet6(以前試したIPv6の設定)が残っているが気にしない。なぜか 192.168.3.170 も設定されているが気にしないで進める。
# cat /etc/hosts | fgrep "192.168.3.41"
# cat /etc/network/interfaces | grep "dns-nameservers"
# sudo service dnsmasq start
# sudo netstat -anp | fgrep ":53" | grep "dnsmasq"
DNSクライアント(RaspberryPi ZERO W)の /etc/network/interfaces を編集する。念のためバックアップを取ってから進める。
$ sudo cp /etc/network/interfaces /etc/network/interfaces_20181103
$ sudo vim /etc/network/interfaces
変更前はこう。
変更後はこうした。
反映するためサービス再起度。
# sudo service networking restart
記事の構成と確認を参考に、DNSの動作確認を行う。
nslookup を使いたいので dnsutils をインストールする。
$ nslookup pi3
$ sudo apt-get -y install dnsutils
$ nslookup pi3
あれ?うまくいかない。/etc/resolv.confが効いていない?
$ cat /etc/resolv.conf
/etc/network/interfaces に記載した内容は /etc/reslov.conf に反映されるはずなんだけど。反映されてない。
調べる。
DNSクライアント側に resolvconf をインストールしてなかった。これが原因か?
$ sudo apt-get -y install resolvconf
インストール完了。
サービス再起動してresolv.confに反映されているか見てみるが
やはり反映されていない。
このへんの情報を頼りに解決を探る。
DNSサーバにて。
# cat /etc/resolv.conf
# dig +noall +ans +stats google.com
# ip route
# ping 8.8.8.8
# traeceroute -n 8.8.8.8
DNSクライアントにて。
$ sudo -s
# cat /etc/resolv.conf
# dig +noall +ans +stats google.com
# ip route
# ping 8.8.8.8
# traeceroute -n 8.8.8.8
分からん。とりあえず DNSクライアントを再起動してみるか。
# sudo reboot
再起動後のDNSクライアントにて
$ sudo -s
# cat /etc/resolv.conf
# nslookup pi3(DNSサーバ名)
# nslookup pi3.*********.jp(DNSサーバのドメイン名FQDN)
# nslookup 192.168.3.41(DNSサーバのIPアドレス)
# dig +short pi3
# dig +short pi3.*********.jp
# dig +short -x 192.168.3.41
DNSクライアントでは
① /etc/network/interfaces の値が /etc/resolv.conf に転記はされるようになったけど
② ドメイン名での解決が全然できてない。なぜだ。
分からんのでDNSサーバも再起動してみる。
再起動後のDNSサーバにて
$ sudo -s
# cat /etc/resolv.conf
# nslookup pi3(DNSサーバ名)
# nslookup pi3.*********.jp(DNSサーバのドメイン名FQDN)
# nslookup 192.168.3.41(DNSサーバのIPアドレス)
# dig +short pi3
# dig +short pi3.*********.jp
# dig +short -x 192.168.3.41
DNSサーバでは
③ /etc/network/interfaces の値が /etc/resolv.conf に転記がされない
④ ドメイン名での解決はできた。
DNSクライアントの①② と DNSサーバの③④ とで現象が逆だ。どうも歯がゆい。
たぶんだけど ③を解決すればうまくいく気がする。