dnsmasq: Maximum number of concurrent DNS queries reached (max: 150)
DNSで名前解決が出来ない状態になったので
$ systemctl status dnsmasq
でdnsmasqの状態を確認したところ
dnsmasq: Maximum number of concurrent DNS queries reached (max: 150)
というエラーがずらずらと記録されていた。
Wiresharkを起動してLoopbackのパケットを見てみたところ、127.0.0.1から127.0.0.53に向かってものすごい勢いでDNSのクエリが飛んでいた(このマシンはルーターとして使っており、LAN側のマシンからのDNSクエリが見えていた)。
127.0.0.53でググったところ、systemd-resolvedが/etc/resolv.confに自動的に設定するnameserverのようだった。dnsmasqを使っているので、あまり深く考えずにsystemd-resolvedを停止。
$ sudo systemctl stop systemd-resolved $ sudo systemctl disable systemd-resolved
(DNSがおかしくなっているので、中で名前解決しているらしいsudoが大変遅い)
ただしここで少し問題が発生し、今度はdnsmasqが起動しなくなった。またまたsystemctl status dnsmasqしたところ、今度は
dnsmasq: directory /etc/resolv.conf for resolv-file is missing, cannot poll
というエラーで起動に失敗していた。調べてみると/etc/resolv.confはシンボリックリンクになっており、その参照先がなくなっていた。どうやらsystemd-resolvedをdisableしたときにおかしくなったらしい。resolv.confは上位DNSサーバーを指定するファイルという認識なので、とりあえず
nameserver 8.8.8.8
にして再起動した。
しかし!今度はNetworkManagerによって上書きされてしまった!
# Generated by NetworkManager nameserver 127.0.0.53
今度はNetworkManagerによる上書きを停止する。
/etc/NetworkManager/NetworkManager.confの[main]にdns=noneを追加する
[main] dns=none
そして再度/etc/resol.confを作成。
これでようやくdnsmasqで名前解決できるようになった。
Linuxは過去の遺産を活かせるように、ファイルにリンクを張って別のファイルを参照させたりしてるから流れが凄く追いづらい。
その互換性が良かったりするんだけどね。