Héberger son serveur VPN furtif

Trucs et astuces

Héberger son serveur VPN furtif

Ce post trucs et astuces devient extrêmement technique mais la première partie est générale, vous pouvez vous rendre à la partie tutoriel directement et sauter l’introduction en cliquant ici.

 

Comme pour beaucoup de droits qui nous sont acquis, l’habitude fait qu’on ne réalise notre chance de les avoir. Pour peu qu’on soit nés avec, on ne s’imagine peut être même pas qu’on puisse s’en passer. Dans ce post il s’agit de l’internet libre.

De nombreux pays ne voient pas d’un bon oeil le simple fait de pouvoir communiquer librement sur internet. La censure et la propagande peuvent être une raison, la peur des mouvements sociaux une autre. Il est donc courant en tant que voyageur de se retrouver gêné dans son utilisation habituelle de l’internet. Certains pays comme la Chine bloquent tous les services de google, ce qui signifie plus d’accès à ses email pour beaucoup. Certains pays comme la Turquie bloquent l’accès à wikipédia, ressource fréquemment consultée. Et de nombreux pays bloquent certains ou tous les réseaux sociaux : en Iran pas de facebook et impossible d’utiliser whatsapp, canaux souvent utiles pour donner des nouvelles. D’autres pays disposent de ces systèmes de censure mais ne l’activent qu’à certaines occasions, donc ce n’est pas parce que whatsapp marche en arrivant que vous n’avez pas besoin de VPN, il peut très bien être bloqué plus tard (cela nous est arrivés au Tadjikistan, lors de la libération d’un journaliste connu Facebook a été bloqué quelques jours pour éviter qu’une manifestation ne s’organise).

La solution à ce problème consiste à faire passer son trafic internet par un serveur localisé dans un autre pays. Le principe est simple, toutes les requêtes que vous envoyez sont en réalité envoyées vers un serveur qui a accès à un internet libre, et qui vous sert de relai. Ce système s’appelle un VPN, ou réseau privé virtuel. Vous avez peut être aussi entendu parler de proxy, c’est similaire mais un VPN établit une connexion sécurisée et c’est ce qui va nous intéresser ici.

 

En fonction du niveau de paranoïa, de richesse, et d’avancées technologiques du pays, les systèmes sont plus ou moins avancés technologiquement. On pourrait classifier les systèmes de censure en plusieurs “niveaux”:

  1. Simple censure (Turquie, Azerbaïjan)
  2. Censure, port VPN bloqué (par exemple dans le bateau Athènes-Chios, ou certains WiFi)
  3. Censure, port et trafic VPN bloqué (Chine, Iran)
  4. Répression policière absolue avec fouille des téléphones régulière

(Notez qu’en plus de ces niveaux techniques l’utilisation d’un VPN peut être ou non légale, avec des conséquences plus ou moins lourdes.)

Pour éviter le niveau 1, en tant que touriste vous pouvez prendre le “risque” d’utiliser un VPN pour accéder normalement à internet. Vous vous en doutez, les personnes qui prennent vraiment un risque sont plutôt les activistes et journalistes du pays en question qui ont besoin de ces outils pour faire leur travail librement…

Pour éviter le niveau 2, il faut que votre VPN utilise un port non standard.

Pour éviter le niveau 3, il faut un système de VPN un peu plus complexe, qui va dissimuler l’apparence de son trafic afin de ne pas être détecté en tant que connexion de type VPN.

Pour atteindre le niveau 4 il vous faudra voyager au Xinjiang, ce n’est pas une expérience que l’on vous recommande. Pour éviter le niveau 4, si vous lisez ces lignes il vous suffit de ne jamais retourner en Chine si vous êtes du Xinjiang, si non, normalement, on en viendra pas à ça, hein ?

 

Si vous n’avez que faire des données liées à votre historique de navigation vous pouvez utiliser un VPN gratuit sur votre téléphone tel que TurboVPN, qui fonctionne même en Chine (enfin, sauf si vous n’avez pas de chance, mais la plupart des cyclos s’en servent). Vous pouvez aussi payer pour un service qui fait ça bien, comme tunnelbear.

Dans cet article j’explique pas à pas comment mettre en place un VPN sur son serveur personnel, ainsi que la manière de s’en servir sur un appareil windows, linux ou android. Si vous suivez ce tutoriel jusqu’au bout vous pourrez éviter les systèmes de censure de niveau 3 dans la liste ci dessus, c’est à dire que le VPN fonctionnera même en Chine et en Iran par exemple. Vous pouvez aussi zapper les dernières étapes si vous n’avez affaire qu’au niveau 1 ou 2 de censure.

C’est ici que cet article devient technique. Voila. Si vous ne cherchez pas à installer votre propre serveur VPN, vous pouvez vous arrêter de lire 🙂

Tutoriel : héberger son serveur VPN furtif

Prérequis

Pour pallier au niveau 2 de censure

  • Un serveur privé (ubuntu/debian) sur lequel vous avez les droits administrateur
  • Un minimum de connaissance en administration système
  • De la patience

Pour pallier au niveau 3 de censure

  • Un petit fétiche pour les fichiers de configuration apache

Pour pallier au niveau 4 de censure

  • 7 euros si vous voulez naviguer avec votre téléphone android
  • Les imprévus sont plus probables ici, il faudra vous dépatouiller

 

Mise en place du serveur OpenVPN (niveau 1)

Dans cette première partie, vous trouverez des instructions très similaires à ce qu’on peut trouver sur d’autres sites web, d’ailleurs je n’ai rien inventé et je ne fait que réunir des infos de nombreuses autres ressources en un seul et même endroit.

# Mise à jour du système, la suite dépend en particulier du packet openSSL qui est souvent mis à jour
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade 

# Installez openVPN et des utilitaires réseau
sudo apt-get install openvpn bridge-utils

# easy-rsa va vous permettre de manager les clés, cette opération copie ses outils dans le dossier de openvpn
sudo cp -r /usr/share/easy-rsa/ /etc/openvpn/
# Cette opération copie une config par défaut
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ && sudo gzip -d /etc/openvpn/server.conf.gz

# Vous pouvez voir le résultat de tout ça
cd /etc/openvpn/easy-rsa/
ls


# Pour la suite, ça se passe dans ce même dossier mais il faut être root
su root
# Charger toutes les variables (attention à l'espace entre . et vars)
. vars
# Retire tous les certificats précédents (normalement il n'y en a pas ?)
./clean-all
# Construit l'autorité de certificats (CA) et sa clé
# Il faut choisir un nom unique pour "Common Name". Le reste peut être laissé vide en entrant "."
./build-ca
# Générer un certificat et une clé privée pour le serveur
# Pour "Common Name" il faut un autre nom unique comme "server".
# Vous pouvez choisir "." quand on vous demande un "challenge password".
./build-key-server server
# Construire les paramètres pour les échanges cryptographiques "Diffie-Hellman" avec le serveur
./build-dh
# Création du pare-feu HMAC
openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key

# A présent on peut ajouter son premier client, ils doivent tous avoir des noms uniques !
# De même vous pouvez laisser le challenge password vierge en tapant "."
./build-key Utilisateur1
# Pour terminer l'ajout d'un utilisateur on doit lui créer un compte unix sur le serveur
# Ce compte est créé sans home et sans accès shell.
sudo useradd Utilisateur1 -M -s /bin/false
sudo passwd Utilisateur1

Vous devrez répéter ces trois dernières opérations pour ajouter d’autres utilisateurs.

Pour que ceux-ci puissent se connecter il doivent récupérer les certificats et leur clé privée, ca.crt, ta.key, utilisateur1.crt, et utilisateur1.key. Le plus simple est de créer ces fichiers vides et d’utiliser cat sur le serveur pour copier leur contenu vers le client.

# Dernière étape côté serveur, il faut activer le forwarding d'IP
# On ouvre le fichier de conf
sudo vim /etc/sysctl.conf
# Décommentez cette ligne :
net.ipv4.ip_forward=1
# Sauvegardez, on applique les changements :
sudo sysctl -p /etc/sysctl.conf
# Configuration du forwarding entre le réseau VPN et le net
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# Cette règle sera effacée à chaque redémarrage, on peut la rendre persistante grâce au paquet suivant :
sudo apt-get install iptables-persistent
# On peut enfin démarrer le service openvpn :
sudo service openvpn start

Bravo ! Le serveur est configuré avec le fichier de configuration par défaut !

Cela signifie que vous avez un serveur VPN fonctionnel qui écoute sur le port 1194.

Si votre utilisateur 1 a récupéré ses clés, il n’a plus qu’à installer OpenVPN sur son appareil, changer la configuration pour indiquer l’IP de votre serveur et ça roule.

Mais tout n’est pas si simple, et les difficultés commencent ici. En voici une petite liste :

  • En l’état, votre pare-feu HMAC ne sert à rien car il n’est pas pris en compte dans la config par défaut
  • Votre serveur écoute en UDP
  • Votre serveur écoute sur le port 1194

En gros, sur un WiFi inconnu vous pouvez vous attendre à ce que les seuls ports ouverts soit les port TCP 80 et 443, qui correspondent au trafic internet HTTP et HTTPS. Le reste sera fermé dans la très grande majorité des cas (sauf par exemple le port 8080 qui nous sera utile plus loin) !

 

Utiliser le port 443 pour son trafic VPN (niveau 2)

La meilleure solution pour éviter que votre connexion à votre VPN n’échoue est de faire en sorte que celui ci fonctionne en TCP sur le port 443. En effet, les fournisseurs de votre WiFi ne peuvent pas bloquer ce port, sinon ils bloqueraient à peu près tous les sites internet…

Si vous possédez un serveur privé, c’est peut-être parce que vous y hébergez un site web, et si vous y hébergez un site web, j’espère bien qu’il est en HTTPS ! Dans ce cas, votre port 443 est déjà bien occupé par le trafic généré par votre site web.

Heureusement, OpenVPN est bien fait et il est capable de partager le port sur lequel il écoute. Cela signifie que c’est OpenVPN qui écoute sur le port 443 et s’il identifie du trafic web, alors il redirige les paquets vers un autre port sur lequel votre serveur apache écoute désormais. Voici un schéma qui explique l’avant et l’après port sharing :

Pour mettre ça en place, il vous faut les bons fichiers de conf pour OpenVPN côté serveur et côté client (cliquez pour télécharger mes fichiers de conf exemples).

Si vous avez ouvert le fichier de conf server vous avez dû voir la ligne “port-share localhost 10443”, cela veut dire que le trafic web intercepté par OpenVPN sera renvoyé sur le port 10443. Il faut donc que votre serveur apache écoute le trafic HTTPS sur ce port !

Il faut donc modifier vos fichiers de confs apache dans le dossier /etc/apache2/ :

  • dans le fichier ports.conf, remplacez 443 par 10443
  • dans /sites-available/, pour le fichier default-ssl.conf et les .conf de chacun de vos sites web HTTPS, changez la ligne <VirtualHost *:443> par <VirtualHost *:10443>.

Et voilà ! Vous pouvez redémarrer les service apache2 et openVPN à présent :

sudo service openvpn restart
sudo service apache2 restart

Vous disposez à présent d’un VPN qui fonctionne en TCP sur le port 443 ! Super boulot !

Le VPN furtif (niveau 3)

Les problèmes ne s’arrêtent pas là malheureusement, en effet une technologie appelée Deep Packet Inspection (DPI) permet de connaître le type de paquet qui circule, et si celui-ci reconnaît des paquets VPN, ils seront bloqués. Seuls quelques pays utilisent cette technologie, d’ailleurs seuls quelques pays sont capables de la mettre en place (comme euh… la Chine ! Ca vous surprend non ?).

Pour éviter ça, il existe plusieurs méthodes. On peut rajouter par dessus tout ça un tunnel crypté, mais cela fait baisser le débit, la solution alternative consiste à obfusquer les paquets. C’est à dire les modifier pour qu’ils ne soient plus suspects. Ce sont nos amis du Tor project qui ont développé cet outil, obfsproxy, car le trafic de type TOR est aussi détectable et bloqué par certains pays. Le résultat ne ralentit que peu le trafic.

La nouvelle situation est un peu plus compliquée, nous allons distinguer ce qu’il se passe côté serveur et côté client.

Côté serveur, vos données sont désormais transmises à un serveur obfsproxy. Celui-ci décrypte à l’aide d’une clé convenue à l’avance vos paquets, il transmet ensuite le paquet à openVPN sur le port de votre choix. Le serveur obfsproxy ne peut pas partager son port, vous devrez donc en trouver un de disponible pour lui tout seul, et qui ne soit pas bloqué. Dans ce tutoriel j’utilise le port 8080.

Côté client, les paquets VPN sont envoyés à un proxy (d’où le nom obfsproxy) qui encrypte à l’aide de la même clé convenue à l’avance, puis, si j’ai bien compris, le paquet revient à openVPN qui l’envoie à votre serveur pour qu’il soit réceptionné par le (obfs)proxy qui tourne sur ce dernier.

Voici un schéma complet de ma compréhension de ce qu’il se passe :

Pour mettre ça en place, il vous faut les bons fichiers de conf pour OpenVPN côté serveur et côté client (cliquez pour télécharger mes fichiers de conf exemples), puis redémarrer le service openvpn.

Si vous aviez modifié vos fichiers de confs apache, ce n’est plus nécessaire et vous pouvez revenir en arrière sur vos modifs (et redémarrer le serveur apache !).

Pour installer obfsproxy vous pouvez simplement faire :

sudo apt-get install obfsproxy

Personnellement j’ai eu quelques difficultés avec openSSL et httplib2 fournis par mon système, qui faisaient échouer l’installation. Voici ce que j’ai fait pour régler ce problème :

# Installer le openSSL de python
sudo python -m easy_install --upgrade pyOpenSSL
# On se débarasse du httplib2 du système
sudo apt-get remove python-httplib2 
#On installe le httplib2 de pip
sudo pip install --upgrade httplib2
# Normalement ce coup ci ça passe
sudo apt-get install obfsproxy

Il ne vous reste plus qu’à lancer une instance de obfsproxy. Le processus ne doit pas s’arrêter (et il faut le relancer si le serveur redémarre !), je vous conseille donc de le lancer dans un screen :

# Créer une instance nommée de screen
screen -S obfsproxy
# Création du proxy d'obfuscation qui écoute sur 8080 et qui envoie sur 1194
sudo obfsproxy --log-file=obfsproxy.log --log-min-severity=info obfs2 --dest=127.0.0.1:1194 --shared-secret=CLE_SECRETE server 0.0.0.0:8080

Pour quitter screen, utilisez la combinaison de touches ctrl+a, puis appuyez sur d.

Côté serveur, on est bons !

 

Pour le côté client cela diffère grandement en fonction de votre OS.

Pour mac et linux, il faut installer puis démarrer une instance de obfsproxy dans un terminal, quelque chose de ce genre là (pas essayé moi même mais ça devrait être correct) :

obfsproxy --log-min-severity=info --log-file=obfsproxy.log obfs2 --shared-secret=CLE_SECRETE socks 127.0.0.1:1080

 

Pour windows, il faut installer anaconda 2, puis créer un fichier .ps1 donc le contenu est :

C:\Users\Surface\Anaconda2\Scripts\obfsproxy.exe --log-min-severity=info --log-file=obfsproxy.log obfs2 --shared-secret=CLE_SECRETE socks 127.0.0.1:1080

Ensuite, cliquez droit sur le fichier ps1 et sélectionnez “Exécuter avec Powershell”. Une fois que c’est démarré, vous pouvez connecter OpenVPN.

 

Pour android, il vous faudra utiliser la version payante de “OpenVPN client”. Je n’ai trouvé aucune alternative gratuite malheureusement ! Si vous connaissez une app open source qui prend en charge obfsproxy, laissez moi un commentaire !

 

Conclusion

Si vous avez suivi ce guide jusqu’au bout, bravo ! A ma connaissance il n’en existe aucun d’équivalent, même en anglais. Le seul que j’ai trouvé est discuté dans ce thread sur Reddit, mais il n’est pas disponible… Je suis très intéressé par les retours de toute personne qui aura réussi à suivre ce tuto jusqu’au bout, afin de l’améliorer et de le clarifier au maximum.

 

Mes sources principales sont :

https://vpntips.com/how-to-setup-a-vpn-server/

https://community.openvpn.net/openvpn/wiki/TrafficObfuscation

 

Remarques sur le choix des ports :

Le port 8080 étant souvent ouvert, vous pouvez l’utiliser pour votre trafic VPN au lieu de vous embêter avec le port-sharing etc. Cela reste utile de savoir comment marche le partage de port avec openVPN, donc j’ai préféré bien décrire cette situation.

Cela peut offrir un autre avantage, avec une seule configuration serveur openVPN sur port 443, vous pouvez vous connecter soit en mode furtif (via obfsproxy sur le port 8080), soit en mode normal (sur le port 443 directement), au cas où le port 8080 soit bloqué ! Le port 443 n’est jamais bloqué, donc pas de risque !

Le schéma complet ressemble alors à ça selon ce que j’ai compris :

Enfin, le port 80 n’est jamais bloqué non plus, si apache n’utilise que le port 443, vous pourriez aussi consacrer ce port au trafic VPN !

Remarque sur l’emplacement de votre serveur :

Au Turkménistan, l’IP de mon serveur français était carrément bloquée, dans ce cas, aucune chance de faire fonctionner votre VPN… Nous avons utilisé tunnelbear pendant notre séjour dans ce pays.

8 COMMENTS
  • Clément
    Reply

    Dur le coup de l’IP bloquée au Turkménistan. Une solution pourrait être de dupliquer un serveur dédié sur des micro instances un peu partout dans le cloud :-/

    Sinon, attention au ‘sudo apt remove python-httplib2’. Si le paquet a été fourni avec la distribution, il a probablement des dépendances au sein de la distribution qui s’attendent à une version précise du paquet, donc risque de conséquences.
    Dans ce cas, une bonne pratique peut être d’installer la dernière version de httplib2 dans un environnement virtuel (avec virtualenv ou mieux encore, pipenv) et de travailler dans cet environnement virtuel.

    La bise

  • Christine
    Reply

    Bon sang! Même sur des sujets où je ne suis pas du tout à la page, je trouve intérêt à vous lire ! Vous m’étonnerez toujours ! 🙂

  • Aline Jordens
    Reply

    Oui! C’est très technique et ça nous parle beaucoup des pays que vous traversez… Vous écrivez toujours aussi bien… Bravo pour ce post extrêmement intéressant… bises ???

  • Ruven
    Reply

    Très intéressant,
    Je n’ai lu pour l’instant que la 1ère partie car je fais partie de “ceux qui ne sont pas nés avec…”.
    Je peux lire la suite ? ? J’ai quand même le droit ?
    Sinon au delà de la censure à quand votre opinion sur ” Internet restera-t-il libre longtemps ?”
    Aller bise et léchouille à vous 3

  • François
    Reply

    Hello !

    Super article.

    Et un proxy socks avec SSH, ca donne quoi ? J’ai toujours en tête le dicton, quand ssh passe, tout passe. J’accorde qu’un proxy socks est moins flexible qu’un vpn, mais ça m’a bien dépanné déjà.

    Pour le programme lancé dans screen, pourquoi ne pas faire un service systemd ? 🙂

    Bonne bidouille.

  • martine
    Reply

    Je n’ai pas compris le mot à mot mais j’en APPRÉCIE le partage et la générosité.

  • Jeremy
    Reply

    Pour le niveau 1 voire 2, je recommande github.com/trailofbits/algo qui permet d’installer simplement un VPN en quelques minutes. J’ai déjà utilisé pour mes séjours dans plusieurs pays, sur un petit VPS loué au jour pour l’occasion.

  • Maître Capello
    Reply

    Joli travail ! :o)

    Juste quelques remarques sur la forme…

    Le verbe “pallier” est transitif, il faut donc écrire: “Pour pallier LE niveau…”

    Remplacer “crypter” et “encrypter”(!) par “CHIFFRER”
    et “décrypter” par “DECHIFFRER”, ce sont les termes exacts, français, utilisés dans l’univers de la sécurité informatique.

Leave a Reply to martine Cancel reply

Your email address will not be published. Required fields are marked *