我在公司服务器上安装了 OpenVPN 服务器和 Bind9 DNS 服务器。服务器配置部分如下。重要的部分是推送路由和 DHCP DNS 选项。
local 10.0.9.2
port 1194
proto udp
dev tun
topology subnet
server 10.0.12.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.9.0 255.255.255.0"
push "dhcp-option DNS 10.0.9.2"
在 Windows 或 Elementary OS 上连接时,一切都很顺利。只有到服务器的流量通过 VPN,其余流量不通过。如果客户端强制通过 VPN 传输所有流量,互联网访问也会正常进行。在这两种情况下,尝试访问时,git.internal.mycompany.org
它都会从我的 Bind9 DNS 服务器获取 DNS 记录并正确连接。
但这在 Ubuntu 中不起作用。当整个流量通过 VPN 时,会从 DNS 中获取一条记录。但是当只有服务器流量通过 VPN 时,DNS 就无法到达,我无法通过 URL 访问 git 服务器。当通过 IP 访问时,它可以工作。
我也尝试将其添加到客户端配置中。
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
但这没有帮助。可能是因为当我尝试直接运行脚本时,出现了错误/etc/openvpn/update-systemd-resolved: řádek 404: dev: unbound variable
。
我不知道如何解决这个问题。我尝试在 AskUbuntu 和其他网站上搜索,但大多数建议在配置中添加上下限。这对我来说不起作用。这是一个问题,因为我的大多数同事都在使用 Ubuntu。只有少数计算机在使用 Windows 或其他 Linux 发行版。
使用应用的更改进行更新
当应用@heynnema 的更改时,控制台中打印的内容如下https://pastebin.com/DkjHguqE通过终端连接时。此后,ping git.internal.mycompany.org
不起作用。
另一个发现的事实是:
- 当我添加
redirect-gateway def1 bypass-dhcp
到配置中时,我的公共 IP 就是服务器的 IP,但仍然不能ping 上面的 URL。 - 当将配置导入到 Ubuntu 的 UI 中时https://askubuntu.com/a/1188022/972420,ping 一直有效,直到我取消选中
Use this connection only for traffic within this network
。
答案1
看来,主要问题如下systemd-resolve
所述:https://github.com/systemd/systemd/issues/6076
这里有一篇非常棒的文章,我将其作为起点:https://www.gabriel.urdhr.fr/2020/03/17/systemd-revolved-dns-configuration-for-vpn/
对我来说,一个有用的小解决方法是在每次连接到 VPN 后运行此操作。基本上是手动设置 DNS
sudo resolvectl dns tun0 10.0.9.2 # Replace with IP of your DNS server
# All internal services are like git.int.mycompany.com or ldap.int.mycompany.com
# You can try to set up "~mycompany.com", worked for me as well
sudo resolvectl domain tun0 "~int.mycompany.com"
如何实现自动化
使用 NetworkManager:
如果您使用网络管理器(管理器图片可用这里),您可以使用脚本自动执行此操作/etc/NetworkManager/dispatcher.d/
创建自定义脚本,将其命名02-ifupdown
为chmod +x
并粘贴
#!/bin/sh
EXPECTED_VPN_NAME="MyCompany VPN" # Put your VPN name here
VPN_CONN_NAME=`nmcli --get name,type con show --active | grep vpn | sed 's/\:.*//'`
if [ "$2" = "vpn-up" ] && [ "$EXPECTED_VPN_NAME" = "$VPN_CONN_NAME" ]; then
resolvectl dns tun0 10.0.9.2 # Replace with IP of your DNS server
resolvectl domain tun0 "~int.mycompany.com"
fi
使用 CLI:
创建您的自定义脚本,设置chmod +x
它并粘贴到配置中:
script-security 2
up /path/to/my/script
答案2
尝试安装这个包:
sudo apt install resolvconf openvpn-systemd-resolved
答案3
以这种方式更改您的客户端 .ovpn 模式:
由此...
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
对此...
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
答案4
它对我的作用是这样的,一个没有引号的域列表(Ubuntu 20.04)
...
resolvectl domain ${TUN} int.example1.com example2.internal
resolvectl dns ${TUN} 10.127.0.2