先日導入したNASに、宅内DNSを構築しようとしたのだが、最終的に失敗。
CoreDNSコンテナを立ち上げるが、いろいろ調整が必要だった。
- 設定ファイルをボリュームでバインドさせようとしたら、エラーが発生 →起動ユーザを変更する
- NASの内部で、127.0.0.1用にdnsmasqが動いている。 →portsで外部IP向けにのみポートを開放し、127.0.0.1向けには開放しない
いろいろ修正した結果 docker-compose.yaml は下記のような形になる。
coredns:
image: coredns/coredns:1.12.4
container_name: coredns
user: "XXX:XXX"
restart: unless-stopped
environment:
GOMAXPROCS: "8"
command:
- -conf
- /etc/coredns/Corefile
ports:
- "192.168.123.XXX:53:53/udp" # IPv4 NASのLAN側IP向け
- "192.168.123.XXX:53:53/tcp" # IPv4 NASのLAN側IP向け
- "[2001:db8:1234:5678::53]:53:53/udp" # IPv6 NASのLAN側IP向け
- "[2001:db8:1234:5678::53]:53:53/tcp" # IPv6 NASのLAN側IP向け
volumes:
- ./coredns:/etc/coredns:ro
Corefileファイル
.:53 {
errors
log
hosts /etc/coredns/hosts {
reload 5s
fallthrough
}
# Resolve names not registered above through upstream DNS servers.
forward . 1.1.1.1 8.8.8.8
cache 30
}
hostsファイル
192.168.123.XXX test.modern-utopia.net
192.168.123.XXX live.test.modern-utopia.net
DNSサーバの立ち上げ後、Windows端末からはDNS IPv4・DNS IPv6両方を手動設定することにより、宅内ホストの名前解決ができるようになったので、DNSとして動作することは確認できた。
ただ、Android端末については宅内ホストの名前解決が行えない。 今回確認した機種ではDNSの手動設定はIPv4しか設定できなかったのでそれが原因ではないかと想像している。 ※機種やOSバージョンによっては設定できるものもあるかもしれない。
これは想像になってしまうが、Android端末はおそらくIPv6の機能で通知された、別のDNSサーバで名前解決してしまっているので、今回構築したDNSを利用せずに別のDNSサーバを使用していると思われる。
よくよく調べてみると、IPv6の場合、DHCPも存在しているが、DHCPを使用せずとも、IPアドレスの自動設定やDNSアドレスを通知する仕組みがある。
ルータから、ルータ広告(RA / Router Advertisement)というパケットを投げて、IPv6プレフィックスやデフォルトゲートウェイ関連の情報を通知できる。また、RDNSSオプションによりDNSサーバのアドレスも同様に通知できる。
ルータの設定を確認したが、設定画面にDHCPv6の項目がない。かといって、RAが配布する情報を変更できるような項目もない。
打つ手がないので、宅内DNSの運用はあきらめた。