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には、Network Managerに自動DNSサーバー(アドレスのみ)が設定されています。 ISP サーバーがまったく存在してはいけません。また何を変えることができますか? (dns = dnsmasqを削除するとDNS分割が停止します。)

答え1

NetworkManagerは次のことができます。

  • resolv.conf自己更新

  • resolvconfNetworkManagerインターフェース用)に委任する。

  • またはを使用してください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

関連情報