我希望首先处理传入的 DNS 查询,并且仅在 dnsmasq 本身没有答案时才dnsmasq
将问题转发。systemd-resolved
要非常清楚:我知道如何禁用systemd-resolved
“DNSStubListener”,所以这dnsmasq
是我的系统上运行的唯一DNS 服务器,但这不是我要问的。
据我所知,这意味着我需要systemd-resolved
运行 的存根解析器,但我还需要确保在响应systemd-resolved
之前不会响应入站 DNS 查询dnsmasq
。但是该怎么做呢?
(至于原因:我想使用 DHCP 指向的 DNS 服务器进行“正常”的 Internet 流量,这意味着我无法在dnsmasq
配置文件中对上游 DNS 服务器进行硬编码。但我还想处理dnsmasq
DNS 阻止、本地运行的虚拟机的特殊主机名、通过 VPN 连接路由部分但不是全部流量,或类似情况。)
我是否可以对 使用“DNSStubListener=no”选项systemd-resolved
,同时定义“DNSStubListenerExtra=....”,使用 localhost 作为 IP 地址,但使用非标准端口号,并使用该地址作为dnsmasq
的主上游 DNS 服务器?这种设置是否稳定?
编辑(在已经提供答案之后):这是在 Ubuntu 24.04 桌面上。
您没有指定正在使用的 Ubuntu 版本。以下内容基于 Ubuntu 24.04 Server。
如果我理解正确,您需要在本地主机上将Dnsmasq
systemd-resolved
设置为主要 DNS 解析器,并将其用作转发服务器,而不是任何上行链路服务器。因此,您需要systemd-resolved
转发到任何上行链路服务器,但不缓存任何查询。您最终希望将缓存留给Dnsmasq。因此,需要做以下几件事:
127.0.0.1
端口 53/etc/resolv.conf
任何名称服务器systemd-resolved
其转发服务器,进而使用通过 DHCP 提供的任何上行链路服务器。/etc/resolv.conf
:127.0.0.1
为名称服务器。虽然Dnsmasq不会引用此文件,但许多应用程序在执行 DNS 查询时都会引用它。例如,dig
和ping
。因此您希望这些应用程序通过查询Dnsmasq127.0.0.1
。systemd-resolved
:127.0.0.53
禁用端口上的 Stub 解析器53
127.0.0.1
端口5353
假设Dnsmasq已经安装,首先停止
systemd-resolved
和dnsmasq
:1.配置
dnsmasq
编辑
/etc/default/dnsmasq
并定义以下内容:尽管该应用程序未默认安装在 Ubuntu 24.04 Server 上,但这两个都需要定义
resolvconf
。这是因为/sbin/resolvconf
它是 的符号链接/bin/resolvectl
。有关更多信息,请参阅下面的注释。编辑
/etc/dnsmasq.conf
并定义以下内容:bind-interfaces
被定义为服务不监听所有接口上的所有地址。此设置用于服务仅监听环回接口而不监听外部接口。此外,服务仅监听127.0.0.1:53
而不是0.0.0.0:53
。来自Dnsmasq手册页:
启动
dnsmasq
服务并检查其状态:检查它是否正在监听
53
端口127.0.0.1
:2. 创建新的
/etc/resolv.conf
消除
/etc/resolv.conf
/etc/resolv.conf
使用Dnsmasq创建一个新的名称服务器:3.配置
systemd-resolved
编辑
/etc/systemd/resolved.conf
并定义以下内容:systemd-resolved
这将禁用at的 Stub 监听器127.0.0.53:53
并允许其监听地址127.0.0.1:5353
。来自solved.conf(5) 手册页:
启动
systemd-resolved
服务并检查其状态:检查它是否正在监听
5353
端口127.0.0.1
:测试
运行查询。如果配置正确,查询应该可以解决。
为了测试它是否顺利进行,
systemd-resolved
您需要重新启动Dnsmasq以清除缓存,然后systemd-resolved
在重新运行查询之前停止。我强调这一点,因为它会在Dnsmasq重新启动
systemd-resolved
时启动。请参阅下面的注释。所以:
重新启动Dnsmasq以清除缓存
sudo systemctl restart dnsmasq
停止
systemd-resolved
sudo systemctl stop systemd-resolved
检查
systemd-resolved
没有运行systemctl status systemd-resolved
或者ps -aux | grep systemd-resolved
重新运行查询。它应该超时。
缓存
最初的问题是要求禁用 中的缓存
systemd-resolved
,并将其专门留给Dnsmasq。虽然可以做到这一点,但反过来切换可能会有好处。正如@kos 在评论中指出的那样,systemd-resolved
也是通过 D-Bus 查询的,如果 启用了 ,它将能够利用缓存systemd-resolved
。因此,配置这一点非常容易,以便为Dnsmasq
systemd-resolved
启用缓存和禁用缓存。编辑
/etc/dnsmasq.conf
并定义以下内容以禁用Dnsmasq的缓存:根据Dnsmasq手册页:
编辑
/etc/systemd/resolved.conf
并注释掉以下内容以重新启用缓存systemd-resolved
,这是默认设置:笔记
每当Dnsmasq服务停止和启动时,该服务都会调用辅助脚本。
/usr/share/dnsmasq/systemd-helper
这会引用另一个文件。/usr/share/dnsmasq/init-system-common
每当Dnsmasq停止时,/sbin/resolvconf
都会使用以下命令调用:请注意,
/sbin/resolvconf
被调用,并且正如我之前提到的,/sbin/resolvconf
是的符号链接/bin/resolvctl
。因此,由于
resolvectl
是 的组件systemd-resolved
,它将启动。更多信息可在此处systemd-resolved
找到。我提到这一点,是因为在测试时,您会发现它
systemd-resolved
会在您不知情的情况下自动启动。有趣的是,在启动Dnsmasq服务
/sbin/resolvconf
时也会被调用。但如果你还记得的话,我们
DNSMASQ_EXCEPT="lo"
在 中定义过/etc/default/dnsmasq
。因此,在启动Dnsmasq/sbin/resolvconf
时不会被调用,但如果没有定义,则会被调用。如果您在查看输出时看到以下错误
systemctl status dnsmasq
,这是因为DNSMASQ_EXCEPT="lo"
未定义(注释掉)并且它试图注册与环回设备相关的 DNS 设置,但它无法执行此操作。直接运行命令就可以看到这个错误:
编辑:上面给出了一个更为详尽的答案, 原始答案如下
是的,它似乎有效。
即我这样做了:
在
/etc/systemd/resolved.conf.d/dnsmasqcompatibility.conf
:在 /etc/dnsmasq.conf 中:
通过在终端中输入此内容
host www.google.com 127.0.0.1
,我得到了以下信息:这是
/var/log/dnsmasq.log
:(等等)
我还可以通过停止服务来确认
systemd-resolved
DNS 查找超时了。我可能还应该添加
no-resolv
到/etc/dnsmasq.conf
,以强制将所有查询传递到端口 5053,但我不知道这是否会产生任何区别,因为它将使用已知的 DNS 服务器systemd-resolved
,无论 IP 地址是取自文件还是取自第二个 DNS 服务器(通过转发查询)。让 systemd-resolved 处理 DHCP 服务器并在 Dnsmasq 中使用 server=127.0.0.53。让 /etc/resolv.conf 指向 Dnsmasq 正在监听的 127.0.0.1。但您会遇到 systemd-resolved 的问题,例如有缺陷的 DNSSec 验证。您已收到警告。