我有一个运行 Ubuntu 18.04.4 的机器。有两个 LAN 接口 enp3s0 和 eno1:前者连接到 LAN 网络上的 3G 调制解调器,后者连接到另一个网络上的卫星调制解调器。网络管理器负责通过其配置文件中的连接检查设置来设置接口的优先级(比方说,如果没有 3G 覆盖,eno1 接口指标将通过在其默认值上添加 20000 来降级,并且在没有卫星的情况下同样适用于 enp3s0 - eno1 上的默认优先级较高(两个连接均处于活动状态)。 DNS 由 systemd-resolved 和 systemd-networked 处理。两个接口都从 3G 和卫星调制解调器上运行的 DHCP 服务获取 IP 地址和 DNS。 enp3s0:IP 192.168.200.101(DNS/GW:192.168.200.101) - 该地址通过 MAC 地址分配永久分配 eno1:IP 192.168.55.xxx(DNS/GW:192.168.55.1)
不知何故,提供给第一个接口的 DNS 服务器地址优先于第二个接口。例如,如果 enp3s0 没有互联网连接,并且互联网流量路由到 192.168.55.1,则仍尝试通过 192.168.200.1 进行名称解析,但显然会失败。我尝试将 eno1 的动态分配的 DNS 替换为添加到 /etc/systemd/network/eno1.network 的静态 DNS
[Match]
Name=eno1
[Network]
DNS=8.8.8.8
DNS=8.8.4.4
但系统仍然倾向于使用 192.168.200.1 进行名称解析。我在 /etc/systemd/resolved.conf 中添加了一个全局后备 DNS,但即使考虑在内,它似乎也没有帮助。
[Resolve]
#DNS=
FallbackDNS=8.8.4.4
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes
我想要实现的目标是不只使用 192.168.200.1 作为 DNS 服务器,但万一使用与第二个接口关联的 DNS 服务器不起作用,但我找不到方法。我的理解是,它在某种程度上与第一个 DNS 的配置方式有关,它在域分配中得到了这一点,我怀疑它使其成为互联网名称的主要来源,但可能是我在做梦。非常感谢对此的任何建议,基本上我怎样才能让两个 DNS 都工作?下面是我的已解析状态输出,我在其中看到了 ~(Google DNS 分配给了第二个 iface)。
Global
DNSSEC NTA: 10.in-addr.arpa
16.172.in-addr.arpa
168.192.in-addr.arpa
17.172.in-addr.arpa
18.172.in-addr.arpa
19.172.in-addr.arpa
20.172.in-addr.arpa
21.172.in-addr.arpa
22.172.in-addr.arpa
23.172.in-addr.arpa
24.172.in-addr.arpa
25.172.in-addr.arpa
26.172.in-addr.arpa
27.172.in-addr.arpa
28.172.in-addr.arpa
29.172.in-addr.arpa
30.172.in-addr.arpa
31.172.in-addr.arpa
corp
d.f.ip6.arpa
home
internal
intranet
lan
local
private
test
Link 15 (tun0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 14 (veth2e5ae19)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 12 (veth5b411fa)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 10 (br-b950c350c024)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 9 (docker0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 8 (can0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 7 (wlp1s0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 6 (wwp0s20u6i10)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 5 (wwp0s20u6i8)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 4 (enp3s0)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 192.168.200.1
DNS Domain: ~.
rig
Link 3 (enp2s0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 2 (eno1)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 8.8.8.8
8.8.4.4
答案1
在systemd-resolved
术语中,DNS 域字段中前缀为 的域~
表示“将此域直接查询到系统范围的默认 DNS 服务器:不要为此域使用每链接 DNS 服务器”。组合~.
是相同的,但对于根 DNS 域来说.
,它是所有 DNS 域的隐含后缀。
但问题似乎是您似乎没有任何系统范围的默认 DNS 服务器:您只配置了每个链接的 DNS 服务器。FallbackDNS=
是仅在不知道其他 DNS 服务器信息时使用,根据resolved.conf(5)
手册页。因为eno1
和都enp3s0
定义了每个链接的 DNS 服务器,所以FallbackDNS
根本不被使用。
您的帖子说网络配置enp3s0
是
enp3s0:IP 192.168.200.101(DNS/GW:192.168.200.101)
因为将接口作为自己的网关是没有意义的(尽管如果网段之外没有连接并且某些配置工具坚持必须配置网关,则有时将其用作解决方法),因此我假设 DNS/GW部分有拼写错误,您的意思是“DNS/GW:192.168.200.1”。这与状态所说的相符resolved
。
因此,如果 3G 调制解调器的 IP 地址为 192.168.200.1,那么根本原因可能是即使 3G 调制解调器没有互联网连接,resolved
仍然可以联系调制解调器本身。因此,resolved
即使 3G 链路断开,您也可能会认为 192.168.200.1 仍然是有效的 DNS 服务器。如果 3G 调制解调器的 DNS 服务器/代理功能写得不好,它可能不会以 SERVFAIL 响应,或者在没有链接的情况下只是简单地让请求超时:这可能会进一步误导人们resolved
认为 3G 调制解调器是有效的 DNS服务器实际上根本没有与互联网的活动链接。
当您只有一个传出互联网连接时,像这样的 3G 调制解调器中的 DNS 代理可能会简化网络配置,但当您有替代连接时,情况可能会变得复杂:那么您需要一个
我建议您使用/etc/systemd/resolved.conf
justDNS=
而不是 来指定静态 DNS FallbackDNS=
。在resolved.conf(5)
手册页上,描述DNS=
说:
域名解析=
用作系统 DNS 服务器的 IPv4 和 IPv6 地址的空格分隔列表。DNS 请求将发送到列出的 DNS 服务器之一,同时发送到从 systemd-networkd.service(8) 获取的或由外部应用程序在运行时设置的适合每个链接的 DNS 服务器。出于兼容性原因,如果未指定此设置,则将改用 /etc/resolv.conf 中列出的 DNS 服务器(如果该文件存在且其中配置了任何服务器)。此设置默认为空列表。
因此,DNS=
中的设置resolved.conf
永远不会阻止使用每个链接的 DNS 服务器。
为了解决您的问题,我建议如下:
如果 192.168.200.1 是 3G 调制解调器的 IP 地址,则它仅充当 3G 网络运营商的 DNS 服务器的代理。找出这些服务器的真实IP地址(可能通过检查 3G 调制解调器本身的互联网侧网络设置,虽然它有一个链接)。然后使用DNS=
中的一行配置它们/etc/systemd/resolved.conf
。
此后,DNS 请求应并行发送至 3G 网络的 DNS 服务器(因为DNS=
中的一行resolved.conf
)以及适用的每链路 DNS 服务器。由于您现在已经配置了系统范围的 DNS 服务器,因此现在应该仅在查询 域 中的名称时才使用 3G 调制解调器的内置 DNS 服务*.rig
,因为这就是DNS Domain:
的设置的enp3s0
含义。
如果 3G 网络链路出现故障,直接使用 3G 网络的 DNS 服务器的尝试现在无疑会失败(而不是从调制解调器本身产生可能不明确的响应),从而提示resolved
该 DNS 服务器不再可用,并且应该考虑其他替代方案。一旦连接检查增加了其他链接的优先级,就应该开始使用其每个链接的 DNS 服务器。
如果可以使用诸如 之类的名称访问 3G 调制解调器的管理 Web 界面<something>.rig
,则只要调制解调器本身可以访问,无论 3G 链路是打开还是关闭,都可以使用该名称访问该界面。