NetworkManager ne modifie pas /etc/resolv.conf après la poussée du DNS openvpn

22

J'ai un problème qui est "NetworkManager ne se met pas à jour /etc/resolv.confaprès la connexion openvpn avec le 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.

À présent..

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/messagesaussi ... 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 résultats:

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 résultats:

# 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! À droite, 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 aussi fonctionné hier sur ma machine .. donc 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 tun0message étrange est également apparu hier, et hier, cela a fonctionné. Ou peut-être que j'ai ajouté une entrée resolv.confpar moi-même? Je ne me souviens pas .. (bon sang)

jaor
la source
J'ai vu cela se produire sur des systèmes avec selinux activé et dont le fichier resolv.conf avait le mauvais contexte de sécurité selinux. L'exécution de restorecon pour restaurer le contexte de sécurité sur ce fichier a résolu le problème. PS: c'est resolv.conf, pas
resol.c.cf
Portez une attention particulière à /etc/NetworkManager/NetworkManager.conf: décommenter dns=dnsmasqet avoir managed=true. De plus, vous pouvez être affecté par le bogue n ° 1294899 L'importation d'une connexion VPN enregistrée a été récemment interrompue malgré une connexion VPN "établie". Vérifiez vos paramètres VPN: mettez le nom du protocole ( :tcpou :udp) dans le Gatewaychamp. Vérifiez les paramètres avancés, en particulier Port numberet LZO compression. Vérifiez également les journaux. Terminez avec un test de fuite DNS .
KrisWebDev

Réponses:

23

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 fichier de configuration openvpn client :

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

Assurez-vous également que le resolvconfpackage est installé sur le client, car ce update-resolv-confscript 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/1211110

Wenbing Li
la source
4
N'oubliez pas d'exécuter openvpn avec --script-security 2
kol
2
Ou mettez également script-security 2votre fichier de configuration openvpn client.
KrisWebDev
Je ne recommande pas d'utiliser OpenVPN directement, sans passer par Network-Manager, ou vous pourriez rencontrer le bogue n ° 691723. Le client OpenVPN ignore le DNS qui n'a pas de solution. Dans mon cas, Network Manager a écrasé resolvconf après le uplancement du script ... Un sale # echo "nameserver 208.67.220.220" | /sbin/resolvconf -a "tun0.openvpn"APRÈS avoir exécuté openvpn peut faire le travail ... jusqu'à ce qu'il soit à nouveau écrasé. Encore une fois, n'utilisez pas OpenVPN directement.
KrisWebDev
upcommande non trouvée !!
Pardeep Jain
@KrisWebDev: C'est vrai, mais l'utilisation d'OpenVPN via NetworkManager permet aux utilisateurs de désactiver (activer Off) la connexion que les administrateurs ne souhaitent peut-être pas.
palswim
12

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

modifier /etc/NetworkManager/NetworkManager.conf

 #dns=dnsmasq

et redémarrez NetworkManager

sudo restart network-manager
Segavax
la source
J'ai déjà eu le changement de Bruce Li dans ma configuration client. Cette modification a également résolu le problème [Ubuntu 15.10].
TheDauthi
1
Quel genre de sorcellerie est ce? Que fait dnsmasq?
GuySoft
Cela a fonctionné pour moi dans différentes versions d'Ubuntu. Je ne comprends pas vraiment ce que fait dnsmasq, mais commenter cette ligne de NetworkManager.conf résout comme par magie le problème des connexions VPN ainsi que des connexions Wi-Fi.
Simón
Cela a fonctionné pour moi en exécutant Linux Mint 18, même si j'ai dû redémarrer ma machine car sudo restart network-manager a échoué avec une erreur. La réponse acceptée n'a pas fonctionné pour moi.
trebormf
sur erreur de lancement de la commande restart: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
restarte
2

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.

Modifier
la source
cela fonctionne, 10x
Roman M
1

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 Fedora 18 actuellement), j'ai utilisé un script de gronke sur GitHub ( https://github.com/gronke/OpenVPN-linux-push ) pour automatiser le processus de mise à jour.

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
Gadgeteering
la source
pourquoi tu as besoin dns=dns?
Wang
Ce serait une question pour Gronke, je pense que c'est aussi un peu étrange. Depuis que j'ai écrit mon commentaire, je suis passé à l'utilisation d'une adaptation de ce script qui n'utilise pas du tout la variable 'dns'. Je n'ai observé aucun changement de comportement en raison de l'omission.
Gadgeteering
1

Il est possible de faire fonctionner NetworkManager en le remplaçant manuellement /etc/resolv.conf. Gardez à l'esprit que c'est tout à fait un hack et ne peut pas ê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.confavec les serveurs de noms accessibles qui s'y trouvent. Il n'écrit pas domainet les searchlignes; mais cela permet d'oublier le méchant bug de NetworkManager.

J'utilise Ubuntu 16.04, cela fonctionne.

Sergey Fedorov
la source
0

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

Jaspe
la source
Avec la réponse de Bruce Li, le /etc/resolv.conf est automatiquement modifié
greuze
0

J'ai un client OpenSUSE qui n'utilise pas resolvconf, non plus systemd-networkd, mais j'ai pu modifier le update-resolv-confscript commun pour qu'il fonctionne avec la nmclicommande 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 n'a pas de downgestionnaire car NetworkManager supprime automatiquement les paramètres nameserverand search(recherche DNS) à la fin de la connexion.

palswim
la source