以下是我从命令行调试此问题的方法:
$ dnsmasq --no-daemon --log-queries
将选项放入log-queries
配置文件中并将其作为守护程序运行,日志文件中仍然没有显示任何内容。我期望当我这样做时dig example.com
,它应该会显示出来。
以下是上述命令的输出:
dnsmasq: started, version 2.89 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
dnsmasq: reading /etc/resolv.conf
dnsmasq: using nameserver 8.8.8.8#53
dnsmasq: using nameserver 1.1.1.1#53
dnsmasq: using nameserver 2001:4860:4860::8888#53
dnsmasq: using nameserver 2001:4860:4860::8844#53
dnsmasq: read /etc/hosts - 7 names
Ubuntu 版本:23.10
内核 6.5.0
dnsmasq 版本:2.89
答案1
如果确实使用 dnsmasq
只需执行dig @127.0.0.1 example.com
即可。对于整个系统,请跳至适当的解决方案以下。
您的行dnsmasq: using nameserver 8.8.8.8
显示您已从/etc/resolv.conf
systemd-resolved 中删除。现在的问题不是 dnsmasq 没有记录查询。问题是查询没有发送到 dnsmasq。每个应用程序都会调用getaddrinfo
glibc 函数,该函数会查看/etc/resolv.conf
。在本例中,dig
正在读取该文件,并直接向 发出 DNS 请求8.8.8.8
,而无需询问dnsmasq
。
systemd-resolved/etc/resolv.conf
出于某种原因编辑该文件。它这样做是为了使用 指向计算机上的所有 DNS 查询127.0.0.53
。使用 执行此操作dnsmasq
只会导致无限循环,因为dnsmasq
它本身使用该文件。systemd-resolved
不会出现此问题,因为它使用/etc/systemd/resolved.conf
。我们可以使用 复制该操作适当的解决方案:
编辑:请参阅 Pihhan 的更简单的答案https://askubuntu.com/a/1501802/1004020.它可以做到这一点,但步骤更少。
sudo mv /etc/resolv.conf /etc/resolv-for-dnsmasq.conf
echo 'nameserver 127.0.0.1' | sudo tee /etc/resolv.conf
dnsmasq --no-daemon --log-queries -r /etc/resolv-for-dnsmasq.conf
启动服务器dig example.com
所有其他应用程序都应该开始受益于 dnsmasq 的缓存
如果使用 systemd-resolved
dnsmasq
Ubuntu 23.10默认不使用。它使用systemd-resolved
,因此使用相应的命令:
sudo resolvectl log-level debug
- 做你原来的
dig example.com
或使用resolvectl query --cache=0 example.com
- 参见顶部的输出
sudo journalctl -r -u systemd-resolved
- 为了保护隐私,请关闭调试
sudo resolvectl log-level info
答案2
不需要额外的 resolv.conf。只需将其添加nameserver 127.0.0.1
到/etc/resolv.conf在其他名称服务器之前,您现在就拥有了这些名称服务器。Dnsmasq 将检测自己的地址并跳过自身。这种设置的优点是,当 Dnsmasq 停止或损坏时,它也会工作,只是会有一些延迟。
它将首先尝试 Dnsmasq,但如果失败或超时,将尝试以下服务器。在正常情况下,只会使用第一个服务器。