OpenVPN 客户端和系统解决。
当我运行 OpenVPN 客户端时,它将连接并能够正确加载目标资源仅在第一次启动期间,重启后。在所有后续启动中,它仍会以“初始化序列已完成”的方式连接,但不会加载资源。
经过反复试验,我发现这是一个与 DNS 有关的问题。
sudo resolvectl status
===>
# 1st launch
Link 6 (tun0)
Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6 mDNS/IPv4 mDNS/IPv6
Protocols: +DefaultRoute +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 10.1.1.7
DNS Servers: 10.1.1.7
DNS Domain: aaa.xyz
# all other ones
Link 6 (tun0)
Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6 mDNS/IPv4 mDNS/IPv6
Protocols: +DefaultRoute +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
DNS Domain: aaa.xyz
我找到了治疗方法:
sudo systemd-resolve -i tun0 \
--set-dns=10.1.1.7 \
--set-domain=aaa.xyz \
--set-dnssec=off
必须运行每次 OpenVPN 重新启动时。
如何让它自动运行呢?
或者更确切地说 - 为什么会发生这种情况?如何让 OpenVPN 设置正确的 DNS自动地?
为什么它在计算机重新启动后并且仅在第一次时才能正确设置?
答案1
不过,您可以添加一个挂钩来让 OpenVPN 配置 DNS systemd-resolved
。
从https://github.com/jonathanio/update-systemd-resolved,抓取update-systemd-resolved
脚本并将其标记为可执行文件。
$ sudo wget -O /usr/local/bin/update-systemd-resolved \
https://raw.githubusercontent.com/jonathanio/update-systemd-resolved/master/update-systemd-resolved \
&& sudo chmod +x /usr/local/bin/update-systemd-resolved
然后将以下内容添加到您的 OpenVPN 客户端配置中
# /etc/openvpn/client/<your config file>.conf
...
script-security 2
setenv PATH /usr/bin
up /usr/local/bin/update-systemd-resolved
down /usr/local/bin/update-systemd-resolved
down-pre
如果您的 OpenVPN 以非 root 用户身份运行(默认情况下为 true),您需要添加一条允许 OpenVPN 与 DBus 交互的 PolicyKit 规则。
# /etc/polkit-1/rules.d/00-openvpn-resolved.rules
polkit.addRule(function(action, subject) {
if (action.id == 'org.freedesktop.resolve1.set-dns-servers' ||
action.id == 'org.freedesktop.resolve1.set-domains' ||
action.id == 'org.freedesktop.resolve1.set-dnssec') {
if (subject.user == 'openvpn') {
return polkit.Result.YES;
}
}
});
至于为什么您的 OpenVPN 实例在第一次运行时配置 DNS 以及为什么在后续运行中无法配置 DNS,可能有很多不同的原因。需要进行更多调查才能查明真相。