Une box VPN à faire vous-même pour surfer en toute sécurité

par Korben -

Hier, j’ai déterré mon vieux routeur Linksys WRT54-GL. Mais si, souvenez-vous, c’est celui où j’avais installé OpenWRT et que j’avais même brické.

Objectif : Installer un client OpenVPN dessus, le coller juste derrière ma box ADSL pour faire transiter par le VPN l’intégralité des appareils de la maison. Ça me permet de sécuriser ma connexion et de profiter de la compression OpenVPN.

Du coup, je vais expliquer comment configurer un client OpenVPN sur un WRT54-GL.

Avant de commencer, vous devez avoir :

Allez, on commence… Etape n°1, installer dd-wrt sur le routeur. Tout est expliqué ici. Ahahaha, oui ce n’est pas compliqué, vous verrez.

Concernant les versions du firmware, il faut d’abord installer une version Mini Generic (dd-wrt.v24_mini_generic.bin) puis ajouter par dessus une version VPN Generic (dd-wrt.v24_vpn_generic.bin). Vous les trouverez ici (cherchez le mot clé 54GL ou la ref de votre routeur).

Alors ce qu’il faut savoir c’est que dans les versions dd-wrt post-2011 de je ne sais plus quel mois, il y a tout ce qu’il faut pour configurer un client OpenVPN digne de ce nom en clickodrome. Malheureusement, la version de ddwrt du vieux WRT54GL date de 2010. Y’a bien un client OpenVPN dedans, mais il ne fonctionne pas correctement, en tout cas pour se connecter à un OpenVPN-AS.

Bref, me voilà avec mon dd-wrt tout frais. Mais la partie est loin d’être gagnée, car j’ai rencontré pas mal de soucis et je vais vous raconter tout ça, pour que justement, vous ne cherchiez pas trop. Concernant la config de DD-WRT, faites en sorte que l’accès au net se fasse bien via le routeur, n’hésitez pas à désactiver le Wifi si vous ne vous en servez pas, et configurez le routeur en mode “routeur” (Héééé oui).

Je ne sais pas si ça a un impact, mais vérifiez que DNSMasq est bien activé.

Dans cette partie VPN, ne cochez rien. Enfin, vous pouvez essayer, peut être que ça marchera directement pour vous, mais en ce qui me concerne, tous mes essais là-dedans n’ont rien donné de concluant.

Non, nous comme on est des punks, on va tout faire en scripts… Ne paniquez pas, c’est super easy !

Pour commencer, il faut que vous récupériez le fichier Autologin de votre compte OpenVPN AS.

Bon, si vous n’avez pas de fichier de conf en autologin, vous pouvez toujours utiliser un fichier de conf (user-locked profile) + un fichier contenant votre login et votre mot de passe que vous passerez en paramètre à OpenVPN avec –auth-user-pass, mais il faudra adapter un peu mon script.

Là où ça devient drôle, c’est qu’on ne peut rien “écrire” sur le routeur. Enfin, si, mais à chaque reboot tout est effacé. C’est moche. Il faut donc générer vos fichiers de conf lors du boot du routeur. Pour ce faire, rendez-vous ici.

Et copiez-collez-y le script suivant :

echo “XXXXXX” > /tmp/myopenvpn.conf (sleep 20 ; ntpclient -h ns3.vedur.is ; sleep 60 ; killall openvpn ; /usr/sbin/openvpn –config /tmp/myopenvpn.conf –daemon ; sleep 60 ; iptables -I FORWARD -i br0 -o tun0 -j ACCEPT ; iptables -I FORWARD -i tun0 -o br0 -j ACCEPT ; iptables -I INPUT -i tun0 -j REJECT ; iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE;)&

Je vous explique tout ça… Vous voyez les XXXXX ? Et bien il faut les remplacer par le contenu de votre fichier ovpn (celui en autologin). Le petit echo est utilisé pour créer le fichier de config ovpn.

Ensuite, on a un enchainement de commandes, toutes très utiles… Après avoir fait mon echo, je lance un petit sleep pour faire une pause de 20 secondes, puis je synchronise la date et l’heure via NTP. Alors pour la petite histoire, j’avais tout bien fait, mais impossible de me connecter en sur mon serveur OpenVPN et j’avais l’erreur suivante :

TLS Error: Unroutable control packet received from…

Après avoir cherché un moment, je me suis rendu compte que c’était parce que la date et l’heure du routeur n’étaient pas la même que la date et l’heure de mon serveur OpenVPN. Mon serveur OpenVPN étant en Islande, il fallait que je synchronise la date de mon routeur sur le fuseau islandais. J’ai bien essayé de le faire directement depuis l’interface de ddwrt, à cet endroit-là (SETUP -> BASIC SETUP):

Mais rien à faire, quand je me connectais via SSH à mon routeur, et que je tapais la commande “date”, j’avais toujours le 1er janvier 1970 (apparemment, la synchro prenait un temps indéterminé). J’ai donc du forcer une synchro NTP dans mon script de commande (ntpclient -h ns3.vedur.is) pour synchroniser correctement la date et l’heure sur un serveur NTP islandais (le même que celui qu’utilise mon serveur. Je le sais grâce à la commande “ntpq -p” qui sort la liste des serveurs NTP utilisés par l’OS) puis je patiente 60 secondes (sleep 60) pour être certain que la date et l’heure sont bien récupérées par le routeur. 60 secondes, c’est surement trop, mais je n’ai pas encore affiné les durées.

Après je shoote tous les openvpn pour être bien sûr qu’aucun ne tourne (killall openvpn) et je lance openvpn en mode daemon en spécifiant le fichier de config myopenvpn.conf qui contient les clés nécessaires à la connexion (/usr/sbin/openvpn –config /tmp/myopenvpn.conf –daemon).

Et j’attends à nouveau 60 secondes pour être certain que la connexion est bien établie. Une fois que c’est fait, votre routeur WRT54GL est bien connecté à l’OpenVPN, mais vos paquets n’y passent pas encore. C’est pourquoi il faut ajouter les 3 règles suivantes dans votre iptables pour que tout soit correctement redirigé via l’interface tun0 du VPN (iptables -I FORWARD -i br0 -o tun0 -j ACCEPT ; iptables -I FORWARD -i tun0 -o br0 -j ACCEPT ; iptables -I INPUT -i tun0 -j REJECT ; iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE;)

Et voilà pour les explications.

En gros, ça devrait ressembler à ça dans votre zone de commande :

Dès que vous êtes satisfait du résultat, cliquez sur le bouton SAVE STARTUP un peu plus bas.

Et redémarrez votre routeur (ADMINISTRATION -> MANAGEMENT -> REBOOT ROUTER).

Ensuite, rendez-vous sur le site whatismyip.com. Vous devriez y voir dans un premier temps votre vraie IP (rien n’est lancé), puis au bout d’une minute, plus d’accès au net (le vpn est actif), puis une minute plus tard vous devriez voir l’adresse IP de votre serveur OpenVPN (les règles iptables sont actives).

Et voilà ! Comme je vous le disais, il faudrait que j’affine la durée des sleep pour que ça prenne moins de temps, mais bon, c’est pas bien grave, car une fois que ça tourne, ça tourne.

Au niveau du débit, évidemment, j’ai perdu un peu (genre 150 Ko/s), mais ça, ça va dépendre fortement de votre VPN. Par contre, je trouvais que les résolutions DNS via VPN mettaient trop de temps. J’ai donc installé un petit serveur unbound pour faire de la résolution DNS en local sur mon serveur islandais et ça va beaucoup mieux.

Une fois Unbound activé, rendez-vous sur l’admin de votre serveur OpenVPN-AS, et dans Configuration -> VPN Settings, mettez 127.0.0.1 en serveur DNS primaire (et un autre si vous voulez, mais c’est pas nécessaire).

Voilà, j’espère que ce petit tuto fait à l’arrache vous inspirera. J’ai utilisé le WRT54-GL parce que c’est ce que j’avais sous la main, mais je pense qu’avec n’importe quel routeur qui supporte dd-wrt, c’est jouable de la même manière. Après c’est pas un modèle dernier cri donc peut mieux faire niveau rapidité mais vu la connexion ADSL pourrie que je me tape, ça suffit largement pour surfer à l’aise.

Bref, amusez-vous bien !

Ps: Cher Monsieur Cazeneuve, si vous désirez consulter l’intégralité de mes communications électroniques, sachez que ma porte est grande ouverte (pas la peine de la défoncer) et que vous ou vos sbires peuvent venir rafler à la maison quand vous le voulez. Je vous donnerais tous les accès dont vous avez besoin pour violer ma vie privée.