web-dev-qa-db-fra.com

NetworkManager ne modifie pas /etc/resolv.conf après push openvpn dns

J'ai un problème qui est "NetworkManager ne met pas à jour /etc/resolv.conf après connexion openvpn avec DNS push configuré ".

Voici ma configuration de serveur openvpn: ( J'ai changé le nom de domaine en ABC.COM pour des raisons de sécurité;) )

########################################
# Sample OpenVPN config file for
# 2.0-style multi-client udp server
#
# Adapted from http://openvpn.sourceforge.net/20notes.html
#
# tun-style tunnel

port 1194
dev tun

# Use "local" to set the source address on multi-homed hosts
#local [IP address]

# TLS parms
tls-server 
ca keys/ca.crt
cert keys/static.crt
key keys/static.key
dh keys/dh1024.pem
proto tcp-server

# Tell OpenVPN to be a multi-client udp server
mode server

# The server's virtual endpoints
ifconfig 10.8.0.1 10.8.0.2

# Pool of /30 subnets to be allocated to clients.
# When a client connects, an --ifconfig command
# will be automatically generated and pushed back to
# the client.
ifconfig-pool 10.8.0.4 10.8.0.255

# Push route to client to bind it to our local
# virtual endpoint.
Push "route 10.8.0.1 255.255.255.255"

Push "dhcp-option DNS 10.8.0.1"

# Push any routes the client needs to get in
# to the local network.
#Push "route 192.168.0.0 255.255.255.0"

# Push DHCP options to Windows clients.
Push "dhcp-option DOMAIN ABC.COM"
#Push "dhcp-option DNS 192.168.0.1"
#Push "dhcp-option WINS 192.168.0.1"

# Client should attempt reconnection on link
# failure.
keepalive 10 60

# Delete client instances after some period
# of inactivity.
inactive 600

# Route the --ifconfig pool range into the
# OpenVPN server.
route 10.8.0.0 255.255.255.0

# The server doesn't need privileges
user openvpn
group openvpn

# Keep TUN devices and keys open across restarts.
persist-tun
persist-key

verb 4

Comme vous pouvez le voir, c'est une configuration d'échantillon basique avec peu de réglage.

Maintenant..

Sur ma machine (client openvpn), je peux voir que le DNS est ok:

{17:12}/etc/NetworkManager ➭ nslookup git.ABC.COM 10.8.0.1
Server:     10.8.0.1
Address:    10.8.0.1#53

Name:   git.ABC.COM
Address: 10.8.0.1

{17:18}/etc/NetworkManager ➭ nslookup ABC.COM 10.8.0.1   
Server:     10.8.0.1
Address:    10.8.0.1#53

Name:   ABC.COM
Address: 18X.XX.XX.71

les journaux openvpn côté serveur indiquent (si je comprends bien) que DNS a été poussé:

openvpn[13257]: TCPv4_SERVER link remote: [AF_INET]83.30.135.214:37658
openvpn[13257]: 83.30.135.214:37658 TLS: Initial packet from [AF_INET]83.30.135.214:37658, sid=3251df51 915772f3
openvpn[13257]: 83.30.135.214:37658 VERIFY OK: depth=1, C=XX, ST=XX, L=XXX, O=XXX, OU=XXX, CN=XXX, name=XXX, [email protected]
openvpn[13257]: 83.30.135.214:37658 VERIFY OK: depth=0, C=XX, ST=XX, L=XXX, O=XXX, OU=XXX, CN=XXX, name=XXX, [email protected]
openvpn[13257]: 83.30.135.214:37658 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
openvpn[13257]: 83.30.135.214:37658 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
openvpn[13257]: 83.30.135.214:37658 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
openvpn[13257]: 83.30.135.214:37658 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
openvpn[13257]: 83.30.135.214:37658 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
openvpn[13257]: 83.30.135.214:37658 [jacek] Peer Connection Initiated with [AF_INET]83.30.135.214:37658
openvpn[13257]: jacek/83.30.135.214:37658 MULTI_sva: pool returned IPv4=10.8.0.10, IPv6=(Not enabled)
openvpn[13257]: jacek/83.30.135.214:37658 MULTI: Learn: 10.8.0.10 -> jacek/83.30.135.214:37658
openvpn[13257]: jacek/83.30.135.214:37658 MULTI: primary virtual IP for jacek/83.30.135.214:37658: 10.8.0.10
openvpn[13257]: jacek/83.30.135.214:37658 Push: Received control message: 'Push_REQUEST'
openvpn[13257]: jacek/83.30.135.214:37658 send_Push_reply(): safe_cap=940
openvpn[13257]: jacek/83.30.135.214:37658 SENT CONTROL [jacek]: 'Push_REPLY,route 10.8.0.1 255.255.255.255,dhcp-option DNS 10.8.0.1,dhcp-option DOMAIN ABC.COM,ping 10,ping-restart 60,ifconfig 10.8.0.10 10.8.0.9' (status=1)

journaux openvp de mon côté:

Aug 05 17:13:55 localhost.localdomain openvpn[1198]: TCPv4_CLIENT link remote: [AF_INET]XXX.XX.37.71:1194
Aug 05 17:13:55 localhost.localdomain openvpn[1198]: TLS: Initial packet from [AF_INET]XXX.XX.37.71:1194, sid=89cc981c d57dd826
Aug 05 17:13:56 localhost.localdomain openvpn[1198]: VERIFY OK: depth=1, C=XX, ST=XX, L=XXX, O=XXX, OU=XXX, CN=XXX, name=XXX, [email protected]
Aug 05 17:13:56 localhost.localdomain openvpn[1198]: VERIFY OK: depth=0, C=XX, ST=XX, L=XXX, O=XXX, OU=XXX, CN=XXX, name=XXX, [email protected]
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Aug 05 17:13:58 localhost.localdomain openvpn[1198]: [static] Peer Connection Initiated with [AF_INET]XXX.XX.37.71:1194
Aug 05 17:14:00 localhost.localdomain openvpn[1198]: SENT CONTROL [static]: 'Push_REQUEST' (status=1)
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: Push: Received control message: 'Push_REPLY,route 10.8.0.1 255.255.255.255,dhcp-option DNS 10.8.0.1,dhcp-option DOMAIN ABC.COM,ping 10,ping-restart 60,ifconfig 10.8.0.10 10.8.0.9'
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: OPTIONS IMPORT: timers and/or timeouts modified
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: OPTIONS IMPORT: --ifconfig/up options modified
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: OPTIONS IMPORT: route options modified
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: ROUTE_GATEWAY 10.123.123.1/255.255.255.0 IFACE=wlan0 HWADDR=44:6d:57:32:81:2e
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: TUN/TAP device tun0 opened
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: TUN/TAP TX queue length set to 100
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: /usr/sbin/ip link set dev tun0 up mtu 1500
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: /usr/sbin/ip addr add dev tun0 local 10.8.0.10 peer 10.8.0.9
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: /usr/sbin/ip route add 10.8.0.1/32 via 10.8.0.9
Aug 05 17:14:01 localhost.localdomain openvpn[1198]: Initialization Sequence Completed

On dirait que tout va bien.

Mais. J'ai vérifié /var/log/messages aussi ... et j'ai trouvé cette ligne:

Aug  5 17:14:01 localhost NetworkManager[761]: <warn> /sys/devices/virtual/net/tun0: couldn't determine device driver; ignoring...

ip a Retour:

5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none 
    inet 10.8.0.10 peer 10.8.0.9/32 scope global tun0
       valid_lft forever preferred_lft forever

route -n Retour:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.123.123.1    0.0.0.0         UG    0      0        0 wlan0
10.8.0.1        10.8.0.9        255.255.255.255 UGH   0      0        0 tun0
10.8.0.9        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.123.123.0    0.0.0.0         255.255.255.0   U     0      0        0 wlan0

Donc, fondamentalement, tout fonctionne, sauf que le DNS est poussé ... Oh! D'accord, et mon /etc/resolv.conf:

# Generated by NetworkManager
domain home
search home
nameserver 10.123.123.1

Où est le problème?

(J'ai une réponse de l'utilisateur Windows avec le client openvpn, que de son côté le DNS fonctionne bien, donc c'est un problème de mon côté.

Ok maintenant j'ai une autre réponse (après avoir redémarré le service openvpn côté serveur) - cela ne fonctionne pas.

Je dois dire que cela a fonctionné hier sur ma machine aussi .. alors ai-je foiré quelque chose sur le serveur? Qu'est ce que ça pourrait être? )

Edit: D'accord, j'ai une autre réponse de l'utilisateur Windows (le même utilisateur qu'avant) - cela fonctionne maintenant. Donc .. je suppose que cela a été causé par le redémarrage d'Openvpn et quelques retards. Je n'ai rien fait depuis. Nous sommes donc de retour sur ma machine.

J'ai également découvert que ce bizarre tun0 un message est également apparu hier, et hier, cela a fonctionné. Ou j'ai peut-être ajouté une entrée à resolv.conf tout seul? Je ne me souviens pas .. (bon sang)

24
jaor

Cela fonctionne pour moi: http://www.softwarepassion.com/solving-dns-problems-with-openvpn-on-ubuntu-box/

L'étape importante consiste à ajouter les deux lignes de configuration suivantes dans votre client fichier de configuration openvpn:

up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

Assurez-vous également que le package resolvconf est installé sur le client, car ce update-resolv-conf le script en dépend.

Il fonctionne avec le service client ou la commande openvpn pour le démarrer manuellement.

Cependant, Ubuntu Network Manager ne le fait pas. C'est un problème jusqu'à présent: https://bugs.launchpad.net/ubuntu/+source/openvpn/+bug/121111

24
Wenbing Li

Fonctionne pour moi après avoir désactivé le propre dnsmasq de NetworkManager.

Éditer /etc/NetworkManager/NetworkManager.conf

 #dns=dnsmasq

et redémarrez NetworkManager

Sudo restart network-manager
12
Segavax

Fonctionne enfin (avec NetworkManager standard et le plugin OVPN)

nmcli -p connection modify MY_VPN_CONNECTION ipv4.never-default no
nmcli -p connection modify MY_VPN_CONNECTION ipv4.ignore-auto-dns no
nmcli -p connection modify MY_VPN_CONNECTION ipv4.dns-priority -42

Dans ce cas, une fois la connexion VPN établie, toutes les demandes DNS sont dirigées vers des serveurs DNS fournis par VPN sans aucune manipulation avec dnsmasq, des scripts d'aide de montée/descente/répartition.

2
Alter

Il est possible de pousser les paramètres DNS dans OpenVPN. Comme vous l'avez dans votre configuration, cela se fait dans la configuration du serveur avec la ligne suivante:

Push "dhcp-option DNS 10.20.30.40"

Cela fonctionne hors de la porte pour moi en utilisant l'interface graphique Windows, mais il a besoin d'un peu de coup de pouce pour les systèmes Linux. Pour me connecter à mon réseau domestique (en utilisant actuellement Fedora 18), j'ai utilisé un script de gronke sur GitHub ( https://github.com/gronke/OpenVPN-linux-Push ) pour automatiser la mise à jour processus.

Pour utiliser ces scripts, j'ai ajouté ce qui suit à mon fichier client OpenVPN:

up /home/gadgeteering/tools/vpn/up.sh
down /home/gadgeteering/tools/vpn/down.sh

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

down.sh:

#! /bin/bash
DEV=$1
CACHE_NAMESERVER="/tmp/openvpn/$DEV.nameserver"
echo $CACHE_NAMESERVER

if [ -f $CACHE_NAMESERVER ]; then
for ns in `cat $CACHE_NAMESERVER`; do
echo "Removing $ns from /etc/resolv.conf"
cat /etc/resolv.conf | grep -v "nameserver $ns" > /tmp/resolv.conf
mv /tmp/resolv.conf /etc/resolv.conf

done
fi
1
Gadgeteering

Il est possible de faire fonctionner NetworkManager en remplaçant manuellement /etc/resolv.conf. Gardez à l'esprit qu'il s'agit d'un hack et ne peut être considéré comme une solution valable pour chaque situation.

#!/bin/bash
case "$2" in
    vpn-up)
    tmp=$(mktemp)
    func=$(mktemp)
    echo 'ping -c 1 -w 1 -q $1 > /dev/null ;
          if [ 0 -eq $? ]; then echo $1; fi' > $func
    grep -v "^#" /etc/resolv.conf > $tmp
    grep -rl type=vpn /etc/NetworkManager/system-connections \
        | xargs -n 1 sed -rne 's|dns=||p' \
        | sed -re 's|;|\n|g' \
        | grep -v "^\s*$" \
        | xargs -n 1 bash $func \
        | sed -re "s|(.*)|nameserver \1|" \
        | cat - $tmp \
        > /etc/resolv.conf
    rm -f $tmp $func;;
    vpn-down) resolvconf -u;;
esac

Ce script doit être placé sous /etc/NetworkManager/dispatcher.d; devrait être exécutable et détenu par root. Il lit toutes les configurations vpn de NetworkManager qu'il peut trouver et réécrit /etc/resolv.conf avec des serveurs de noms accessibles qui s'y trouvent. Il n'écrit pas les lignes domain et search; mais cela permet d'oublier le méchant bug de NetworkManager.

J'utilise Ubuntu 16.04, cela fonctionne.

1
Sergey Fedorov

im fonctionnant sur linux ubuntu 18.04 et j'ai eu le même problème. Les scripts dans les sections haut et bas ne fonctionnent pour moi que si j'exécute le script openvpn dans la ligne de commande, mais dans mon cas, j'exécute Openvpn avec l'interface graphique de Network Manager. Pour résoudre le problème, je crée une règle dans le système udev pour exécuter un script qui modifie mes serveurs de noms DNS et mes balises de domaine et de recherche.

Pour accomplir les tâches, j'utilise le nom "exa" pour nommer l'interface comme exemple. Vous utilisez certainement le nom que vous voulez; veuillez prendre soin du nom dans toutes les sections des tâches et remplacer dans toutes les parties.

1- changez d'abord l'ordre du mot "dns" dans /etc/nsswitch.conf pour la ligne qui commence par les hôtes:

vieux:

hosts:          files mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns myhostname

nouveau:

hosts:          files mdns4_minimal dns [NOTFOUND=return] resolve [!UNAVAIL=return] myhostname

2- Ensuite, créez un script bash dans /usr/local/bin/add_dns.sh et mettez les privilèges au maximum (777):

#!/bin/bash

sleep 5

mv /etc/resolv.conf /etc/resolv.conf.old
echo "nameserver 10.10.10.10" > /etc/resolv.conf
echo "nameserver 10.10.11.10" >> /etc/resolv.conf
echo "search domain.example.com" >> /etc/resolv.conf
echo "domain domain.example.com" >> /etc/resolv.conf

3- créer une règle dans udev, /etc/udev/rules.d/74-exa-vpn.rules:

ACTION=="add", SUBSYSTEM=="net", ENV{INTERFACE}=="exa", RUN+="/usr/local/bin/add_dns.sh"

4- rechargez la configuration udev avec:

$ udevadm control --reload

5- Accédez à l'interface graphique du gestionnaire de réseau et allez ensuite à la configuration du profil VPN. Ensuite, allez dans l'onglet "identité" -> "Avancé": dans l'option "définir le type de périphérique virutal TUN et le nom", mettez le nom "exa" et enregistrez tout.

La bonne chose est que lorsque je déconnecte le VPN, le gestionnaire de réseau remplace le fichier créé par le script udev et remplace l'original.

0
Matias Moglia

OpenVPN n'est actuellement pas en mesure de pousser les paramètres DNS. Vous devrez modifier manuellement /etc/resolv.conf pour correspondre à votre serveur DNS (sécurisé). Je viens d'exécuter un service BIND9 sur la même machine que mon serveur d'accès et de le pointer via tunnel. Utilisez votre adresse IP locale de cette machine, par exemple 192.168.1.110

Bonne chance!

Jaspe

0
Jasper

J'ai un client OpenSUSE qui n'utilise pas resolvconf, ni systemd-networkd, mais j'ai pu modifier le nom courant update-resolv-conf script pour fonctionner avec la commande nmcli de NetworkManager:

#!/usr/bin/env bash
#
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Example envs set from openvpn:
# foreign_option_1='dhcp-option DNS 193.43.27.132'
# foreign_option_2='dhcp-option DNS 193.43.27.133'
# foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
# foreign_option_4='dhcp-option DOMAIN-SEARCH bnc.local'

case $script_type in

up)
    for optionname in ${!foreign_option_*} ; do
        option="${!optionname}"
        echo $option
        part1=$(echo "$option" | cut -d " " -f 1)
        if [ "$part1" == "dhcp-option" ] ; then
            part2=$(echo "$option" | cut -d " " -f 2)
            part3=$(echo "$option" | cut -d " " -f 3)
            if [ "$part2" == "DNS" ] ; then
                IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"
            fi
            if [[ "$part2" == "DOMAIN" || "$part2" == "DOMAIN-SEARCH" ]] ; then
                IF_DNS_SEARCH="$IF_DNS_SEARCH $part3"
            fi
        fi
    done
    if [ -n "$IF_DNS_SEARCH" ]; then
        nmcli connection modify "${dev}" ipv4.dns-search "$IF_DNS_SEARCH"
    fi
    if [ -n "$IF_DNS_NAMESERVERS" ]; then
        nmcli connection modify "${dev}" ipv4.dns "$IF_DNS_NAMESERVERS"
    fi
    nmcli connection up "${dev}" # Force NM to reevaluate the properties
    ;;
esac

# Workaround / [email protected] 
# force exit with no errors. Due to an apparent conflict with the Network Manager
# $RESOLVCONF sometimes exits with error code 6 even though it has performed the
# action correctly and OpenVPN shuts down.
exit 0

Il ne possède pas de gestionnaire down car NetworkManager supprime automatiquement les paramètres nameserver et search (recherche DNS) à la fin de la connexion.

0
palswim