On l’a appris fin janvier, Wireguard VPN va être intégré officiellement au prochain noyau linux. Pour ceux qui ne savent toujours pas de quoi il en retourne c’est par ici. En attendant, pour les autres, les impatients, les geeks, les curieux ou les 3 à la fois, il est temps de tester la bête !! Voici le petit tuto que je vous avais promis la semaine dernière, à savoir :
Comment installer un serveur VPN wireguard sur sa raspberry?
Dans ce tutoriel j’utilise:
– une raspberry 3 avec la distrib raspbian Buster installée (serveur vpn)
– un smartphone android et un pc ubuntu/desktop (clients vpn )
Je pars du principe que vous savez installer,configurer,sécuriser une raspbian , ajouter des règles au niveau du parefeu ,en bon nerd que vous êtes ^_^
Pour l’install et la config du VPN, let’s go!
1 – Installation des paquets
On a le choix entre 2 méthodes :
- Méthode1: compilation de wireguard à la mano
- Méthode2: via le dépôt debian (branche « unstable »)
J’ai opté pour la méthode 2 (flemme de recompiler en cas de future maj). Pour la suite des manips, se connecter dans un terminal, avec les superpouvoirs.
– Ajout du dépôt qui va bien sur la raspbian:
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
-On ajuste la priorité du dépôt « unstable » pour pas tout péter lors de futures maj:printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
-On met à jour la liste des paquets:apt update
Ne pas s’inquiéter des quelques messages d’erreurs qui s’affichent. En effet,il manque les signatures du dépôt qui ne peuvent pas être vérifiées pour le moment (GPG error …NO PUBKEY).
-On va y remédier :
apt install dirmngr
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC
apt update
Enfin , installation des paquets:
apt install wireguard dkms raspberrypi-kernel-headers wireguard-dkms wireguard-tools
Et c’est terminé pour la partie installation des packages!
2 – Générer les clés privées et publiques
Comme pour ssh, on génère une clé publique et une clé privée pour chaque machine (serveur, client1,client2 …)
cd /etc/wireguard ; umask 077
– clés pour le serveur vpn:
wg genkey > server_private.key
wg pubkey > server_public.key < server_private.key
– clés pour le client vpn (tablette, smartphone,pc….)
wg genkey > client1_private.key
wg pubkey > client1_public.key < client1_private.key
3 – Éditer les fichiers de conf :
Donc toujours dans un terminal sur notre raspberry.
– pour le SERVEUR :
nano /etc/wireguard/wg0.conf
-copier/coller les lignes suivantes dans le fichier de conf.
J’ai essayé de commenter un max pour ceux qui ne comprendraient pas bien quelles valeurs sont à modifier en fonction de leur environnement.
[Interface] # plage d'adresse privée pr le réseau vpn Address = 10.9.0.1/24 # port d'écoute du serveur vpn ListenPort = 51820 # @ip du resolveur dns , ici c'est l'@ip de mon pihole # mais on peut aussi mettre celle d'un public,par ex:1.1.1.1 DNS = 192.168.1.2 # ip du resolveur # mettre la clé privée de notre serveur (fichier server_private_key) PrivateKey = VJUUasN+z6hYn4C6xxxxxxxxxxxxxxxx= # règles de routage # penser à adapter avec le nom de votre interface reseau (ici eth0) # au besoin faire un "ip a" pour trouver votre interface PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] # client1 - telephone android # contenu de la clé publique (fichier client1_public.key) PublicKey = bLuMB4ed7txxxxxxxxxxxxxxxxxxxxxxxx # @ip privée du vpn client AllowedIPs = 10.9.0.2/32 PersistentkeepAlive = 60
– pour le CLIENT :
On génère ce fichier à partir de notre serveur. Une fois édité, il sera à transféré sur le client (smartphone, pc).
nano /etc/wireguard/wg0-client1.conf
[Interface] #client 1 # @ip du client Address = 10.9.0.2/32 # contenu du fichier client1_private_key PrivateKey = aI2cUEOwaMNjgfdxxxxxxxxxxxxxxxxxxxxxxxxx [Peer] #client 1 # contenu du fichier server_public_key PublicKey = Tzq/nLB07p8GKxxxxxxxxxxxxxxxxxxxxxxxxxxxx # @ipPubliqueBox:port_vpn, Endpoint = 82.xx.xx.xxx:51820 AllowedIPs = 0.0.0.0/0 #(si 0.0.0.0/0 alors tout le traffic est routé dans le vpn) PersistentKeepalive = 25
-Activer le routage des paquets IP sur le rpi:
dans le fichier nano /etc/sysctl.conf
passer la valeur net.ipv4.ip_forward= à 1
Pour les poilus de la main, on peut le faire en une seule ligne de commande :
sed -ir 's/#{1,}?net.ipv4.ip_forward ?= ?(0|1)/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
On recharge les paramètres du noyau:sysctl -p /etc/sysctl.conf
Activer l’interface:wg-quick up wg0
Vérifier le tunnel:ip a
Pour voir le status de la connexion :
sudo wg
Activer l’interface pour chaque redémarrage:sudo systemctl enable wg-quick@wg0
4 – Configurer les clients VPN
(téléphone Android ou pc)
selon le système que vous utilisez (android , linux, windows, macOS….) vous aurez toutes les infos détaillées sur la doc officielle pour installer le client wireguard sur votre pc. Sinon, pour ceux qui auraient un téléphone android et/ou ubuntu voilà comment je m’y suis pris:
– télécharger l’application wireguard sur le dépôt libre Fdroïd.
Pour récupérer le fichier de conf sur notre téléphone, on va le faire à partir d’un QR code généré sur notre raspberry .
sudo apt install qrencode
qrencode -t ansiutf8 < /etc/wireguard/wg0-client1.conf
Et voilà le joli Qr code correspondant à la conf vpn pour notre téléphone:
Il ne reste plus qu’à scanner et à importer le fichier dans l’appli wireguard installée précédemment sur notre android.
Sur un pc linux (ubuntu)
sudo add-apt-repository ppa:wireguard/wireguard
sudo apt install wireguard
On crée le fichier de conf spécial pour le pc ubuntu :
nano /etc/wireguard/wg0-client2.conf
Puis on y insère les lignes suivantes:
[Interface] #client 2 - ubuntu Address = 10.9.0.3/32 # contenu du fichier client2_private_key PrivateKey = aI2cUEOwaMNjgfdxxxxxxxxxxxxxxxxxxxxxxxxx DNS= 1.1.1.1 [Peer] #client 2 # contenu du fichier server_public_key généré sur le pi PublicKey = Tzq/nLB07p8GKxxxxxxxxxxxxxxxxxxxxxxxxxxxx # @ipPubliqueBox:port_vpn, Endpoint = 82.xx.xx.xxx:51820 AllowedIPs = 0.0.0.0/0 #(si 0.0.0.0/0 alors tout le traffic est routé dans le vpn) PersistentKeepalive = 25
Lancer la connexion vpn:wg-quick up wg0-client2
Enfin, on vérifie qu’on a bien récupéré l’adresse IP publique de notre box:curl ifconfig.me
Désactiver la connexion vpn:wg-quick down wg0-client2
Régles du parefeu:
Ne pas oublier d’ajouter une règle pour autoriser la connexion entrante vers le serveur VPN placé derrère votre box:
- NAT/ portforwarding
- port udp 51820 vers rpi LAN 192.168.X.X
Quelques infos supplémentaires:
- Wireguard est encore en phase expérimentale, donc le déployer en prod en contexte entreprise on évite pour le moment hein ! Même si vous êtes bluffé par ses perfs et que vous avez une irrésistible envie de virer openvpn:-)
- On trouve sur github des scripts d’install auto. J’ai vu que pivpn avait aussi proposé le sien. Ça pourrait être une bonne idée pour ceux qui sont pressés de tester le bouzin vite fait . Mais je déconseille pour du long terme , surtout au vu de la facilité d’install et de config de wireguard.
- Je mettrai à jour ce tuto régulièrement en fonction des évolutions du projet.
Voilà j’espère que vous aurez réussi à tester wireguard avec succès et que comme moi vous allez apprécier son utilisation au quotidien!
Super, tout à fait ce que je cherchais comme tuto. Effectivement, c’est tetant de basculer :-)Merci
Hello Yann,
Merci pour ce tuto.
J’ai une petite question en lien à ce sujet : quelles sont les règles iptables que tu as mis en place pour protéger ton serveur tout en permettant les connexions Wireguard ?
Je te remercie
Bonjour,
Je suis en carafe à ce niveau » apt install wireguard dkms raspberrypi-kernel-headers wireguard-dkms wireguard-tools »,
ça me dit impossible de trouver le paquet « raspberrypi-kernel-headers », les commandes précédentes étaient ok
Auriez-vous un idée ?
Merci
Cordialement
Hello devalog,
tu peux tester un « sudo rpi-update »
Bonjour,
Merci beaucoup, j’ai avancé d’un cran, mais très novice en la matière
maintenant je bloque sur les scripts, déjà sur ce qu’il faut changer, pour le DNS=j’ai mis l’ip de eth0, par contre je ne sais pas où trouver les Privatekey et PublicKey ? y a t il d’autres paramètres à changer ?
Encore merci
Bonjour,
J’ai quelques questions:
1 – A l’étape 3, quel adresse ip dois-je renseigner? L’adresse de mon serveur?(251) la 1ere adresse disponible?(1)**qui es celui de mon PC**; l’adresse réseau?(0/24)***
[Interface]
# plage d’adresse privée pr le réseau vpn
Address = 10.9.0.1/24 ***
2 – Toujours dans ce fichier, si je veux rajouter d’autre clients, comment je dois le renseigner?
a)
[Peer]
# client1 – telephone android
xxxxxxxxxxx
# client2 – PC Windows
xxxxxxxxxxx
Ou bien
b)
[Peer]
# client1 – telephone android
xxxxxxxxxxx
[Peer]
# client2 – pc windows
xxxxxxxxxxx
et enfin
dans l’étape – pour le CLIENT :
# @ipPubliqueBox:port_vpn,
Endpoint = 82.xx.xx.xxx:51820 ***** Est-ce ici que j’indique mon DDNS
AllowedIPs = 0.0.0.0/0
#(si 0.0.0.0/0 alors tout le traffic est routé dans le vpn)
PersistentKeepalive = 25
Merci d’avance :).
slt Hanma7,
1/ Non ce n’est pas l’ip de ton serveur
mais une plage d’@Ip pour adresser ton réseau VPN, il servira de Pool ip pour affecter une ip à tes clients VPN
2/ c’est réponse b. Tu crées une section [peer] par client
3/ oui – tu peux mettre le domaine Dyndns (ou l’ip publique si elle est statique) qui te permet de joindre ta box ou ton serveur vpn
Voilà jespère que ca répond à tes questions ^^
Bonjour,
Merci de ta réponse. j’ai enfin compris que la plage d’@Ip du réseau VPN (adresse réseau privé quelconque)est différant et doit être différant de celui de mon réseaux local. Elle ne sert qu’à effectuer la liaison.
Il faudrait rajouté dans la conf client, sous [Interface] la ligne DNS = x.x.x.x * Dns local ou public, celle renseigné dans la conf serveur.
Personnellement, j’ai trouvé plus concis ton tuto par rapport à d’autre Tuto traitant le même sujet. Je te remercie pour ton dévouement. 🙂
Merci Hanma pour tes encouragements 😉
Super tuto, je ne me suis pas encore lancé, car trop de projet en // sur mon pi 🙂 et surtout mon VPN n’est pas encore supporté par wireguard 🙁 (S2/2020….).
Bonjour,
Merci pour le tuto.
Je rencontre néanmoins un petit problème :
Mon raspberry est connecté en wifi. J’ai donc :
root@raspberrypi:/etc/wireguard# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether b8:27:eb:2b:46:fe brd ff:ff:ff:ff:ff:ff
3: wlan0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:7e:13:ab brd ff:ff:ff:ff:ff:ff
inet 192.168.0.27/24 brd 192.168.0.255 scope global dynamic noprefixroute wlan0
valid_lft 37287sec preferred_lft 31887sec
inet6 2a01:e0a:130:4460:f854:9ee3:4830:9c54/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 86188sec preferred_lft 86188sec
inet6 fe80::1a40:62e0:647:7a2b/64 scope link
valid_lft forever preferred_lft forever
Aussi, j’ai remplacé eth0 par wlan0 dans le fichier /etc/wireguard/wg0.conf
Et quand je lance la commande : root@raspberrypi:/etc/wireguard# wg-quick up wg0
J’ai le retour suivant
[#] ip link add wg0 type wireguard
Error: Unknown device type.
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device « wg0 »
Une idée du problème ?
Merci !
Xavier
slt Xavier,
ça ressemble à un pb de « mauvais kernel header »
essaye:
sudo apt install raspberrypi-kernel-headers
puis un reboot du pi
Bonjour Benzo,
Le problème est toujours là. On besoin je peux réinitialiser la carte SD.
root@raspberrypi:~# sudo apt install raspberrypi-kernel-headers
Reading package lists… Done
Building dependency tree
Reading state information… Done
raspberrypi-kernel-headers is already the newest version (1.20201022-1).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
root@raspberrypi:~# reboot
root@raspberrypi:~# wg-quick up wg0
[#] ip link add wg0 type wireguard
Error: Unknown device type.
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device « wg0 »
Xavier
ok , faudrait aussi purger et réinstaller les modules « wireguard-dkms »
avec un truc du genre:
sudo apt remove wireguard-dkms --purge && sudo apt autoremove -y && sudo apt update -y
puis:
apt install wireguard-dkms
Désolé Benzo, ça ne veut rien savoir sur wlan0 ; je vais voir a faire des tests sur eth0 et je reviens vers toi.
Bonjour Benzo,
J’ai peut être trouvé une référence au problème sur le net, mais je ne suis pas assez « poilu » pour interpréter les consignes. Peux-tu s’il te plait y jeter un oeil ? https://snapcraft.io/wireguard-ammp
Merci !
Merci pour ce tuto clair, concis et efficace !
@Xavier, j’ai eu le même problème, et je l’ai résolu en faisant un `apt dist-upgrade`… puis reboot, puis le purge et réinstall comme indiqué par benzo.
Salut et merci pour ce tuto que je rechercher ! j’ai cependant un problème, le premier a était le même que @Xavier, j’ai ensuite suivis la recommandations de @Sjry et benzo, pour récapituler si jamais vous avez cette erreur il faut faire :
apt dist-upgrade #attention peut-être très long !
#reboot le pi, et faire
sudo apt remove wireguard-dkms –purge && sudo apt autoremove -y && sudo apt update -y
#puis
apt install wireguard-dkms
et je n’ai plus eu l’erreur lors de la commande : wg-quick up wg0
Je me retrouve maintenant face à un nouveau problème !
le :
sudo apt install qrcode
il me met l’erreur suivante : E: Impossible de trouver le paquet qrcode
comme s’il n’exister plus dans les paquets officiel, du moins plus sous ce nom !
Merci pour votre aide, si jamais il y’a un autre moyen de se connecter dessus sans le qrcode je veux bien la manip !
MAJ : trouvé, il y’a une erreur ce n’est pas : sudo apt install qrcode
mais : sudo apt install qrencode
il y’avais juste une petite faute de frappe sur le nom du programe.
slt Razor, merci pour ton retour , jai corrigé !
de rien !
Sinon, je n’ai malheureusement pas réussi à me connecter à mon VPN, peut-être une mauvaise configuration du fichier config, j’ai tout essayer, mais lorsque je me connecte au serveur je n’ai ni accès à mon réseau local ni même à internet… aucune idée d’où peux venir le problème..