我正在使用在安装了 DD-WRT 的路由器上运行的 OpenVPN 服务器,并使用它通过 VPN 服务器路由所有流量。我从多个设备连接到它:Windows 笔记本电脑、Android 设备和 Linux 机器。我现在遇到的问题是最近才出现的,以前一切都运行正常。此问题仅发生在使用 Linux(ubuntu 16.04)的客户端计算机上。ubuntu 客户端不会自动获取 DNS 服务器地址。经过一番研究,我发现我应该在客户端配置的末尾添加以下内容:
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
这没有帮助所以我还添加了:
dhcp-option DNS a.b.c.d
dhcp-option DNS e.f.g.h
IP 地址取自路由器,它使一切正常运行。到目前为止,在客户端配置中拥有“redirect-gateway def1”就足够了。
我不喜欢添加“dhcp-option DNS”命令的这种解决方案,因为我必须监视 DNS 服务器的任何变化。有没有办法摆脱添加“dhcp-option DNS”选项?
答案1
我遇到了同样的问题,但设法使用以下技巧解决了它:up /etc/openvpn/update-resolv-conf
我在 /etc/openvpn 中创建了一个名为 up.sh 的文件。运行命令sudo gedit /etc/openvpn/up.sh
并粘贴以下内容:
#! /bin/bash
DEV=$1
if [ ! -d /tmp/openvpn ]; then
mkdir /tmp/openvpn
fi
CACHE_NAMESERVER="/tmp/openvpn/$DEV.nameserver"
echo -n "" > $CACHE_NAMESERVER
dns=dns
for opt in ${!foreign_option_*}
do
eval "dns=\${$opt#dhcp-option DNS }"
if [[ $dns =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]; then
if [ ! -f /etc/resolv.conf.default ]; then
cp /etc/resolv.conf /etc/resolv.conf.default
fi
cat /etc/resolv.conf | grep -v ^# | grep -v ^nameserver > /tmp/resolv.conf
echo "nameserver $dns" >> /tmp/resolv.conf
echo $dns >> $CACHE_NAMESERVER
cat /etc/resolv.conf | grep -v ^# | grep -v "nameserver $dns" | grep nameserver >> /tmp/resolv.conf
mv /tmp/resolv.conf /etc/resolv.conf
fi
done
保存并运行sudo chmod +x /etc/openvpn/up.sh
然后创建另一个文件/etc/openvpn/down.sh
并将以下内容粘贴到其中
#! /bin/bash
echo "Restoring original nameservers"
rm -f /etc/resolv.conf
ln -s /run/resolvconf/resolv.conf /etc/resolv.conf
echo "Done restoring nameservers cheers"
保存并运行sudo chmod +x /etc/openvpn/down.sh
现在删除以下行:
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
并将其替换为:
script-security 2
up /etc/openvpn/up.sh
down /etc/openvpn/down.sh
答案2
编辑 /etc/systemd/resolved.conf - 添加 DNS 条目:
DNS=8.8.8.8 8.8.4.4
如果在建立或断开 OpenVPN 连接时丢失 DNS,请运行:
sudo systemctl restart systemd-resolved
(可能可以将其推送到您的 OpenVPN 连接的上行/下行脚本中)。