Alpine LinuxにDNSを入れて自宅サーバに名前でアクセス
May 17, 2023
linux AlpineLinuxはじめに
自宅LAN内で自宅Webサーバへは、PCにhostsファイルを正しく設定してあれば、PCのブラウザからは、
http://サーバ名/
でアクセスできますが、iPhoneからは
http://ipアドレス/
でなければ、アクセスできません。iPhoneではhostsファイルの設定はできず、名前解決のためだけにproxyサーバを立てるようなことをしないと、名前でアクセスできません。 これでは不便なので、自宅LAN内にDNSサーバを立てて、iPhoneからでも名前でサーバにアクセスできるようにします。
自宅LANのドメイン名を取得していない場合は、「home.arpa」というドメイン名が使用可能です。 自宅LANを外には公開しないでしょうから、「home.arpa」で十分です。万が一間違って「home.arpa」が外に出て行っても大丈夫なようになっています。
通常、DNSサーバは、プロバイダのサーバやgoogleのサーバをを直接参照するか、ルーターを参照すると、ルータがプロバイダのサーバを見に行ってくれるようになっています。ルータで「home.arpa」の時だけ、自宅LAN上に立てたマイDNSサーバを見に行くように設定し、マイDNSサーバで自宅LAN上のサーバの名前を解決すれば、hostsファイルを使わなくても、自宅LAN~外のインターネットで統一的に名前解決できるようになります。
これができれば、PCにhostsファイルを設定しなくても、自宅LAN上のサーバを、
http://サーバ名.home.arpa/
でアクセスできるようになります。
DHCPサーバはルーターで提供されているものを利用する場合が多いのですが、この場合DHCPでipアドレスを割り振られたクラアントPCを名前で参照することはできません。例えば、自宅LANに2台のPC(デバイス名がMyPC1とMyPC2)があったとし、それぞれルーターで提供されているDHCPからipアドレスを割り振られたとします。
このとき、MyPC1からMyPC2へは名前でアクセスできません。例えば、MyPC1で
$ ping mypc2.home.arpa
としても名前が解決できない旨のエラーになります。クライアント間のアクセスは想定していないので仕方がないといえばそれまでですが…クライアントPCに名前でアクセスできてしまうとセキュリティ上の問題もあることでしょう。
とはいっても自宅LANで勝手知ったる自分のPCに、
smb://mypc2.home.arpa/share
のように共有フォルダーにアクセスできればそれなりに便利です。そこで、DHCPサーバも同時に立ち上げて、DHCPクライアントの名前解決もできるようにしてみます。
尚、自宅LANのルーターはNTT西日本のRT-500KIを想定しています。
本記事は、自宅LANにDNSサーバとDHCPサーバを立てて、ルーターと連携して自宅LAN~外のインターネットで統一的に名前解決する手順を記載します。
RT-500KIルータの設定
RT-500KIは、特定のドメインに属するホストの名前解決を特定のDNSサーバに委譲する機能を持っています。RT-500KIでドメインが「home.arpa」のときだけ、マイDNSサーバで名前解決するように設定します。
トップページ > 詳細設定 > DNS設定
エントリ番号1に以下の内容を設定します。そのために、エントリ番号1の編集ボタンをクリックします。 エントリ番号1の「有効/無効」は「有効」にします。
1 home.arpa xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
トップページ > 詳細設定 > DNS設定 > エントリ編集
エントリ編集画面で、名前解決させるドメイン名とマイDNSサーバのIPv6アドレスを設定します。
[ ローカルドメイン問合せテーブル ]
エントリ番号:1
ドメイン名:home.arpa
プライマリDNSサーバアドレス:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
以上で、ドメインが「home.arpa」のときだけ、マイDNSサーバで名前解決するようになります。
マイDNSサーバのインストール
マイDNSサーバはdnsmasqをインストールするのがお手軽です。dnsmasqにはdhcpサーバ機能も実装されていますので、dnsmasqをインストールするだけで、DNSサーバとDHCPサーバを立ち上げることができます。
# apk add dnsmasq
/etc/dnsmasq.confで初期設定
local-service
local=/home.arpa/
listen-address=::1,127.0.0.1,xxxx:xxxx:xxxx:xxxx::y,192.168.1.y
add-hosts=/etc/add_hosts
conf-dir=/etc/dnsmasq.d/,*.conf
# dhcp
domain=home.arpa
dhcp-range=192.168.1.200,192.168.1.250,12h
dhcp-option=option:router,192.168.1.1
dhcp-option=option:netmask,255.255.255.0
dhcp-option=option:dns-server,192.168.1.1
# IPv6
ra-param=wlan0,high,0,0
quiet-ra
dhcp-range=::0,::7fff,constructor:wlan0,ra-names,slaac,12h
dhcp-option=option6:dns-server,[xxxx:xxxx:xxxx:xxxx:zzzz:zzzz:zzzz:zzzz]
dhcp-option=option6:information-refresh-time,12h
listen-addressとして、このDNSサーバを立てるIPv4, IPv6アドレスを設定します。ルータからはIPv6アドレスで参照されますから、IPv6アドレスの設定は必須です。
このDNSサーバで名前解決すべき自宅LAN内のサーバを/etc/add_hostsで定義します。add_hostsを定義しなければ/etc/hostsを見に行くようですが、サーバを追加更新する度に/etc/hostsを更新するというのは忘れそうなのでこうしておきます。
192.168.1.1 rt-500ki.home.arpa
192.168.1.2 homeserver.home.arpa
192.168.1.3 mediaserver.home.arpa
xxxx:xxxx:xxxx:xxxx:zzzz:zzzz:zzzz:zzzz rt-500ki.home.arpa
xxxx:xxxx:xxxx:xxxx::2 larkbox.home.arpa
xxxx:xxxx:xxxx:xxxx::3 mediaserver.home.arpa
‘xxxx:xxxx:xxxx:xxxx:zzzz:zzzz:zzzz:zzzz’はプロバイダから配布されたグローバルIPv6アドレス。 プレフィックスはxxxx:xxxx:xxxx:xxxx/64。
サーバの固定IPv4アドレスは192.168.1.vvとし、そのIPv6アドレスはxxxx:xxxx:xxxx:xxxx::vvとしていますが、この付与方法は推測されやすいのであまり望ましくないかもしれません。
DHCPで配布するアドレスは192.168.1.200~192.168.1.250としました。
設定を終えたら、ルーターのDHCPサーバを無効にした後、dnsmasqを起動
# rc-service dnsmasq start
DNSサーバの動作確認のためにツールをインストール
# apk add bind-tools
まずはローカルで動作するか確認。
$ dig @127.0.0.1 homeserver.home.arpa AAAA +short
$ dig @127.0.0.1 homeserver.home.arpa A +short
$ dig @::1 homeserver.home.arpa AAAA +short
$ dig @::1 homeserver.home.arpa A +short
次にネット越しに動作するか確認。
$ dig @192.168.1.2 mediaserver.home.arpa AAAA +short
$ dig @192.168.1.2 mediaserver.home.arpa A +short
$ dig @xxxx:xxxx:xxxx:xxxx::2 mediaserver.home.arpa AAAA +short
$ dig @xxxx:xxxx:xxxx:xxxx::2 mediaserver.home.arpa A +short
動作確認できたらサーバ起動時にDNSを起動するように設定
# rc-update add dnsmasq boot
以上で自宅LAN内ならどの端末からでもhomeserver.home.arpaでサーバにアクセスできるようになりました。サーバだけでなくDHCPでipアドレスを割り振られたクライアントPCにも名前でアクセスできます。