Почему мой DNS-провайдер по-прежнему находится в resolv.conf после VPN-подключения и как это можно устранить?

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).

NetworkManager может:

  • обновить сам resolv.conf ;

  • делегировать resolvconf (для интерфейса NetworkManager );

  • или используйте netconfig .

Различные конфигурации, исходящие от каждого интерфейса, просто агрегируются (см. update_dns() ).

Если вы не используете NetworkManager для VPN, вы можете использовать эксклюзивный режим openresolv ( -x ), чтобы переопределить серверы имен из NetworkManager с теми из VPN, а не добавлять их. Это можно сделать с помощью этого (уродливого) скрипта (OpenVPN hook):

 #!/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