openpyn, surcouche à OpenVPN pour NordVPN

J’ai pris un abonnement NordVPN de 2 ans fin décembre 2017. Il me sert principalement à télécharger et parfois à changer/masquer mon adresse IP réelle pour un besoin ou un autre. J’utilise toujours le même petit script pour contrôler la connexion VPN. J’ai constaté quelques soucis dans mon utilisation.

Des défauts à corriger

Voici l’alias que j’utilisais avant dans ~/.bash_aliases (vous pouvez le mettre directement dans ~/.bashrc).

alias vpn='(sudo openvpn --config $(find /etc/openvpn/ovpn_udp -type f | shuf -n 1) --auth-user-pass ~/.config/nordvpn_auth >/dev/null 2>&1 &); while ! ip a show dev tun0 up >/dev/null 2>&1; do sleep 0.5; done && ~/Scripts/myip.sh'
--config $(find /etc/openvpn/ovpn_udp -type f | shuf -n 1) # Je prends un fichier de config au hasard dans le dossier /etc/openvpn/ovpn_udp
--auth-user-pass ~/.config/nordvpn_auth # J'indique mes identifiants NordVPN dans le fichier ~/.config/nordvpn_auth (chmod 600)
>/dev/null 2>&1 # Je redirige les flux de sortie standard et d'erreur vers /dev/null
while ! ip a show dev tun0 up >/dev/null 2>&1; do sleep 0.5; done # Tant que l'interface tun0 (VPN) n'est pas up, on boucle
&& ~/Scripts/myip.sh # Dès que l'interface tun0 est up (&&) on lance le script myip.sh

Évidemment cet alias est le résultat de choix personnels : 1/ Je lance un fichier de config au hasard (donc je me connecte à un serveur random chez NordVPN) afin d’avoir une IP différente à chaque fois. Dans les faits j’ai bien une IP différente mais je me retrouve souvent avec une bande passante en download minable, je dois donc relancer 3-4 fois le VPN pour arriver à une vitesse de téléchargement convenable 2/ Parfois la connexion VPN ne se faisait pas, j’utilisais alors pko (alias pko='sudo pkill openvpn') pour tuer le VPN puis je relancais vpn. Je n’ai jamais creusé pourquoi (flemme) et puis j’envoie les flux de sortie et d’erreur vers /dev/null 3/ J’aurais pu affiner mon find pour lancer uniquement des connexions VPN us ou uk par exemple (mais ça ne garantit en rien que la vitesse de téléchargement soit correcte)

Le DNS leak (fuite DNS) est un autre gros morceau/problème, OpenVPN laisse fuiter les requêtes DNS. Concrètement votre VPN est up, vous surfez et votre adresse IP est différente de celle de votre domicile. Tout va bien ! Sauf que pour les requêtes DNS, vous interrogez le serveur DNS de votre fournisseur internet. C’est mieux expliqué ici (en Anglais), le schéma suivant me semble explicite (ISP = Internet Service Provider = Fournisseur d’accès à Internet = FAI).

openpyn pour vous servir

Au bout d’un moment le souci 1/ a commencé à me gonfler et je me suis mis en recherche d’une solution (je pensais initialement jeter un œil aux infos proposées par l’API de NordVPN comme la latence). Je suis tombé sur openpyn un petit programme Python3 en GPLv3 qui propose pas mal de choses mais pour NordVPN :

  • Choix automatique du « meilleur » serveur VPN basé sur la latence et l’encombrement du serveur notamment
  • Prévention du DNS leak
  • Création du service systemd si l’on souhaite que la connexion VPN soit lancée dès le démarrage
  • Kill switch (expérimental) afin de stopper toute connexion dès que la connexion VPN tombe pour éviter qu’on découvre notre adresse IP réelle
  • Téléchargement et mises à jour automatique des fichiers de config OpenVPN de NordVPN
  • Possibilité de choisir des serveurs spécifiques chez NordVPN (« Netflix » --netflix, « Peer To Peer » --p2p, « Dedicated IP » --dedicated, « Tor Over VPN » --tor, « Double VPN » --double, « Anti DDos » --anti-ddos)
  • Et d’autres features, précisons qu’il prend en charge les options OpenVPN (-o)

Après un pip3 install openpyn (éventuellement précédé de apt install openvpn unzip wget python3-setuptools python3-pip), on lance un openpyn --init qui va vous demander les identifiants de connexion à NordVPN et votre pays par défaut (si j’ai bien compris pour le service systemd, moi je m’en sers pas donc je m’en fous). Maintenant il suffit juste de openpyn uk pour qu’il se connecte au « meilleur » serveur VPN du Royaume-Uni (United Kingdom) par exemple. Voici la sortie.

openpyn uk
According to NordVPN, Least Busy 10 Servers in UK With 'Load' Less Than 70 Which Support OPENVPN-UDP Are: [['uk464', 4], ['uk477', 4], ['uk862', 4], ['uk563', 5], ['uk569', 5], ['uk842', 5], ['uk859', 5], ['uk322', 6], ['uk441', 6], ['uk562', 6]]

Pinging Server uk464 min/avg/max/mdev = [12, 12, 12, 0] 

Pinging Server uk477 min/avg/max/mdev = [11, 11, 12, 0] 

Pinging Server uk862 min/avg/max/mdev = [11, 11, 11, 0] 

Pinging Server uk563 min/avg/max/mdev = [9, 10, 11, 0] 

Pinging Server uk569 min/avg/max/mdev = [10, 10, 10, 0] 

Pinging Server uk842 min/avg/max/mdev = [10, 11, 13, 1] 

Pinging Server uk859 min/avg/max/mdev = [10, 11, 11, 0] 

Pinging Server uk322 min/avg/max/mdev = [10, 10, 11, 0] 

Pinging Server uk441 min/avg/max/mdev = [10, 10, 11, 0] 

Pinging Server uk562 min/avg/max/mdev = [9, 10, 10, 0] 

Top 10 Servers with Best Ping Are: ['uk563', 'uk569', 'uk322', 'uk441', 'uk562', 'uk477', 'uk862', 'uk859', 'uk842', 'uk464']

Out of the Best Available Servers, Chose uk563

2019-01-12 10:34:26 [SUCCESS] CONNECTING TO SERVER uk563 ON PORT udp
2019-01-12 10:34:26 [SUCCESS] Your OS 'linux' has systemd-resolve running, using it to update DNS Resolver Entries

Les logs openpyn se trouvent dans /var/log/openpyn. Les identifiants de connexion sont stockés dans /usr/local/lib/python3.6/dist-packages/openpyn/credentials.

Quelques tests et vérifications plus tard

Je suis en fibre 100M, j’étais satisfait à partir de 50M une fois la connexion VPN effectuée et mesurée avec mon petit script. Maintenant avec openpyn je tourne régulièrement à 90M, certes le changement d’IP systématique n’est plus d’actualité mais il me suffit de lancer openpyn avec un autre pays si besoin. Concernant le point 2/ (parfois la connexion VPN ne se faisait pas), résolu. Je pense que c’est lié au fait que openpyn relance automatiquement une connexion VPN en cas d’erreurs, il gère également une sorte de failover, si la connexion VPN s’arrête il passe au « meilleur » serveur suivant.

Deux sites de référence pour « vérifier » les fuites DNS et les infos vues par les sites que l’on visite : IPLEAK et DNS leak. Je vous conseille de tester un « avant » openpyn et un « après » pour confirmer que ça fonctionne et comprendre ce qui change. openpyn fait le job, OpenVPN seul non.

Afin d’être plus précis sur le DNS leak d’OpenVPN, il est possible de fixer les fuites DNS mais je résumerais en disant que c’est compliqué sur Linux. L’option block-outside-dns existe mais « Block DNS servers on other network adapters to prevent DNS leaks. This option prevents any application from accessing TCP or UDP port 53 except one inside the tunnel. It uses Windows Filtering Platform (WFP) and works on Windows Vista or later. This option is considered unknown on non-Windows platforms and unsupported on Windows XP, resulting in fatal error ». Beaucoup de solutions sont proposées sur le net, certaines avec iptables, d’autres en modifiant le fichier de config .ovpn, des scripts, utiliser votre propre serveur DNS… bref un peu de boulot à prévoir pour trier les bonnes solutions (et ensuite celles qui sont simples à mettre en œuvre par rapport à nos cas d’utilisation).

Config actuelle et prochaine étape

Mon alias dorénavant est alias vpn='(openpyn uk >/dev/null 2>&1 &); while ! ip a show dev tun0 up >/dev/null 2>&1; do sleep 0.5; done && ~/Scripts/myip.sh'.

Dans la sphère privée (pas pro), je considère que le couple OpenVPN + openpyn + NordVPN est ce qu’il y a de mieux actuellement (pour des usages comme le téléchargement, d’autres problèmatiques comme l’anonymat strict trouveront une solution avec Tor). Je vous rappelle que WireGuard est l’OpenVPN killer (ce que je confirme même si il ne fait pas « autant » de choses) mais qu’il est toujours en Work in Progress. Il devrait être intégré au noyau probablement cette année.

Oh tiens NordVPN bosse sur le support de WireGuard, quelle bonne idée ;)

Tcho les filles !

Déjà 14 avis pertinents dans openpyn, surcouche à OpenVPN pour NordVPN

  • juliortt
    Salut,
    dans la version Linux (en ligne de commade), il est possible d’activer l’option kill-switch.
    La doc est pas mal faite aussi.
  • Aqua
    Bonjour Cascador et merci pour ce nouvel article :).

    Je pense que juliortt parle du client Linux de NordVPN qui est réglable pour supporter Kill Switch.

    Tu m’as convaincu de passer à openpyn. J’avoue que j’utilisais l’application native de NordVPN depuis quelques temps (la flemme de créer – et de maintenir – les connexions avec le gestionnaire de connections réseaux et la possibilité d’activer le kill-switch comme le mentionne juliortt).

    Je viens de tester openpyn, ça fonctionne vraiment bien :).
    Par contre j’ai une question naïve d’utilisateur Linux peu aguerri : quelle commande utilises-tu pour revenir à l’état initial ?
    Par exemple, si je fais : openpyn fr -f –tcp &
    faut-il lancer un openpyn -k (ou un -x je ne fais pas bien la distinction entre les deux…)
    pour revenir à la connexion « par défaut » ?

    Le script te demande t-il aussi de passer root pour « kill ‘openpyn-management’ process » ?

    Merci pour ton aide si tu as le temps et l’envie :) !

  • Aqua
    Merci pour ton retour Cascador !

    Pour tcp c’est simplement que j’ai lu je ne sais plus où qu’il y avait moins de risque de corruption de paquets lors des transmissions qu’en udp et que je n’ai pas constaté de grande différence de débit…
    Merci pour la confirmation -f / -x.

  • Tom
    Perso je ne vois aucun leak DNS avec NordVPN. Bon j’utilise le nouveau client pour Linux qu’ils founissent. C’est peu être çà (?)
    Merci.
  • Hubert
    Bonjour,
    J’ai installé openpyn avec mon abonnement nordvpn sous raspbian en suivant le tuto et avec succès 🙂
    Merci pour ce billet
    Il me reste une difficulté à résoudre.
    Le vpn ferme un port utilisé pour le upload utilisé par transmission.
    Je n’ai pas trouvé comment contourner ce problème.
    Auriez vous une solution ?
  • Hubert
    Il est fort probable que je comprenne mal mon problème.
    J’ai reconfiguré mon vpn directement avec le package nordvpn
    Dans les faits, le problème que je constate est que je n’ai aucun upload sur transmission des que mon vpn est lancé
    La commande lsof me montre bien transmission à l’ecoute du port 51413 avec 3 lignes: tcp en ip4 et ip6 et une ligne udp
    Et dans la configuration du cient web à la rubrique network j’ai « port is closed »
    Si je stoppe le vpn j’ai bien une connexion aux peers et du seed
    coté download tout fonctionne bien avec le vpn

Les commentaires sont fermés.