| Avant de commencer | |||||||||||||||||||||||||||||||||
|
Notez que vous devrez choisir parmis les trois options proposées plus bas sachant qu'elles sont incompatibles entre elles.
|
|||||||||||||||||||||||||||||||||
Fiche technique du Raspberry Pi 3B+ |
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
Prérequis |
|||||||||||||||||||||||||||||||||
|
Un Raspberry Pi 3B+ Une carte microSD (8Go mini, 64Go maxi, 16Go conseillé) La version de Raspberry Pi OS Lite x64 Debian 11 Bullseye qui est disponible ici ou sa dernière version depuis le site officiel Dans tous les cas l'archive est à décompresser avec 7zip |
|||||||||||||||||||||||||||||||||
Conventions |
|||||||||||||||||||||||||||||||||
| Considérons le réseau local configuré comme suit : | |||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
| Le Raspberry sera configuré comme suit : | |||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
Il vous appartient d'adapter ces paramètres à votre environnement. Les clients TOR se connecteront en DHCP à l'interface WiFi du Raspberry. |
|||||||||||||||||||||||||||||||||
Administration |
|||||||||||||||||||||||||||||||||
|
Nous administrerons le serveur à distance et j'utilise pour cela un poste client Microsoft doté du sous-système Windows pour Linux. Vous trouverez ici comment installer Debian sous Windows 10 ainsi que les deux excellents outils que sont Windows Terminal et WinSCP. (passez cette étape si vous préférez utiliser une autre méthode). A savoir : Sur un Raspberry, le nom d'utilisateur par défaut est pi et le mot de passe par défaut est raspberry Le mot de passe devra être orthographié rqspberry si le clavier est reconnu en tant que QWERTY |
|||||||||||||||||||||||||||||||||
| Premier démarrage du Raspberry | |||||||||||||||||||||||||||||||||
|
Formatez la carte microSD avec SD Card Formatter (facultatif) Flashez sur la carte microSD l’image iso raspios-xxxxxx-arm64-lite.img avec Win32DiskImager Insérez la carte microSD et connectez l’alimentation. |
|||||||||||||||||||||||||||||||||
|
Si vous n'obtenez pas d’affichage au démarrage du Raspberry (problème constaté avec certains convertisseurs HDMI/VGA) Insérez la carte microSD dans un lecteur USB, et depuis un PC éditez le fichier /boot/config.txt Décommentez les lignes suivantes en appliquant ces paramètres. |
|||||||||||||||||||||||||||||||||
|
hdmi_force_hotplug=1 hdmi_group=2 hdmi_mode=81 hdmi_drive=2 |
|||||||||||||||||||||||||||||||||
| Configuration du Raspberry | |||||||||||||||||||||||||||||||||
|
Le système Raspberry Pi OS s'installe puis démarre sur un assistant. Configurez le clavier azerty | |||||||||||||||||||||||||||||||||
|
Generic 105-key PC (intl.) -> Other -> French -> The default for the keyboard layout -> No compose key |
|||||||||||||||||||||||||||||||||
|
L'assistant vous demandera ensuite de créer votre compte utilisateur. | |||||||||||||||||||||||||||||||||
|
Configurez les autres options régionales |
|||||||||||||||||||||||||||||||||
|
sudo raspi-config 5 Localisation Options L1 Locale -> fr_FR.UTF-8 UTF-8 -> fr_FR.UTF-8 L2 Timezone -> Europe -> Paris |
|||||||||||||||||||||||||||||||||
Exécutez une à une les commandes suivantes |
|||||||||||||||||||||||||||||||||
|
# changement du mot de passe root sudo passwd root # mise à jour du cache des dépôts sudo apt-get update # mappages IP / noms d’hôtes sudo nano /etc/hosts 127.0.0.1 raspi-gateway 192.168.1.250 raspi-gateway # nom d’hôte de la machine sudo nano /etc/hostname raspi-gateway # configuration TCP/IP sudo nano /etc/dhcpcd.conf interface eth0 static ip_address=192.168.1.250/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 interface wlan0 static ip_address=10.10.10.1/24 nohook wpa_supplicant # application des nouveaux paramètres TCP/IP sudo /etc/init.d/networking restart # activation du protocole SSH sudo systemctl enable ssh # autoriser le compte root à se connecter en SSH sudo nano /etc/ssh/sshd_config PermitRootLogin yes # démarrage du service SSH sudo systemctl start ssh # redémarrage du système sudo reboot |
|||||||||||||||||||||||||||||||||
| Configuration du point d'accès wi-fi | |||||||||||||||||||||||||||||||||
|
Il est plus pratique de poursuivre les opérations depuis un poste client. Initiez une connexion SSH vers le Raspberry |
|||||||||||||||||||||||||||||||||
| ssh <utilisateur>@192.168.1.250 | |||||||||||||||||||||||||||||||||
Paramétrez les services réseau sur l'interface WiFi |
|||||||||||||||||||||||||||||||||
|
# vérifier que wlan0 n'est pas bloqué sudo rfkill list 0: phy0: Wireless LAN Soft blocked: yes Hard blocked: no # débloquer wlan0 si nécessaire sudo rfkill unblock 0 # activer les interfaces réseau sudo ifconfig eth0 up sudo ifconfig wlan0 up # installer le serveur DHCP et le cache DNS sudo apt-get install dnsmasq # faire une copie du fichier de configuration par défaut sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak # éditer le fichier de configuration sudo nano /etc/dnsmasq.conf # interface, étendue et durée du bail interface=wlan0 dhcp-range=10.10.10.50,10.10.10.60,255.255.255.0,24h |
|||||||||||||||||||||||||||||||||
Paramétrez le Raspberry en point d'accès WiFi sécurisé |
|||||||||||||||||||||||||||||||||
|
# installer le point d'accès sudo apt-get install hostapd # créer le fichier de configuration du point d'accès (sans commentaires ni indentation) sudo nano /etc/hostapd/hostapd.conf interface=wlan0 driver=nl80211 ssid=raspi-access auth_algs=1 wpa=2 wpa_passphrase=KeyForAccess wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP hw_mode=g channel=6 # déclarer le fichier de configuration sudo nano /etc/default/hostapd DAEMON_CONF="/etc/hostapd/hostapd.conf" # activer les services sudo systemctl restart dnsmasq sudo systemctl unmask hostapd sudo systemctl enable hostapd sudo systemctl start hostapd # redémarrage du système sudo reboot |
|||||||||||||||||||||||||||||||||
|
Le fichier /etc/hostapd/hostapd.conf n'accepte pas les commentaires ni les indentations
Voici donc pour information sa version commentée :
|
|||||||||||||||||||||||||||||||||
|
Connectez un client au point d'accès et depuis lequel vous devez pouvoir effectuer un ping vers les interfaces Wlan0 et Eth0 |
|||||||||||||||||||||||||||||||||
Contrôlez le fonctionnement des services hostapd et dnsmasq |
|||||||||||||||||||||||||||||||||
|
cat /var/log/syslog Feb 23 08:52:05 raspi-gateway hostapd: wlan0: STA e0:ce:c3:82:8e:18 IEEE 802.11: associated Feb 23 08:52:05 raspi-gateway hostapd: wlan0: STA e0:ce:c3:82:8e:18 RADIUS: starting accounting session Feb 23 08:52:05 raspi-gateway hostapd: wlan0: STA e0:ce:c3:82:8e:18 WPA: pairwise key handshake completed Feb 23 08:52:08 raspi-gateway dnsmasq-dhcp[962]: DHCPDISCOVER(wlan0) e0:ce:c3:82:8e:18 Feb 23 08:52:08 raspi-gateway dnsmasq-dhcp[962]: DHCPOFFER(wlan0) 10.10.10.54 e0:ce:c3:82:8e:18 Feb 23 08:52:08 raspi-gateway dnsmasq-dhcp[962]: DHCPREQUEST(wlan0) 10.10.10.54 e0:ce:c3:82:8e:18 Feb 23 08:52:08 raspi-gateway dnsmasq-dhcp[962]: DHCPACK(wlan0) 10.10.10.54 e0:ce:c3:82:8e:18 SATELLITE |
|||||||||||||||||||||||||||||||||
|
Le service hostapd a associé le périphérique dont l'adresse MAC est e0:ce:c3:82:8e:18 et le nom netbios SATELLITE Le service dnsmasq a répondu à la demande du client en lui offrant l'adresse IP 10.10.10.54 |
|||||||||||||||||||||||||||||||||
Affichez les baux DHCP du point d'accès WiFi |
|||||||||||||||||||||||||||||||||
|
cat /var/lib/misc/dnsmasq.leases 1677228728 e0:ce:c3:82:8e:18 10.10.10.54 SATELLITE 01:e0:ce:c3:82:8e:18 |
|||||||||||||||||||||||||||||||||
Pour résilier un bail il suffit de supprimer la ligne correspondante dans ce fichier. |
|||||||||||||||||||||||||||||||||
|
Les clients n'ont pour l'instant aucun accès et vous devez maintenant construire un pont entre les deux interfaces. Vous avez le choix entre trois options proposées ci-dessous selon ce que vous souhaitez obtenir. A ce stade il est conseillé de réaliser, avec Win32DiskImager, une image ISO de la carte microSD avant de poursuivre. |
|||||||||||||||||||||||||||||||||
|
Connectez-vous en local sur le Raspberry car certaines opérations à venir bloqueront la liaison SSH |
|||||||||||||||||||||||||||||||||
| Option 1 - HotSpot | |||||||||||||||||||||||||||||||||
|
Cette première option fait du Raspberry un simple point d'accès WiFi vers le réseau local et vers Internet. |
|||||||||||||||||||||||||||||||||
Activez l'IP Forwarding en décommentant une ligne dans le fichier /etc/sysctl.conf |
|||||||||||||||||||||||||||||||||
|
sudo nano /etc/sysctl.conf net.ipv4.ip_forward=1 |
|||||||||||||||||||||||||||||||||
Ajoutez une règle de pare-feu et rendez-la persistante |
|||||||||||||||||||||||||||||||||
|
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" |
|||||||||||||||||||||||||||||||||
Editez le fichier /etc/rc.local pour ajouter une ligne juste au dessus de la ligne exit 0 |
|||||||||||||||||||||||||||||||||
|
sudo nano /etc/rc.local iptables-restore < /etc/iptables.ipv4.nat exit 0 |
|||||||||||||||||||||||||||||||||
Construisez le pont entre les deux interfaces |
|||||||||||||||||||||||||||||||||
|
sudo apt-get install bridge-utils sudo brctl addbr br0 sudo brctl addif br0 eth0 |
|||||||||||||||||||||||||||||||||
|
Ajoutez le pont dans la configuration TCP/IP |
|||||||||||||||||||||||||||||||||
|
sudo nano /etc/network/interfaces auto br0 iface br0 inet manual bridge_ports eth0 wlan0 |
|||||||||||||||||||||||||||||||||
Editez le fichier /etc/hostapd/hostapd.conf pour ajouter une ligne juste en dessous de la ligne interface=wlan0 |
|||||||||||||||||||||||||||||||||
|
sudo nano /etc/hostapd/hostapd.conf interface=wlan0 bridge=br0 |
|||||||||||||||||||||||||||||||||
Redémarrez le système |
|||||||||||||||||||||||||||||||||
|
sudo reboot |
|||||||||||||||||||||||||||||||||
|
Connectez un client au point d'accès. Vous ne devez plus pouvoir effectuer de ping vers les interfaces Wlan0 et Eth0 Vous devez pouvoir effectuer un ping vers la passerelle et Internet et avoir une résolution DNS sur Internet |
|||||||||||||||||||||||||||||||||
| Option 2 - Passerelle TOR | |||||||||||||||||||||||||||||||||
|
TOR, acronyme de The Onion Router (le routage en oignon), est un réseau garantissant l’anonymat de ses utilisateurs. Chaque connexion transite par un nombre plus ou moins important de noeuds, chacun d’entre eux relayant l’information au noeud suivant jusqu’à la destination en empêchant de relier cette information au client qui a émis la requête. |
|||||||||||||||||||||||||||||||||
|
Ouvrez les ports 9001 et 9030 (TCP et UDP) sur le routeur et dirigez-les vers l'IP Ethernet du Raspberry
|
|||||||||||||||||||||||||||||||||
Installez TOR |
|||||||||||||||||||||||||||||||||
|
sudo apt-get install tor |
|||||||||||||||||||||||||||||||||
|
Créez un utilisateur pour TOR en ignorant les informations Full name, Room number, etc. |
|||||||||||||||||||||||||||||||||
|
sudo adduser tor |
|||||||||||||||||||||||||||||||||
Autorisez l’utilisateur TOR à exécuter toutes les commandes en mode sudo |
|||||||||||||||||||||||||||||||||
|
sudo nano /etc/sudoers tor ALL=(ALL) ALL |
|||||||||||||||||||||||||||||||||
Configurez TOR en tant que passerelle en décommentant les lignes indiquées |
|||||||||||||||||||||||||||||||||
sudo nano /etc/tor/torrc
|
|||||||||||||||||||||||||||||||||
| Si on souhaitait utiliser TOR en local depuis le Raspberry on laisserait la ligne SocksPort 0 commentée. |
|||||||||||||||||||||||||||||||||
Appliquez les règles de routage au démarrage dans cron |
|||||||||||||||||||||||||||||||||
|
sudo crontab -e -u pi @reboot sudo sysctl -w net.ipv4.ip_forward=1 @reboot sudo iptables -A FORWARD -i wlan0 -s 10.10.10.0/255.255.255.0 -o eth0 -j @reboot sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
|||||||||||||||||||||||||||||||||
Redémarrez le Raspberry |
|||||||||||||||||||||||||||||||||
| sudo reboot | |||||||||||||||||||||||||||||||||
|
Connectez un client au point d'accès. Vous devez pouvoir effectuer un ping vers la passerelle et Internet et avoir une résolution DNS sur Internet |
|||||||||||||||||||||||||||||||||
Vérifiez la configuration de TOR |
|||||||||||||||||||||||||||||||||
| tor --verify-config |
|||||||||||||||||||||||||||||||||
Vérifiez l’état du service TOR |
|||||||||||||||||||||||||||||||||
| service tor status |
|||||||||||||||||||||||||||||||||
Suivez le fonctionnement de TOR |
|||||||||||||||||||||||||||||||||
|
cat /var/log/tor/notices.log Feb 2 11:45:26.000 [notice] Bootstrapped 80%: Connecting to the Tor network Feb 2 11:45:26.000 [notice] Signaled readiness to systemd Feb 2 11:45:26.000 [notice] Opening Socks listener on /var/run/tor/socks Feb 2 11:45:26.000 [notice] Opening Control listener on /var/run/tor/control Feb 2 11:45:27.000 [notice] Bootstrapped 85%: Finishing handshake with first hop Feb 2 11:45:27.000 [notice] Guessed our IP address as 90.55.57.148 (source: 183.42.189.12). Feb 2 11:45:27.000 [notice] Bootstrapped 90%: Establishing a Tor circuit Feb 2 11:45:27.000 [notice] Tor has successfully opened a circuit. Looks like client functionality is working. Feb 2 11:45:27.000 [notice] Bootstrapped 100%: Done Feb 2 11:45:27.000 [notice] Now checking whether ORPort 90.55.57.148:9001 and DirPort 90.55.57.148:9030 are reachable... (this may take up to 20 minutes -- look for log messages indicating success) Feb 2 11:45:28.000 [notice] Self-testing indicates your DirPort is reachable from the outside. Excellent. Feb 2 11:45:29.000 [notice] Self-testing indicates your ORPort is reachable from the outside. Excellent. Publishing server descriptor. Feb 2 11:45:32.000 [notice] Performing bandwidth self-test...done. |
|||||||||||||||||||||||||||||||||
|
TOR indiquera en continu son uptime et le volume de données qu’il a fait transiter. Cela peut être vérifié en entrant le nom du noeud dans la base de données tenue à jour par TOR. |
|||||||||||||||||||||||||||||||||
| Option 3 - Passerelle VPN | |||||||||||||||||||||||||||||||||
|
Un lien VPN garantit la sécurité des données qui transitent de point à point. Vous devez disposer d'un compte auprès d'un fournisseur VPN et nous allons choisir Windscribe qui propose un accès gratuit limité à un volume de 2Go par mois en restant anonyme, ou 10Go par mois en acceptant d'ouvrir un compte chez eux. Vous devez également télécharger depuis leur site le paquet Debian que vous placerez dans le répertoire home/<utilisateur>/ |
|||||||||||||||||||||||||||||||||
Installez les paquets requis (adaptez le nom de fichier windscribe) |
|||||||||||||||||||||||||||||||||
|
sudo apt-get install openvpn sudo dpkg -i windscribe-cli_1.4-51_armhf.deb |
|||||||||||||||||||||||||||||||||
Initialisez Windscribe |
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -A FORWARD -i wlan0 -s 10.10.10.0/255.255.255.0 -o tun0 -j ACCEPT sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE |
|||||||||||||||||||||||||||||||||
| Les serveurs disponibles avec un compte gratuit sont : US-C, US, US-W, CA, CA-W, FR, DE, NL, NO, RO, CH, GB, HK |
|||||||||||||||||||||||||||||||||
Ajoutez les règles de routage au démarrage dans le cron |
|||||||||||||||||||||||||||||||||
|
sudo crontab -e -u pi @reboot sudo sysctl -w net.ipv4.ip_forward=1 @reboot sudo iptables -A FORWARD -i wlan0 -s 10.10.10.0/255.255.255.0 -o tun0 -j ACCEPT @reboot sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE |
|||||||||||||||||||||||||||||||||
Redémarrez le système, la connexion à Windscribe est conservée après un reboot soft ou hard |
|||||||||||||||||||||||||||||||||
|
sudo reboot |
|||||||||||||||||||||||||||||||||
Vérifiez de fonctionnement |
|||||||||||||||||||||||||||||||||
|
windscribe status windscribe -- pid: 556, status: running, uptime: 1m, %cpu: 0.0, %mem: 2.0 IP: 194.59.249.250 CONNECTED -- FR tcp (443) |
|||||||||||||||||||||||||||||||||
|
Connectez un client au point d'accès. Il est préférable d'utiliser des DNS tels que OpenDNS 208.67.222.222 et 208.67.220.220 Vous devez pouvoir effectuer un ping vers la passerelle et Internet et avoir une résolution DNS sur Internet Vérifiez depuis le client connecté au wlan que l'IP donnée par www.mon-ip.com est identique à l'IP donnée par windscribe status |
|||||||||||||||||||||||||||||||||
Toutes les commandes Windscribe |
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
Mise à jour de Windscribe (adaptez le nom de fichier) |
|||||||||||||||||||||||||||||||||
|
sudo apt-get purge windscribe-cli sudo dpkg -i windscribe-cli_1.4-51_armhf.deb # si apparition du message /etc/resolv.conf is not a symlink, this may break DNS # appliquer les options par défaut pour une résolution dynamique sudo apt-get install resolvconf sudo dpkg -reconfigure resolvconf # le fichier /etc/resolv.conf devrait ensuite ressembler à ceci : # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 10.255.255.2 nameserver 208.67.222.222 nameserver 208.67.220.220 search home |
|||||||||||||||||||||||||||||||||
Pour conclure voici un script de diagnostic |
|||||||||||||||||||||||||||||||||
|
#!/bin/bash file="/home/pi/diag.log" echo "------------------------------ Journal du statut VPN --------------------------" > $file echo "" >> $file echo "== COMPTE WINDSCRIBE ==========================================================" >> $file echo "" >> $file windscribe account >> $file echo "" >> $file echo "== CONNEXION VPN ==============================================================" >> $file echo "" >> $file windscribe status >> $file windscribe firewall >> $file echo "== INTERFACES =================================================================" >> $file echo "" >> $file ifconfig eth0 >> $file ifconfig wlan0 >> $file ifconfig tun0 >> $file echo "== ROUTAGE ====================================================================" >> $file echo "" >> $file sudo iptables -L >> $file echo "" >> $file echo "===============================================================================" >> $file # nettoyage du journal sed -i -e '/^Usage/d' $file sed -i -e '/^Available modes:/d' $file sed -i -e '/^auto (on/d' $file sed -i -e '/^on (always on)/d' $file sed -i -e '/^off (always off)/d' $file sed -i -e '/^ ----/d' $file sed -i -e '/^ inet6/d' $file sed -i -e '/^ ether/d' $file sed -i -e '/^ unspec/d' $file sed -i -e '/^ RX/d' $file sed -i -e '/^ TX/d' $file # affichage du journal leafpad $file exit 0 |
|||||||||||||||||||||||||||||||||