我正在本地 Fedora 39 机器上dnsmasq
作为插件安装运行。NetworkManager
我所需要的dnsmasq
基本上是对hosts
可以按主题组织的其他文件的支持。
我的配置是:
/etc/dnsmasql.conf
:
user=dnsmasq
group=dnsmasq
interface=lo
bind-interfaces
conf-dir=/etc/NetworkManager/dnsmasq.d,*.conf
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
/etc/NetworkManager/conf.d/00-use-dnsmasq.conf
[main]
dns=dnsmasq
/etc/NetworkManager/dnsmasq.d/00-add-hosts.conf
log-queries
no-hosts
addn-hosts=/etc/hosts.d
address=/development/127.0.0.1
/etc/hosts.d
是一个包含主机文件的目录,其中包含我想要“sinkhole”的条目:
0.0.0.0 1.example.com
0.0.0.0 2.example.com
...
dnsmasq
已启动并正在运行,我在进程中看到守护进程:
ps aux | grep dnsmasq
dnsmasq 61161 0.4 0.0 228096 4480 ? S 16:08 0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/NetworkManager/dnsmasq.pid --listen-address=127.0.0.1 --cache-size=400 --clear-on-reload --conf-file=/dev/null --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d
我还在dnsmasq
调试日志中看到,主机文件/etc/hosts.d
也被读取:
Dec 30 16:18:40 fedora dnsmasq[61823]: chown of PID file /run/NetworkManager/dnsmasq.pid failed: Operation not permitted
Dec 30 16:18:40 fedora dnsmasq[61823]: DBus support enabled: connected to system bus
Dec 30 16:18:40 fedora dnsmasq[61823]: warning: no upstream servers configured
Dec 30 16:18:40 fedora dnsmasq[61823]: read /etc/hosts.d/private - 10 names
Dec 30 16:18:40 fedora dnsmasq[61823]: setting upstream servers from DBus
Dec 30 16:18:40 fedora dnsmasq[61823]: using nameserver 192.168.0.1#53(via wlp2s0)
但是,当我尝试从主机文件访问域时addn-hosts
,它们并没有0.0.0.0
按照我的预期解析。这些主机文件似乎被忽略。
另一方面,我添加到系统中的任何内容都会/etc/hosts
按预期工作。即使我no-hosts
在配置中显式使用了选项
dnsmasq
,并且我看到它已添加到守护程序调用中。
我还看到dnsmasq
使用了配置,因为该address=/development/127.0.0.1
行按预期工作:
$ ping -c 3 anything.development
PING anything.development (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.091 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.175 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.200 ms
只是addn-hosts
不知何故被忽略了。
这是我的/etc/resolv.conf
:
# Generated by NetworkManager
nameserver 127.0.0.1
options edns0 trust-ad
以前我认为这是systemd-resolved.service
干扰(因为它之前将 127.0.0.53 添加到我的resolv.conf
文件中),但现在我禁用了该服务:
systemctl status systemd-resolved.service
○ systemd-resolved.service - Network Name Resolution
Loaded: loaded (/usr/lib/systemd/system/systemd-resolved.service; disabled; preset: enabled)
Drop-In: /usr/lib/systemd/system/service.d
└─10-timeout-abort.conf
Active: inactive (dead)
我不确定我的配置有什么问题。
您好,欢迎来到 ServerFault,vrs!(这是我的第一个答案,我想也是你的第一个问题?)
您已经很好地描述了情况,但您可以更具体地测试您所看到的名称解析。您的系统上是否有 dig 或 nslookup 作为命令行工具?如果是这样,请使用它们直接查询机器上的名称服务器,而不是您所做的任何事情。
我发现您的配置中没有定义上游名称服务器(但显然您正在使用上游名称服务器。)我怀疑列入黑名单的域的解析实际上来自您的上游。所以我要问的第一个问题是:我的本地 dnsmasq 实例是否正确响应?
对我来说,成功是这样的:
请注意倒数第三行中的 SERVER: 字段让我放心,我正在询问我的本地服务器。您可以通过这种方式在问题后面指定服务器名称或 IP 地址,这恰好会显示正常的分辨率(在本例中这是我们不想要的):
(我在这里使用的这个系统与您的设置非常相似,但是 1)它是一个专用的 DNS/DHCP 机器,2)我没有通过 NetworkManager 模块化我的 dnsmasq 的额外复杂性。)
在这种情况下,DNS 可能会变得相当复杂,我和你都无法立即看出问题所在,对此我并不感到惊讶。尝试专门探测您的本地 dnsmasq,并添加一些有关解析发生位置的详细信息(如果不是来自您的 dnsmasq)!
感谢您提出一个好问题。:)
感谢@Tai Viinikka的出色建议,问题得到了解决!
太长了;在本地主机上运行的DNS 服务器
dnsmasq
并不一定意味着它被 所使用NetworkManager
,即使/etc/resolv.conf
明确如此表示;如果您的本地计算机使用路由器的 DHCP 服务器,您也可以从中获取 DNS 服务器设置。直到
dig
默认情况下使用 DNS 服务器/etc/resolv.conf
,即使管理的连接NetworkManager
使用从 DHCP 获取的 DNS 服务器地址;因此,如何解析相同的主机名是不同dig
的curl
。故障排除:
dnsmasq
确实按预期工作:主机名按预期由(本地 DNS 服务器)解析为
0.0.0.0
(如addn-hosts
主机文件所述)。127.0.0.1
dnsmasq
那么为什么来自同一主机名的所有请求
curl
或浏览器对同一主机名的所有请求都不是通过我的本地 DNS 解析的dnsmasq
,而是显然来自另一个上游 DNS,尽管/etc/resolv.conf
说:这意味着某些内容正在覆盖 DNS 设置。必须是
NetworkManager
NetworkManager
DNS 正在使用什么:事实上,不是
/etc/resolv.conf
所说的,而是NetworkManager
使用我的 WiFi 路由器的 DNS 地址。这是因为我的本地计算机上的 WiFI 连接使用路由器的DHCP
设置。dnsmasq
在修复 所使用的 DNS 之前
NetworkManager
,我们需要添加一些在检查主机文件后将使用的上游 DNS。这是我的整个dnsmasq
配置现在的样子:NetworkManager
:打开
nm-connection-editor
(或“设置”->“WiFi”->“已连接到设置的网络”),然后IPv4
:那么对于
IPv6
:IPv4
)这对应于以下变化
/etc/NetworkManager/system-connections/YOUR-CONNECTION-NAME.nmconnection
:现在,重新启动
dnsmasq
和NetworkManager
:瞧!
NetworkManager
使用 localhost 作为 DNS 服务器,来自curl
网络浏览器的所有请求都使用它来解析,来自 的额外主机文件dnsmasq
受到addn-hosts
尊重: