如果确实使用 dnsmasq

如果确实使用 dnsmasq

以下是我从命令行调试此问题的方法:

$ 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.confsystemd-resolved 中删除。现在的问题不是 dnsmasq 没有记录查询。问题是查询没有发送到 dnsmasq。每个应用程序都会调用getaddrinfoglibc 函数,该函数会查看/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.它可以做到这一点,但步骤更少。

  1. sudo mv /etc/resolv.conf /etc/resolv-for-dnsmasq.conf
  2. echo 'nameserver 127.0.0.1' | sudo tee /etc/resolv.conf
  3. dnsmasq --no-daemon --log-queries -r /etc/resolv-for-dnsmasq.conf启动服务器
  4. dig example.com所有其他应用程序都应该开始受益于 dnsmasq 的缓存

如果使用 systemd-resolved

dnsmasqUbuntu 23.10默认不使用。它使用systemd-resolved,因此使用相应的命令:

  1. sudo resolvectl log-level debug
  2. 做你原来的dig example.com或使用resolvectl query --cache=0 example.com
  3. 参见顶部的输出sudo journalctl -r -u systemd-resolved
  4. 为了保护隐私,请关闭调试sudo resolvectl log-level info

答案2

不需要额外的 resolv.conf。只需将其添加nameserver 127.0.0.1/etc/resolv.conf在其他名称服务器之前,您现在就拥有了这些名称服务器。Dnsmasq 将检测自己的地址并跳过自身。这种设置的优点是,当 Dnsmasq 停止或损坏时,它也会工作,只是会有一些延迟。

它将首先尝试 Dnsmasq,但如果失败或超时,将尝试以下服务器。在正常情况下,只会使用第一个服务器。

相关内容