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 !

Vus : 911
Publié par blog-libre : 132