为什么 VPN 连接后我的 ISP DNS 仍在 resolv.conf 中?如何解决此问题?

为什么 VPN 连接后我的 ISP DNS 仍在 resolv.conf 中?如何解决此问题?

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),以便用NetworkManagerVPN 中的名称服务器覆盖名称服务器,而不是添加它们。这可以用这个来完成(丑陋)脚本(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

相关内容