我正在尝试进行一些故障排除并在笔记本电脑上安装 dnscrypt(-proxy)。我想找出哪些 DNS 服务器有效地被我的标准 Ubuntu 安装使用(当然带有 NetworkManager 和 dnsmasq)。但是我发现 dnsmasq 的配置很复杂。我找不到它要查询哪些 DNS 服务器。
首先,我检查了/etc/resolv.conf
,当然,它被设置为查询127.0.1.1
dnsmasq-base 正在监听的位置。好的,现在是时候检查 dnsmasq 配置了它被设置为查询哪些服务器。/etc/dnsmasq.d/
但是,除了 之外是空的,只有network-manager
一个条目:bind-interfaces
。这没什么帮助。所以我检查了 NetworkManager 如何调用 dnsmasq:
$ pgrep -a dnsmasq
1786 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/NetworkManager/dnsmasq.pid --listen-address=127.0.1.1 --cache-size=0 --conf-file=/dev/null --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d
好吧,所以它没有使用/etc/resolv.conf
,它忽略了/etc/hosts/
,它的配置文件设置为/dev/null
并且/etc/NetworkManager/dnsmasq.d
也是空的。所以那里也没有线索。必须恢复到某些默认值还是什么?
我发现的其他文件:
/run/NetworkManager/resolv.conf
说nameserver 127.0.1.1
/run/resolvconf/resolv.conf
说nameserver 127.0.1.1
/etc/resolv.conf
说nameserver 127.0.1.1
/etc/resolvconf/base
为空,./head
只有评论/var/
并且/run/
没有其他名为resolv.conf
运行后wireshark
,我可以看到它正在向我的家用路由器询问 DNS 答案(正如预期的那样)。但是它从哪里获得该 IP,我在哪里更改它,而不使用 dnsmasq 和 NetworkManager 的所有其他功能(例如 VPN 的拆分 DNS)?
答案1
找出通过 DHCP 接收到信息后保存的位置:
/var/lib/NetworkManager/*lease
为了改变这些设置,请参阅 NetworkManager 的文档:
nmcli con modify my-office my-office ipv4.ignore-auto-dns yes ipv6.ignore-auto-dns yes
nmcli con mod test-lab ipv4.dns "8.8.8.8 8.8.4.4"
nmcli con mod test-lab ipv6.dns "2001:4860:4860::8888 2001:4860:4860::8844"
答案2
此答案仅在 Ubuntu 16.04 上测试过。其他版本在 DNS 解析方式上可能有所不同。
正如您所发现的,NetworkManager 管理的 dnsmasq 不会从文件系统读取任何 DNS 服务器。秘密就在于这个标志:
--enable-dbus=org.freedesktop.NetworkManager.dnsmasq
因此 NetworkManager 使用 dbus 在运行时动态配置 dnsmasq。它的 dbus 接口如下所示:
$ sudo dbus-send --system --type=method_call --print-reply \
--dest=org.freedesktop.NetworkManager.dnsmasq \
/uk/org/thekelleys/dnsmasq \
org.freedesktop.DBus.Introspectable.Introspect
method return time=1613637106.507949 sender=:1.16 -> destination=:1.49 serial=11 reply_serial=2
string "<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node name="/uk/org/thekelleys/dnsmasq">
<interface name="org.freedesktop.DBus.Introspectable">
<method name="Introspect">
<arg name="data" direction="out" type="s"/>
</method>
</interface>
<interface name="org.freedesktop.NetworkManager.dnsmasq">
<method name="ClearCache">
</method>
<method name="GetVersion">
<arg name="version" direction="out" type="s"/>
</method>
<method name="GetLoopServers">
<arg name="server" direction="out" type="as"/>
</method>
<method name="SetServers">
<arg name="servers" direction="in" type="av"/>
</method>
<method name="SetDomainServers">
<arg name="servers" direction="in" type="as"/>
</method>
<method name="SetServersEx">
<arg name="servers" direction="in" type="aas"/>
</method>
<method name="SetFilterWin2KOption">
<arg name="filterwin2k" direction="in" type="b"/>
</method>
<method name="SetBogusPrivOption">
<arg name="boguspriv" direction="in" type="b"/>
</method>
<signal name="DhcpLeaseAdded">
<arg name="ipaddr" type="s"/>
<arg name="hwaddr" type="s"/>
<arg name="hostname" type="s"/>
</signal>
<signal name="DhcpLeaseDeleted">
<arg name="ipaddr" type="s"/>
<arg name="hwaddr" type="s"/>
<arg name="hostname" type="s"/>
</signal>
<signal name="DhcpLeaseUpdated">
<arg name="ipaddr" type="s"/>
<arg name="hwaddr" type="s"/>
<arg name="hostname" type="s"/>
</signal>
<method name="AddDhcpLease">
<arg name="ipaddr" type="s"/>
<arg name="hwaddr" type="s"/>
<arg name="hostname" type="ay"/>
<arg name="clid" type="ay"/>
<arg name="lease_duration" type="u"/>
<arg name="ia_id" type="u"/>
<arg name="is_temporary" type="b"/>
</method>
<method name="DeleteDhcpLease">
<arg name="ipaddr" type="s"/>
<arg name="success" type="b" direction="out"/>
</method>
</interface>
</node>
"
因此有SetServers
,NetworkManager 大概会使用 ,和GetLoopServers
,但没有GetServers
。
我们能做的第二件最好的事情是向 dnsmasq 发送 SIGUSR1。这会使它将包含每个服务器统计信息的状态报告转储到 syslog:
$ sudo kill -USR1 $(pgrep dnsmasq)
$ sudo tail /var/log/syslog
...
... dnsmasq[927]: server 192.168.1.1#53: queries sent 2, retried or failed 0
... dnsmasq[927]: server 1.1.1.1#53: queries sent 2, retried or failed 0
... dnsmasq[927]: server 8.8.8.8#53: queries sent 25, retried or failed 0
我不确定这些是否只是当前正在使用的服务器,或者列表中是否还包含已被删除的服务器。但据我所知,这是我们能得到的最权威的答案。
答案3
我们知道您通过与路由器、交换机或其他接入点的 DHCP 事务获取 IP 地址、DNS 名称服务器等。如果您的地址是静态地址,则需要指定 DNS 名称服务器,因此您已经知道实际使用的 DNS 服务器。
在 DHCP 事务中,路由器中的 DNS 名称服务器将传输到您的连接。事实上,它们可能依次来自您的互联网服务提供商提供的调制解调器或互联网设备。
您可以通过如下方式访问路由器的管理页面来指定您喜欢的名称服务器。
另外,您可以指示网络管理器使用首选名称服务器,如下所示:删除 isp 提供的 dns
由于 DNS 名称服务器因连接而异;也就是说,您将收到在工作时连接的 DNS 名称服务器与在家中连接的名称服务器不同的 DNS 名称服务器,因此提供的数字显示在 /etc/NetworkManager/system-connections/foo 中,其中 foo 是连接的名称。例如,我的一个连接是有线连接 1除其他条目外,它还报告了以下内容:
[ipv4]
dns=8.8.8.8;8.8.4.4;
dns-search=
ignore-auto-dns=true
method=auto