设置/etc/resolv.conf

设置/etc/resolv.conf

我在没有桌面的 Ubuntu 22.04 SERVER 安装中的 /etc/systemd/resolved.conf 中添加了以下几行 - 我强调这一点是因为我无法使用普通桌面方法在 Ubuntu 中设置网络选项:

DNS=9.9.9.9 149.112.112.112 1.1.1.1 1.0.0.1
DNSOverTLS=yes

一切正常,但前提是所有连接都必须通过被标识为 tun0 的 VPN 隧道。因此,在以上配置下,如果我

sudo tcpdump -ni tun0 -p port 53 or port 853

在一个终端窗口中运行 google.com,然后尝试从另一个终端窗口中 ping google.com,我看到了几个请求,但它们都从端口 853 发出。很好,所以 DNS-over-TLS 正在运行。问题是,如果我运行

sudo tcpdump -ni enp0s10 -p port 53 or port 853

我看到一些行显示它也在尝试访问我的路由器 192.168.1.1,仍在尝试使用端口 853,但看起来它尝试了四次。这不太好。我不想让它尝试使用我的路由器的 DNS,所有流量都应该通过隧道。

我尝试了另一种方法,即暂时重命名 /etc/resolv.conf(这是指向其他地方的符号链接),并将其替换为一个实际的文本文件(不是符号链接),在其中我放入了以下几行:

nameserver 9.9.9.9
nameserver 149.112.112.112
nameserver 1.1.1.1
options use-vc edns0 trust-ad
search localdomain

除了名称服务器链接之外,我唯一更改的是将“use-vc”添加到选项行中,因为我读到这应该启用 DNS-over-TLS。当我这样做时,当我执行 DNS 请求时,不会有流量进入本地网络接口,但请求使用端口 53 而不是端口 853 发出 tun0,因此它没有使用 DNS-over-TLS。因此 use-vc 选项不被遵守。

在过去的五个小时里,我一直在阅读这些页面,但找不到解决方案,主要是因为大多数关于这个问题的页面要么假设您正在运行 Ubuntu 桌面版,要么它们似乎适用于不同版本的 Ubuntu,而这些版本的操作略有不同。我怎样才能使 DNS 请求仅从 tun0 发出,但仍使用 DNS-over-TLS?

编辑以回答所问的问题 - 我重新使用静态 resolv.conf,因为这是我可以确定流量会通过 VPN 的唯一方法,但如上所述,DNS 请求将从端口 53 发出,而不是端口 853。考虑到这一点,这是 resolvectl status 的输出:

Global
       Protocols: -LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: foreign
     DNS Servers: 9.9.9.9 149.112.112.112 1.1.1.1 1.0.0.1

Link 2 (enp0s10)
Current Scopes: DNS
     Protocols: +DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
   DNS Servers: 192.168.1.1
    DNS Domain: localdomain

Link 3 (tun0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported

Link 4 (wlp5s0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported

这是 ip a 的输出(MAC地址已被删除):

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp0s10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.120/24 metric 100 brd 192.168.1.255 scope global dynamic enp0s10
       valid_lft 6592sec preferred_lft 6592sec
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none
    inet 10.12.216.2/24 scope global tun0
       valid_lft forever preferred_lft forever
4: wlp5s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

我不确定 netplan 或 systemd,但我假设是 netplan,因为有一个文件 /etc/netplan/00-installer-config.yaml 包含以下内容:

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s10:
      dhcp4: true
  version: 2

但是请记住我所说的关于将 resolv.conf 制作成静态文件的内容。

VPN 是 OpenVPN,它连接到远程位置的 OpenVPN 服务器。为了使其正常工作,我必须在每次启动时运行此命令:

/usr/sbin/openvpn --client --config /etc/openvpn/client/xBuQqzYnLLTezXRvrOofMBGgYAEgcY.ovpn

出于安全原因,我并不想发布整个 .ovpn 文件,而且我也不确定它是否有用,但这里是对顶部进行了一些删节:

client
dev tun
proto udp
remote (redacted)
nobind
remote-cert-tls server
tls-version-min 1.2
verify-x509-name (redacted)
cipher AES-256-CBC
auth SHA256
auth-nocache
askpass (redacted)
verb 3
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
redirect-gateway
dhcp-option DNS 10.12.216.2

之后是各种密钥和证书。

我真的不认为问题出在 .ovpn 配置中,我认为如果你使用默认的符号链接 resolv.conf,它会首先尝试访问路由器 (192.168.1.1)。如果你想知道该版本的 resolv.conf 是什么样子,它是

nameserver 127.0.0.53
options edns0 trust-ad
search localdomain

我相信这是所有 Ubuntu 版本的默认设置。现在我不确定 127.0.0.53 到底是什么,我猜它是某种本地 DNS 服务器,或者可能是代理服务器之类的,但我所知道的是,它首先尝试路由器的 DNS 服务器,而这正是我不希望发生的事情。

关于 use-vc 选项,出于某种原因,当我阅读详细信息时,我看到了 TCP 并读到了 TLS,所以这解释了为什么它不起作用。TCP 和 TLS 不是一回事,但是当你对某件事进行了足够长时间的研究而没有结果时,像这样的细微区别就会开始变得模糊!

答案1

~.看来您已经找到了解决问题的方法,即在配置文件中添加全局域路由/etc/systemd/resolved.conf。虽然这似乎有效,但我觉得这种方法有局限性,因为您只能影响此文件中全局 DNS 设置的更改,而不能影响特定链接的更改。但有一种方法可以通过 D-Bus 接口绕过这个障碍。

D-Bus 是一个进程间通信系统,允许将消息发送到各种服务。在这种情况下,您希望与systemd-已解决更改单个链接上的 DNS 设置,而不仅仅是使用文件全局更改 DNS 设置/etc/systemd/resolved.conf。有几种方法可以与 D-Bus 通信,从低级 D-Bus API 到高级绑定。但这可能会有点复杂,所以我们将利用一个辅助脚本来设置您的 openvpn,以使事情尽可能简单。在此脚本中,命令busctl用于与 D-Bus 通信并更改单个链接上的设置。此时这更多的是信息而不是有用,因为您不会busctl直接与之交互。但这并不是说您将来不能或不会这样做。

可以这么说,全局域路由~.是控制 DNS 查询默认路由的关键。它基本上意味着,所有未在任何其他链接上明确列出的域的 DNS 查询都将被路由到与全局域路由设置为的链接相关联的 DNS 服务器。这听起来有点拗口,但希望随着我们的继续,这会变得更有意义。

我还想提一下,编辑单个链接而不是定义全局 DNS 设置的优点是,它将在未来为诸如拆分 DNS 之类的情况提供更大的灵活性。我不会在这里详细介绍,但可以在以下链接中找到有关拆分 DNS 以及路由域和搜索域的解释:

无论如何,我觉得我下面概述的方法可能更符合预期用途systemd-已解决比我之前的答案更合适。因此,这是我的首选答案,也是我配置系统的方式。

让我们开始吧...


设置/etc/resolv.conf

确保/etc/resolv.conf是指向的符号链接/run/systemd/resolve/stub-resolv.conf。这是 Ubuntu 22.04 中的默认设置。即使使用了 127.0.0.53 处的本地解析器,它仍会向任何上游 DNS 服务器查询其缓存中没有的记录。它应该如下所示:

$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Apr 22 23:47 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

如果/etc/resolv.conf是静态文件或除 之外的任何内容的符号链接 /run/systemd/resolve/stub-resolv.conf,请执行以下操作:

$ sudo rm /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

设置/etc/systemd/resolved.conf

接下来,不要在 中设置任何全局 DNS 服务器/etc/systemd/resolved.conf。稍后我们会在其他地方为您的 VPN 隧道设置特定的 DNS 服务器。

关于设置DNS-over-TLS,您可以全局设置它们,也可以针对任何特定链接进行设置。对于此设置,我们将全局设置它们,/etc/systemd/resolved.conf以便它影响所有链接上的所有服务器。此外,让我们将其设置为opportunistic而不是,yes这样无论服务器是否支持,它都会成功DNS-over-TLS如果你想强制执行DNS-over-TLS如果不支持则会失败,然后将其更改为yes

编辑/etc/systemd/resolved.conf如下:

#DNS=
#FallbackDNS=
#Domains=
#DNSSEC=no
DNSOverTLS=opportunistic
#MulticastDNS=no
#LLMNR=no
#Cache=no-negative
#CacheFromLocalhost=no
#DNSStubListener=yes
#DNSStubListenerExtra=
#ReadEtcHosts=yes
#ResolveUnicastSingleLabel=no  

                       

设置 openvpn

使用 openvpn 时,通常会将 DNS 服务器推送到客户端,但系统不会自动配置为使用它们。这是因为不同操作系统上的过程略有不同。在 Ubuntu 中,openvpn 安装通常会提供一个辅助脚本来实现 DNS 服务器通过隧道重定向查询,从而防止 DNS 泄漏。这就是我将在开头提到的辅助脚本。

这是你的当前配置.ovpn文件:

client
dev tun
proto udp
remote (redacted)
nobind
remote-cert-tls server
tls-version-min 1.2
verify-x509-name (redacted)
cipher AES-256-CBC
auth SHA256
auth-nocache
askpass (redacted)
verb 3
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
redirect-gateway
dhcp-option DNS 10.12.216.2

看看你的.ovpn文件:

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

本节定义了一个名为 的辅助脚本,update-resolv-conf该脚本在 VPN 连接up和时运行down。在脚本中,应用程序调用/sbin/resolvconf。但这在 Ubuntu 22.04 的默认安装中会失败,因为/sbin/resolvconf未安装。这是因为您的系统正在运行systemd和用途systemd-已解决

/sbin/resolvconf是一个用于直接管理和修改配置文件的框架/etc/resolv.conf,但此文件的使用方式与以前不同。(您现在知道,它是 的符号链接/run/systemd/resolve/stub-resolv.conf。)不用说,您需要一个不同的辅助脚本,名为 ,update-systemd-resolved用于busctl访问 D-Bus 接口。

使用以下命令安装帮助脚本:

sudo apt install openvpn-systemd-resolved

这会将脚本放入/etc/openvpn

安装此脚本后,修改您的.ovpn文件并将前面的行替换为以下内容:

script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .

您需要重新启动系统才能使其生效,但首先查看当前输出resolvectl

在进行任何更改之前.ovpn

$ resolvectl
Global
       Protocols: -LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
     DNS Servers:

Link 2 (enp0s10)
Current Scopes: DNS
     Protocols: +DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
   DNS Servers: 192.168.1.1
    DNS Domain: localdomain

Link 3 (tun0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported

Link 4 (wlp5s0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported

重新启动系统并resolvectl再次运行。请注意以下变化:

  • 加上dhcp-option DOMAIN-ROUTE .你的.ovpn文件,全局路由域~.已添加到Link 3 (tun0)
  • -DefaultRoute协议已更改+DefaultRouteLink 3 (tun0)
  • DNS 服务器10.12.216.2已添加到Link 3 (tun0)。这是因为在您的.ovpn文件中,包含该行dhcp-option DNS 10.12.216.2。(可能还会列出Link 3 (tun0)从 VPN 服务器推送给您的其他 DNS 服务器。)

修改后.ovpn

$ resolvectl
Global
       Protocols: -LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
     DNS Servers:

Link 2 (enp0s10)
Current Scopes: DNS
     Protocols: +DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
   DNS Servers: 192.168.1.1
    DNS Domain: localdomain

Link 3 (tun0)
Current Scopes: none
     Protocols: +DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 10.12.216.2
       DNS Servers: 10.12.216.2
        DNS Domain: ~. 
        
Link 4 (wlp5s0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported    

此时,隧道将用作10.12.216.2所有域查询的默认 DNS 服务器。但如果您想使用最初列出的 DNS 服务器——而且只有他们——9.9.9.9然后149.112.112.112您需要执行以下操作:

  • 忽略您的 VPN 服务器推送给您的任何 DNS 服务器。
  • 具体列出您的.ovpn您想要使用的文件。
  • 忽略您.ovpn文件

所有这些都可以通过将以下内容添加到您的.ovpn文件:

pull-filter ignore "dhcp-option DNS"
dhcp-option DNS 9.9.9.9
dhcp-option DNS 149.112.112.112

不要忘记删除或注释掉dhcp-option DNS 10.12.216.2当前.ovpn文件。

更改后,您的.ovpn文件应如下所示:

client
dev tun
proto udp
remote (redacted)
nobind
remote-cert-tls server
tls-version-min 1.2
verify-x509-name (redacted)
cipher AES-256-CBC
auth SHA256
auth-nocache
askpass (redacted)
verb 3
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .
redirect-gateway
pull-filter ignore "dhcp-option DNS"
dhcp-option DNS 9.9.9.9
dhcp-option DNS 149.112.112.112

重启并运行resolvectl。您的 DNS 服务器已添加到Link 3 (tun0)。您的.ovpn文件或从您的 VPN 服务器推送给您的文件现在已经消失了。

$ resolvectl
Global
       Protocols: -LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
     DNS Servers:

Link 2 (enp0s10)
Current Scopes: DNS
     Protocols: +DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
   DNS Servers: 192.168.1.1
    DNS Domain: localdomain

Link 3 (tun0)
Current Scopes: none
     Protocols: +DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 9.9.9.9
       DNS Servers: 9.9.9.9 149.112.112.112
        DNS Domain: ~.
        
Link 4 (wlp5s0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported

结论

您的系统设置如下,~.设置为的全局路由域Link 3 (tun0)表示,所有未在其他链接上明确列出的域的 DNS 查询都将路由到 列出的 DNS 服务器Link 3 (tun0)。例如,如果您将~example.com设置为路由域Link 2 (enp0s10),那么以 结尾的域的任何 DNS 查询example.com都将路由到 的本地 DNS 服务器192.168.1.1。所有其他查询都将发送到 列出的 DNS 服务器Link 3 (tun0)

如您所见,这是高度可定制的。如果您将来还想配置另一个 VPN(企业或私人),并通过该路由进行特定 DNS 查询,那么您可以这样做。


额外的

最后,我之前提到过,安装的帮助脚本通过 D-Bus 对系统进行更改,具体来说是使用命令busctl。您可以随意检查脚本并查看手册页busctl 这里

不过,一个更易于使用的接口,也是您熟悉的命令是resolvectl,它是 D-Bus 接口的薄包装器。请查看以下示例:

设置全局路由域tun0

sudo resolvectl domain tun0 ~.

清除所有域名tun0

sudo resolvectl domain tun0 ""

设置tun0为默认路由:

sudo resolvectl default-route tun0 yes

定义 DNS 服务器tun0

sudo resolvectl dns tun0 9.9.9.9

清除 DNS 服务器tun0

sudo resolvectl dns tun0 ""

设置 DNS-over-TLS 为tun0

sudo resolvectl dnsovertls tun0 yes

使用这些命令以及未显示的更多命令,您可以更改单个链接的设置。很酷的是,更改是即时的。无需重新启动或重启服务,因此这是一种有趣的游戏和实验方式。不幸的是,这些更改在重新启动后将无法继续,因此这就是为什么上面使用的帮助脚本很有用。如果没有它,您必须自己编写。

要了解有关使用更改每个链接的 DNS 设置的更多信息resolvectl,请查看手册页这里。同时,以下是相关部分:

dns [LINK [SERVER...]], domain [LINK [DOMAIN...]], default-route
[LINK [BOOL...]], llmnr [LINK [MODE]], mdns [LINK [MODE]], dnssec
[LINK [MODE]], dnsovertls [LINK [MODE]], nta [LINK [DOMAIN...]]
    Get/set per-interface DNS configuration. These commands may
    be used to configure various DNS settings for network
    interfaces. These commands may be used to inform
    systemd-resolved or systemd-networkd about per-interface DNS
    configuration determined through external means. The dns
    command expects IPv4 or IPv6 address specifications of DNS
    servers to use. Each address can optionally take a port
    number separated with ":", a network interface name or index
    separated with "%", and a Server Name Indication (SNI)
    separated with "#". When IPv6 address is specified with a
    port number, then the address must be in the square brackets.
    That is, the acceptable full formats are
    "111.222.333.444:9953%ifname#example.com" for IPv4 and
    "[1111:2222::3333]:9953%ifname#example.com" for IPv6. The
    domain command expects valid DNS domains, possibly prefixed
    with "~", and configures a per-interface search or route-only
    domain. The default-route command expects a boolean
    parameter, and configures whether the link may be used as
    default route for DNS lookups, i.e. if it is suitable for
    lookups on domains no other link explicitly is configured
    for. The llmnr, mdns, dnssec and dnsovertls commands may be
    used to configure the per-interface LLMNR, MulticastDNS,
    DNSSEC and DNSOverTLS settings. Finally, nta command may be
    used to configure additional per-interface DNSSEC NTA
    domains.

    Commands dns, domain and nta can take a single empty string
    argument to clear their respective value lists.

    For details about these settings, their possible values and
    their effect, see the corresponding settings in
    systemd.network(5).

答案2

好吧,在尝试了包括其他答案中提出的建议在内的一系列方法之后,实际上暂时看起来有效的是:

/etc/systemd/resolved.conf 中添加了以下行:

Domains=~.
DNS=9.9.9.9 149.112.112.112
FallbackDNS=1.1.1.1 1.0.0.1
DNSOverTLS=yes
DNSSEC=allow-downgrade

使用默认的 resolv.conf,默认情况下,该配置文件符号链接到

../run/systemd/resolve/stub-resolv.conf

使用默认的 netplan(无 dhcp4-overrides 添加!)

现在,如果我运行,sudo tcpdump -ni enp0s10 -p port 53 or port 853则看不到任何输出,而如果我运行,sudo tcpdump -ni tun0 -p port 53 or port 853则会看到 DNS 请求从端口 853 发出。不过,奇怪的是,如果我停止 tcpdump 然后重新启动它,它有时不会显示任何内容,但 DNS 请求似乎仍然有效。重新启动可以解决该问题,但我不确定为什么会发生这种情况。

如果我跑步resolvectl status我会看到这个:

Global
           Protocols: -LLMNR -mDNS +DNSOverTLS DNSSEC=allow-downgrade/supported
    resolv.conf mode: stub
  Current DNS Server: 9.9.9.9
         DNS Servers: 9.9.9.9 149.112.112.112
Fallback DNS Servers: 1.1.1.1 1.0.0.1
          DNS Domain: ~.

Link 2 (enp0s10)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=allow-downgrade/supported
Current DNS Server: 192.168.1.1
       DNS Servers: 192.168.1.1
        DNS Domain: localdomain

Link 3 (tun0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=allow-downgrade/supported

Link 4 (wlp5s0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=allow-downgrade/supported

我怀疑是Domains=~./etc/systemd/resolved.conf 中的文件造成了差异。页面位于https://www.internetsociety.org/blog/2018/12/dns-privacy-in-linux-systemd/是我找到的地方,它的解释如下:

最后,将“Domains”设置为“~。”指示“systemd-resolved”优先选择指定的名称服务器,而不是任何可用的每链接 DNS 服务器。这是一个重要的设置,否则非 DoT 每链接 DNS 解析器可能会优先于 DoT 解析器。

说实话,我并不完全理解这一点,但在实践中,它似乎可以防止 DNS-over-TLS 请求首先发送到我的路由器。这是一个无稽之谈,我看到了这一点,觉得值得一试,而且它似乎有效。

话虽如此,让它工作真的不应该这么难!我花了很多时间尝试让它工作,只是因为它今晚对我有用,我不能保证它对其他人也有效,特别是如果你运行的是 Ubuntu 22.04 服务器以外的任何东西!

感谢所有提出建议的人!特别是,我认为修改 /etc/netplan/00-installer-config.yaml 的方法应该有效,但是当我添加“dhcp4-overrides:”和“use-dns: false”行时,我根本没有 DNS,不得不重新启动才能恢复!

答案3

这是一个建议,而不是答案,因为我没有可以测试它的设置,但我认为它太长了,无法容纳在评论中。

  1. 取消使用静态文件替换 resolv.conf。这将通过 systemd-resolved 提供的存根解析器路由所有 DNS 查询。
  2. 配置 systemd-resolved 以使用 DNS-over-TLS。[https://medium.com/@jawadalkassim/enable-dns-over-tls-in-linux-using-systemd-b03e44448c1c] 有一些说明对我来说看起来不错,而且我看到你一开始就是这样做的。
  3. 阻止 dhcp 在配置连接时添加路由器提供的 DNS 服务器。在 netplan 文件中执行此操作并运行netplan try以启用它。
网络:
  版本:2
  以太网:
    enp0s10:
      dhcp4: true
      dhcp4-覆盖:
        使用 DNS:false

思考完成所有这些操作后,本地计算机上的 DNS 请求将发送到 中的本地存根解析器systemd-resolvedsystemd-resolved将使用 DNS over TLS 转发到配置的 DNS 服务器。假设 VPN 设置将默认路由更改为 tun0,则它不应经过 enp0s10。

答案4

更新

这不再是我喜欢的答案。我添加了另一个答案这里


要实现这个功能需要几个步骤。

  1. 更改符号链接/etc/resolv.conf
  2. /etc/systemd/resolved.conf使用新的 DNS 服务器进行配置并启用DNS-over-TLS
  3. 配置 Netplan 以不使用通过 DHCP 推送的 DNS 服务器

1. 更改符号链接/etc/resolv.conf

Ubuntu 22.04 的默认设置是使用位于 的本地存根 DNS 缓存服务器127.0.0.53。在此默认状态下,/etc/resolv.conf是指向 的符号链接/run/systemd/resolve/stub-resolv.conf。但有四种不同的处理模式/etc/resolv.conf。因此配置具有灵活性。

  • 模式 1(存根):使用存根解析器搜索域,使用/etc/resolv.conf指向的符号链接/run/systemd/resolve/stub-resolv.conf

  • 模式 2(静态):使用存根解析器,无需使用/etc/resolv.conf指向的符号链接搜索域/usr/lib/systemd/resolv.conf

  • 模式 3(上行链路):/etc/resolv.conf使用指向的符号链接使用上行 DNS 名称服务器/run/systemd/resolve/resolv.conf

  • 方式四(国外):/etc/resolv.conf 通过直接编辑来使用静态 DNS 名称服务器

请参阅手册页systemd-已解决

/ETC/RESOLV.CONF         top

       Four modes of handling /etc/resolv.conf (see resolv.conf(5)) are
       supported:

       •   systemd-resolved maintains the
           /run/systemd/resolve/stub-resolv.conf file for compatibility
           with traditional Linux programs. This file lists the
           127.0.0.53 DNS stub (see above) as the only DNS server. It
           also contains a list of search domains that are in use by
           systemd-resolved. The list of search domains is always kept
           up-to-date. Note that /run/systemd/resolve/stub-resolv.conf
           should not be used directly by applications, but only through
           a symlink from /etc/resolv.conf. This file may be symlinked
           from /etc/resolv.conf in order to connect all local clients
           that bypass local DNS APIs to systemd-resolved with correct
           search domains settings. This mode of operation is
           recommended.

       •   A static file /usr/lib/systemd/resolv.conf is provided that
           lists the 127.0.0.53 DNS stub (see above) as only DNS server.
           This file may be symlinked from /etc/resolv.conf in order to
           connect all local clients that bypass local DNS APIs to
           systemd-resolved. This file does not contain any search
           domains.

       •   systemd-resolved maintains the
           /run/systemd/resolve/resolv.conf file for compatibility with
           traditional Linux programs. This file may be symlinked from
           /etc/resolv.conf and is always kept up-to-date, containing
           information about all known DNS servers. Note the file
           format's limitations: it does not know a concept of
           per-interface DNS servers and hence only contains system-wide
           DNS server definitions. Note that
           /run/systemd/resolve/resolv.conf should not be used directly
           by applications, but only through a symlink from
           /etc/resolv.conf. If this mode of operation is used local
           clients that bypass any local DNS API will also bypass
           systemd-resolved and will talk directly to the known DNS
           servers.

       •   Alternatively, /etc/resolv.conf may be managed by other
           packages, in which case systemd-resolved will read it for DNS
           configuration data. In this mode of operation
           systemd-resolved is consumer rather than provider of this
           configuration file.

       Note that the selected mode of operation for this file is
       detected fully automatically, depending on whether
       /etc/resolv.conf is a symlink to /run/systemd/resolve/resolv.conf
       or lists 127.0.0.53 as DNS server.

针对您的具体情况,我们将使用模式 3(上行链路)通过创建指向的符号链接:/run/systemd/resolve/resolv.conf。这是因为此文件会自动使用 Netplan 和 中定义的 DNS 服务器进行更新/etc/systemd/resolv.conf,我们接下来将对其进行编辑。

但在编辑之前/etc/systemd/resolv.conf,如果您运行cat /etc/resolv.conf,您会看到它当前将定义通过 DHCP 推送给您的 DNS 服务器:

$ cat /run/systemd/resolve/resolv.conf
# This is /run/systemd/resolve/resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
#
# This file might be symlinked as /etc/resolv.conf. If you're looking at
# /etc/resolv.conf and seeing this text, you have followed the symlink.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs should typically not access this file directly, but only
# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a
# different way, replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 192.168.1.1
search .

2.配置resolved.conf

接下来,/etc/systemd/resolved.conf需要配置您选择的新 DNS 服务器。您还需要允许DNS-over-TLS。因此编辑/etc/systemd/resolved.conf以包含以下内容:

DNS=9.9.9.9 149.112.112.112 1.1.1.1 1.0.0.1
DNSOverTLS=yes

之后sudo systemctl restart systemd-resolved,再看一下/etc/resolv.conf,您现在知道它指向/run/systemd/resolv/resolv.conf(注释已删除):

    $ cat /etc/resolv.conf
    
    nameserver 9.9.9.9
    nameserver 149.112.112.112
    nameserver 1.1.1.1
    # Too many DNS servers configured, the following entries may be ignored.
    nameserver 1.0.0.1
    nameserver 192.168.1.1

    search .

您会注意到,它现在包括两者中定义的 DNS 服务器/etc/systemd/resolved.conf以及通过 DHCP 推送给您的内容。

请注意,根据手册页已解析的配置文件

DNS requests are sent to one of the listed DNS servers
in parallel to suitable per-link DNS servers acquired
from systemd-networkd.service(8) or set at runtime by
external applications.

因此,您现在需要禁用 DNS 名称服务器enp0s10。接下来是 Netplan。

3.配置Netplan

根据手册页网络计划,因为你正在使用 Ubuntu Server,它使用systemd-networkd并不是网络管理器,您可以覆盖默认的 DHCP 行为:

dhcp4-overrides (mapping)
              (networkd backend only) Overrides default DHCP behavior;  see  the  DHCP  Overrides
              section below.

看看DHCP 覆盖部分,您不必通过设置来使用推送给您的 DNS 服务器use-dns: false

       ``use-dns`` (bool)
       :    Default: ``true``. When ``true``, the DNS servers received from the
            DHCP server will be used and take precedence over any statically
            configured ones. Currently only has an effect on the ``networkd``
            backend.

因此,编辑您的yamlconfig 文件,/etc/netplan/00-installer-config.yaml并添加以下内容:

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s10:
      dhcp4: true
      dhcp4-overrides:
        use-dns: false
  version: 2

重新启动 Netplan sudo netplan try:。

重新启动 systemd-resolved:sudo systemctl restart systemd-resolved

然后查看/etc/resolv.conf(评论已删除)。您的本地上行链路名称服务器不再存在。

    $ cat /etc/resolv.conf

    nameserver 9.9.9.9
    nameserver 149.112.112.112
    nameserver 1.1.1.1
    # Too many DNS servers configured, the following entries may be ignored.
    nameserver 1.0.0.1

    search .

如果你运行resolvectl status,你应该看到你的 DNS 服务器在全球的,但没有链接 2 (enp0s10)

Global
       Protocols: -LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: uplink
     DNS Servers: 9.9.9.9 149.112.112.112 1.1.1.1 1.0.0.1

Link 2 (enp0s10)
Current Scopes: DNS
     Protocols: +DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported
    DNS Domain: localdomain

Link 3 (tun0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported

Link 4 (wlp5s0)
Current Scopes: none
     Protocols: -DefaultRoute +LLMNR -mDNS +DNSOverTLS DNSSEC=no/unsupported

请注意:resolv.conf 模式上行链路,因为 /etc/resolve.conf是 的符号链接/run/systemd/resolv/resolv.conf。此模式定义会根据文件 /etc/resolv.conf指向的内容或它是否为标准文件而自动更改。

最后,如果您使用 进行 DNS 查询dig +tls google.com,您应该会看到正在使用您定义的名称服务器之一,而不是存根解析器或本地上行链路服务器。如果一切顺利,它应该使用DNS-over-TLS通过您的 VPN。

相关内容