OpenVPN 和 systemd-resolved:DNS 无法解析 VPN 内部名称

OpenVPN 和 systemd-resolved:DNS 无法解析 VPN 内部名称

我使用 OpenVPN 在一些虚拟机上设置了 VPN。其中一个虚拟机正在运行 dnsmasq,为网络内部提供基本 DNS。我的客户端正在运行 Ubuntu,现在或多或少强制使用 systemd-resolved。我发现,尽管它声称已配置 DNS,但我实际上无法在 VPN 内执行 nslookup 或挖掘主机名。我可以通过 IP ping 它们,但不能通过名称 ping 它们。

让我们深入了解配置文件。

OpenVPN 服务器配置:

mode server
local 192.168.50.101
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ssl/ca.pem
cert /etc/openvpn/server/ssl/cert.pem
key /etc/openvpn/server/ssl/key.pem
dh /etc/openvpn/server/ssl/dh2048.pem
topology subnet
server 10.99.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.10.0.0 255.255.255.0"
push "dhcp-option DNS 10.99.0.1"
keepalive 10 120
cipher AES-128-CBC   # AES
comp-lzo
push "comp-lzo yes"
user openvpn
group openvpn
persist-key
persist-tun
status openvpn-status.log
log-append  openvpn.log
verb 6
mute 20

客户端配置:

client
dev tun
proto udp
remote 192.168.50.101 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca REDACTED
cert REDACTED
key REDACTED
remote-cert-tls server
cipher AES-128-CBC
comp-lzo
verb 3
mute 20
ping-restart 30
script-security 2
setenv PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre

我已经安装https://github.com/jonathanio/update-systemd-resolvedSwitching to DNS server 10.99.0.1 for interface tun0.,这似乎是推荐的做法。事实上,它确实更新了 DNS 设置,如 systemd-resolved 日志 ( ) 和--status输出所示:

Link 26 (tun0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.99.0.1

/etc/resolve.conf指向 127.0.0.53,这是使用 systemd-resolved 的默认设置。

我尝试使用 NetworkManager 的内置 OpenVPN 连接,但它既不能修复 DNS 问题,甚至不能正确设置路由(所以我甚至无法 ping 或通过 IP 连接)。

人们可能会问的其他一些事情如下:

  • 对于使用 Viscosity 的 Mac 电脑的同事来说,此设置是有效的。只有 Ubuntu/Linux 在客户端上出现故障。
  • OpenVPN 服务器上的防火墙允许端口 53,我可以使用 telnet 进行验证。
  • 如果我将其设置/etc/resolv.conf为指向我的 VPN 的 DNS 服务器(在 10.99.0.1 上),那么 DNS 解析就可以正常工作。但是,resolv.conf 由 systemd-resolved 或 NetworkManager 通过 resolvconf 进行管理,如果可能的话,我希望保留它们,以免破坏 Ubuntu 的秩序。

答案1

首先,从控制台测试连接:

sudo openvpn --verb 1 --config /path_to_conf/config.ovpn

如果出现此错误:

/etc/resolvconf/update.d/libc:警告:/etc/resolv.conf 不是 /run/resolvconf/resolv.conf 的符号链接

然后修复/etc/resolvconf/update.d/libc

DYNAMICRSLVCNFFILE="/run/resolvconf/resolv.conf"

#DYNAMICRSLVCNFFILE="/run/resolvconf/resolv.conf"
DYNAMICRSLVCNFFILE="/run/systemd/resolve/resolv.conf"

第二,向 openvpn 服务器配置添加选项。

push "dhcp-option DOMAIN YOUR_DOMAIN_NAME"

更新。DNS 请求仅通过 VPN。搜索 UUID vpn 连接

nmcli c show

nmcli c modify <UUID vpn connection> ipv4.dns-priority -1

执行此命令后重新连接 vpn。现在所有 dns 请求都转到 vpn

答案2

我设法通过update-systemd-resolved在 Ubuntu 上安装软件包来解决这个问题(你没有提到你使用的是什么操作系统,我相信其他发行版中也有等效的软件包)。并将其添加到 openvpn 客户端配置文件中:

up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved

当我使用上述设置进行连接时,我在 openvpn 日志中看到以下内容:

Wed Feb 24 13:13:20 2021 /sbin/ip link set dev tun0 up mtu 1500
Wed Feb 24 13:13:20 2021 /sbin/ip addr add dev tun0 10.6.200.2/24 broadcast 10.6.200.255
Wed Feb 24 13:13:20 2021 /etc/openvpn/update-systemd-resolved tun0 1500 1553 10.6.200.2 255.255.255.0 init
<14>Feb 24 13:13:20 update-systemd-resolved: Link 'tun0' coming up
<14>Feb 24 13:13:20 update-systemd-resolved: Adding IPv4 DNS Server 10.6.0.9
<14>Feb 24 13:13:20 update-systemd-resolved: Setting DNS Domain example.com
<14>Feb 24 13:13:20 update-systemd-resolved: Setting DNS Domain example.com
<14>Feb 24 13:13:20 update-systemd-resolved: SetLinkDNS(15 1 2 4 10 6 0 9)
<14>Feb 24 13:13:20 update-systemd-resolved: SetLinkDomains(15 1 example.com false)

运行resolvectl显示我正在为tun0链接使用正确的 DNS 服务器和 DNS 域。

该脚本的来源是https://salsa.debian.org/debian/openvpn-systemd-resolved/-/blob/master/update-systemd-resolved

相关内容