Installer un VPN Wireguard sur sa raspberry [tuto]

wireguard raspberry
Dernière mise a jour 22 Juil 2020 a 08:51

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:

Résultat de recherche d'images pour "android"

– 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 qrcode

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)

Résultat de recherche d'images pour "linux inside"

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!

16 commentaires sur Installer un VPN Wireguard sur sa raspberry [tuto]

  1. 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

  2. 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

    • 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

  3. 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 :).

  4. 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. 🙂

  5. 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….).

  6. 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

      • 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

Leave a Reply

Votre adresse de messagerie ne sera pas publiée.


*