Ubuntu 15.10 和 dns=dnsmasq 在 /etc/NetworkManager/NetworkManager.conf 中被注释掉
在我连接到 VPN 之前 /etc/resolv.conf 包含
nameserver 2xx.xx.xx.xx <-- ISP DNS 1
nameserver 2xx.xx.xx.xx <-- ISP DNS 2
VPN 连接后 /etc/resolv.conf 包含
nameserver 1xx.xx.xx.xx <-- VPN DNS 1
nameserver 1xx.xx.xx.xx <-- VPN DNS 2
nameserver 2xx.xx.xx.xx <-- ISP DNS 1
常规有线连接和 VPN 在网络管理器中设置了自动 DNS 服务器(仅地址)。 ISP 服务器根本不应该在那里。我还能改变什么? (删除 dns=dnsmasq 是停止分割 DNS 的一项更改)。
答案1
NetworkManager 可以:
自我更新
resolv.conf
;委托给
resolvconf
(针对NetworkManager
接口);或使用
netconfig
.
来自每个接口的不同配置被简单地聚合(参见 参考资料update_dns()
)。
如果你这样做不是使用 NetworkManager 作为 VPN,您可以使用openresolv
独占模式 ( -x
),以便用NetworkManager
VPN 中的名称服务器覆盖名称服务器,而不是添加它们。这可以用这个来完成(丑陋)脚本(OpenVPN 挂钩):
#!/bin/sh
# Dump all foreign options (coming from environment variables foreign_option_N) to stdout
foreign_options() {
local i
i=1
while true; do
local varname=foreign_option_$i
local value="$(eval echo \$$varname)"
if [ -z "$value" ]; then
return
fi
echo $value
i=$((i+1))
done
}
#Create a resolv.conf file from OpenVPN environment variables
create_resolvconf() {
foreign_options | grep "^dhcp-option DNS " | sed "s/^dhcp-option DNS /nameserver /"
}
route_up() {
create_resolvconf | resolvconf -x -a $dev
}
down() {
resolvconf -d $dev
}
case "$script_type" in
route-up) route_up "$@" ;;
down) down "$@" ;;
esac
您应该能够使用以下命令将其改编为 NetworkManager 调度程序脚本(请参阅 man 8 NetworkManager):
VPN_IP4_NAMESERVERS
VPN_IP6_NAMESERVERS
我没有测试它,但类似这样的事情应该可以解决问题:
#!/bin/sh
create_resolvconf() {
for ip in $VPN_IP4_NAMESERVERS $VPN_IP6_NAMESERVERS; do
echo "nameserver $ip"
done
}
up() {
create_resolvconf | resolvconf -x -a $VPN_IP_IFAC
}
down() {
resolvconf -d $VPN_IP_IFAC
}
if [ -z "$VPN_IP_IFACE" ]; then
return 0
fi
case "$2" in
up) up ;;
down) down ;;
esac