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

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

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à 6 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.

Laisser un commentaire

indique des champs obligatoire.