Un point d'accès WiFi en Suisse
Connaissez vous NordVPN? Mais plus important encore, connaissez vous Cookie?
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?
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.
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.
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
Petite description de ces règles:
Installer avec ansible
Notes
- Désactiver wpa_supplicant pour une seule interface dans le cas où l'on a 2 interfaces réseau sans fil
- Driver rtl8192eu pour raspberry nécessaire pour la carte TL-WN822N.