Connaissez vous NordVPN?

Un point d'accès WiFi en Suisse

technique 9 juin 2022

Connaissez vous NordVPN? Mais plus important encore, connaissez vous Cookie?

1. Maintenant oui (Cookie, petite cavalier king charles de 7 mois)

Vous avez forcément déjà été confronté à l'une de ces centaines de pubs ou de placements de produit visant à vous vendre la nécessité absolue de posséder à un abonnement à un VPN.

Je ne développerai pas ici pourquoi un VPN ne sert à rien pour 99% des usages quotidiens, et surtout, pourquoi le fait qu'une société centralise toutes les communications est dangereux. Je présenterai simplement dans cet article la façon dont j'ai utilisé un raspberry afin de partager via hostapd, et donc la création d'un point d'accès WiFi, un réseau virtuel privé.

Ce point d'accès WiFi me permet de ne pas dépendre de la limite de périphériques connectés à un fournisseur VPN, comme par exemple 6 appareils connectés simultanément chez NordVPN, mais surtout de n'avoir aucune configuration a faire sur les périphériques souhaitant passer sur VPN: pas de client OpenVPN, juste une clef WPA à saisir, et accessible de partout dans son domicile.

Enfin, une fois ce point d'accès configuré, de nombreuses choses peuvent venir s'ajouter à la configuration, comme par exemple PiHole, un serveur DNS permettant d'éliminer la plupart de la publicité sur les sites visités, en répondant NXDOMAIN.

Par quoi on commence?

2. Voici ce que je m'apprête à détailler

A partir d'ici, dans les extraits de commandes, Local signifie sur votre machine locale, et SSH, depuis une session SSH vers votre raspberry.

Open VPN

La première étape va consister à récupérer le fichier ovpn correspondant à notre configuration openvpn client propre à notre fournisseur, puis à changer son extension en .conf. Il est pratique de penser à mettre son nom d'utilisateur/mot de passe de connexion dans un fichier userpass.txt permettant de manipuler des fichier *.conf sans données sensibles. Je suppose pour la suite que votre fichier se nomme monvpn.conf.

Une fois ce ou ces fichiers obtenus, il est maintenant temps de configurer openvpn sur le raspberry. Je vais supposer ici que vous disposez d'un raspberry connecté à votre réseau local avec comme hostname monrb, ainsi qu'un accès SSH à celui-ci.

Local

scp username.txt monvpn.conf monrb:/tmp

SSH

sudo apt install openvpn
mv /tmp/username.txt /tmp/monvpn.conf /etc/openvpn/client
sudo systemctl daemon-reload
sudo systemctl restart openvpn-client@monvpn
sudo systemctl status openvpn-client@monvpn

Vous pouvez noter ici le démon que je démarre, openvpn-client@monvpn. L'idée étant que openvpn-client va aller itérer l'ensemble des fichiers *.conf présents dans /etc/openvpn/client afin de créer tout autant de services. Le fichier de configuration étant nommé monvpn.conf, on démarre donc le vpn en précisant son nom.

Le statut du service doit afficher Running.

3. Le client OpenVPN configuré avec monvpn.conf a démarré et est à l'état Running

Si ce n'est pas le cas, vous pouvez analyser les logs, et tenter de résoudre les problèmes rencontrés au démarrage.

SSH

sudo journalctl -u openvpn-client@monvpn

Une fois cette étape réalisée, nous avons maintenant une nouvelle interface réseau nommée tun0.

Avec cette vérification, nous en avons fini avec la configuration d'OpenVPN. Reste une dernière étape permettant à openvpn de se connecter au démarrage du raspberry:

sudo systemctl enable openvpn-client@monvpn

La commande enable de systemctl permet d'activer le service pour qu'il se lance au démarrage du système.

HostAPD

Nous allons maintenant mettre en place le point d'accès WiFi auquel il faudra se connecter. Pour cela, nous utilisons hostapd, qui est la partie qu'on pourrait qualifier de serveur pour la mise en place de point d'accès WiFi, car c'est celui qui configure la carte WiFi en mode Access Point (AP) et émet les trames beacons servant à détecter l'Access Point, contrairement à wpa_supplicant qui est sa partie client, scannant les trames beacons afin de détecter les points d'accès, et s'y connectant.

Afin de proposer un point d'accès de bonne qualité, il est nécessaire de se munir d'une interface WiFi externe, qui peut prendre plusieurs formes. J'ai, de mon côté, commencé par utiliser une TL-WN722NV2 (version 1, chipset Atheros, introuvable dans le commerce) avec un débit de 150Mb/s que j'ai par la suite réquisitionnée pour une utilisation avec AirCrack. J'utilise maintenant une carte avec un meilleur débit de 300Mb/s, la TL-WN822N (version 5, chipset Realtek).

Il faudra ici se méfier des cartes avec un chipset Intel qui ne supporte plus le mode AP, et qui sont donc à exclure pour ce projet.
4. La carte WiFi externe TL-WN822N que j'utilise

Une fois la carte choisie et connectée, une nouvelle interface réseau, dans mon cas et pour la suite de cet article wlan1, apparait.

Il reste maintenant à installer et configurer hostapd.

SSH

sudo apt install hostapd
sudo nano /etc/hostapd/hostapd.conf

Avec comme configuration

interface=wlan1
driver=nl80211
ssid=LeNomDeVotreReseauWiFi
hw_mode=g
channel=1

ieee80211n=1
wmm_enabled=1

# Filtrage des adresses mac desactive
macaddr_acl=0
#accept_mac_file=/etc/hostapd/accept

auth_algs=1

ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=VotreClefWPAPSK
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

Une fois sauvegardé et fermé, on peut activer le service au démarrage et le lancer avec

sudo systemctl enable hostapd
sudo systemctl restart hostapd

dhcpd

Lorsqu'un client se connecte à notre réseau WiFi, celui-ci va faire une requête DHCP afin de demander une adresse IP, le masque réseau, le/les serveurs DNS à utiliser, ainsi que l'adresse IP de la passerelle, notre raspberry.

Afin de pouvoir répondre à cette demande, nous allons installer un serveur DHCP:

sudo apt install udhcpd
sudo systemctl enable udhcpd
sudo nano /etc/udhcpd.conf

Avec comme configuration

# udhcpd configuration file (/etc/udhcpd.conf)

start          10.0.0.1
end            10.0.0.253

interface      wlan1

option lease   86400
option subnet  255.255.255.0

option router  10.0.0.1
option wins    10.0.0.1

option dns     10.0.0.1

Ici, nous donnons le droit d'utiliser les adresses comprises entre [10.0.0.2,10.0.0.254], car 10.0.0.1 correspond au raspberry, et 10.0.0.255 est l'adresse de broadcast. Nous utilisons l'interface wlan1, et souhaitons délivrer un bail DHCP valable un jour, soit 86400 secondes. Le CIDR est 24, soit 255.255.255.0, permettant de délivrer au maximum 255 adresses. Enfin, la passerelle est le raspberry lui même, et le DNS sera également le raspberry, une fois que nous aurons installé pihole.

iptables

Avec tout ce que nous avons fait jusqu'ici, nous avons sur ce raspberry un client VPN actif, ainsi qu'un point d'accès WiFi délivrant une configuration DHCP à tout client s'y connectant. Reste maintenant à lier hostapd et openvpn-client en faisant suivre les paquets arrivant sur l'interface wlan1 vers l'interface tun0, et inversement, mais également d'empêcher les machines de notre réseau de communiquer entre elle: l'objectif de ce réseau est l'anonymité. Pour cela, nous allons utiliser iptables, permettant de définir des règles IP de filtrage et de NAT, un peu semblable à un pare-feu classique.

*filter
-A INPUT -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #1
-A INPUT -i tun0 -j DROP #2
-A FORWARD -i tun0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT #3
-A FORWARD -i wlan1 -o tun0 -j ACCEPT #4
COMMIT

*nat
-A POSTROUTING -o tun0 -j MASQUERADE #5
COMMIT
5. (Résultat simplifié de iptables-save) Règles iptables à mettre en place

Petite description de ces règles:

Installer avec ansible

n / raspberry hostapd vpn · GitLab
Deploy a hostapd/openvpn-client/udhcpd/pihole stack to share an AP connected to a VPN.

Notes

Mots clés

SOARES Lucas

28 ans, développeur C/Go/Kotlin/C++/Java (quel enfer)/Python