仕事が変わったので、ホームラボのEdgeRouterのDNSの大掃除をした。過去にテストで作って放置されたホスト、EdgeRouterから消し損ねられてhostsに残存されていたホスト、過去の仕事だけで有用だった普通では役に立たないと思しきどうでもいい設定など。
そもそもEdgeRouterの設定を細かくしすぎて起動に時間がかかる。EdgeRouter Xだと耐えられないので、EdgeRouter 6にした背景がある。今回、EdgeRouterに登録してあったホスト名をLAN用DNSに移した。今は、コンテナでサクッとDNSが建てられるからそれほど、それほどは時間が掛からなかったが。。。
閑話休題
EdgeRouterでDNS関連の設定を操作している際、
commit 後にdnsmasqが停止したままになる現象に遭遇した。環境ではEdgeRouterのDHCPサーバとしてdnsmasqを使用している。
set service dhcp-server use-dnsmasq enable
この状態でDNS関連の設定を変更して
commitしたところ、dnsmasqが停止し、DNSだけでなくDHCPv4も応答しなくなった。hostname mappingをいじるとかなりの確率で起きる。症状
commit前はdnsmasqが正常に動作していた。$ pgrep -a dnsmasq
13302 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq …
$ sudo ss -lunp | grep -E ‘:(53|67) ‘
UNCONN 0 0 *:53 *:* users:((“dnsmasq”,pid=13302,fd=6))
UNCONN 0 0 *:67 *:* users:((“dnsmasq”,pid=13302,fd=4))
UNCONN 0 0 :::53 :::* users:((“dnsmasq”,pid=13302,fd=8))
ところが設定変更後に、
commit
すると、dnsmasqのプロセスと53/67番ポートのリスナーが消えた。
$ pgrep -a dnsmasq
$ sudo ss -lunp | grep -E ‘:(53|67) ‘
dnsmasqの状態を確認
サービス状態を確認すると、dnsmasqはfailedになっていた。
$ sudo /etc/init.d/dnsmasq status
dnsmasq.service – dnsmasq – A lightweight DHCP and caching DNS server
Active: failed (Result: exit-code)
/var/log/messagesには次のようなログが記録されていた。dnsmasq.service: Control process exited, code=exited status=3
dnsmasq.service: Unit entered failed state.
dnsmasq.service: Failed with result ‘exit-code’.
dnsmasq.service: Start request repeated too quickly.
Failed to start dnsmasq – A lightweight DHCP and caching DNS server.
一方、dnsmasqの設定自体を確認すると、
$ sudo dnsmasq –test
dnsmasq: syntax check OK.
となり、設定ファイルの構文エラーではなかった。
復旧
手動でdnsmasqを再起動すると正常に復旧した。
$ sudo /etc/init.d/dnsmasq restart
[ ok ] Restarting dnsmasq (via systemctl): dnsmasq.service.
確認すると、dnsmasqが再び起動し、DNSの53番ポートとDHCPの67番ポートもLISTEN状態になった。
$ pgrep -a dnsmasq
12305 /usr/sbin/dnsmasq …
$ sudo ss -lunp | grep -E ‘:(53|67) ‘
UNCONN 0 0 *:53 *:* users:((“dnsmasq”,pid=12305,fd=6))
UNCONN 0 0 *:67 *:* users:((“dnsmasq”,pid=12305,fd=4))
UNCONN 0 0 :::53 :::* users:((“dnsmasq”,pid=12305,fd=8))
TIPS
EdgeRouterでdnsmasqを使用している場合、DNSやDHCPに関連する設定を変更して
commitした後は、念のためdnsmasqが動作していることを確認した方がよい。pgrep -a dnsmasq
sudo ss -lunp | grep -E ‘:(53|67) ‘
停止していた場合は、
sudo /etc/init.d/dnsmasq restart
で復旧できる場合がある。
今回確認した範囲では、
dnsmasq --testは正常であり、手動再起動も成功した。また、saveを実行する前のcommit直後に現象が発生したため、少なくとも今回のケースではsaveではなくcommit時のサービス再構成が契機となっている。原因を断定するところまでは調査していないが、DNS/DHCP設定変更後に名前解決やDHCPが突然動作しなくなった場合は、まずdnsmasqの稼働状態を確認すると切り分けが早い。
実は、EdgeRouterのDNSって、コマンドラインでしか、IPv6のエントリ追加ができなかったりして使いにくかったので、Technitiumに乗り換え作業中だった。ADサーバもいなくなったのでちょうどよく、DNSがIPv4とIPv6のデュアルスタックに。設定は、API経由で流せる。さらにMCPサーバが転がっていたりする。なので、一度作ったらあとは、Open WebUIかCodexに管理はお任せw うまくいけばAIからRoute53とLocal DNSの両方の同時設定もできるか。もうスクリプト連携とかもいらないか。

ぱっと見、Route53ぽくていい。Chat GPTのおすすめだったのだが、バックアップはどうすると聞いたら、セカンダリを立てろと。。。それもうまい具合に同期される。セカンダリは、RoonサーバのDockerでやることに。しかし、自分の複雑なDNS、業者に頼んだらすごいお金がかかったと思う。これがAIに聞くだけでトントン拍子にできる。ただ、トントン拍子に時間も奪われたw