====== Wireguard - Un VPN moderne ======
**Wireguard** est un VPN moderne, léger et très compact (4000 lignes de code) qui utilise les derniers algorithmes de cryptographie
=== Liens ===
* https://www.malekal.com/wireguard-installer-et-configurer-un-serveur-vpn-linux-et-client-windows-android-ubuntu/
* https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-20-04
* https://en.wikipedia.org/wiki/WireGuard
===== Installation sur Debian Bullseye/Bookworm =====
* sur chaque machine à jour (''apt update && apt upgrade -y'' puis un redémarrage)
apt install -y wireguard wireguard-tools
===== Configuration =====
==== Machine A (server) ====
* **Adresse IP : ip 192.168.1.13/24**
* **Adresse IP VPN : 10.0.2.1/24 - 10.0.2.2/24**
=== Génération des clés ===
cd /etc/wireguard
umask 077 ; wg genkey | tee private.key | wg pubkey > public.key
cat private.key
WIgkDciQDO38k6mb5yT7FAivxnDuqbNHx+0qLAPfA24=
cat public.key
lbCB7J6kdQlnwPu67KDJIshqZH66fdGwq6zaUrbws1c=
=== Constitution du fichier wg0.conf ===
Editer le fichier **/etc/wireguard/wg0.conf**
[Interface]
Address = 10.0.2.1/24 # Adresses autorisées dans le VPN
Listenport = 51820
# clé privée de machine A
PrivateKey = qPF9uU7qsCbw3uKR1t2Q0gfr2HasTKZGPkCHz2AszUs=
# UDP service port; 51820 is a common choice for WireGuard
ListenPort = 51820
[Peer]
PublicKey = zpNm6Du5j8Y2SqsWOcPj67KYPxqQ1M2sv0Uvi0a9oA8= # de machine B
AllowedIPs = 10.0.2.1/24 # le peer peut acceder au serveur
systemctl start wg-quick@wg0
systemctl enable wg-quick@wg0
wg
wginterface: wg0
public key: cHQaOlh6/d8tvPn/7ESawn+DcbO01UeR5Z/DvRu8YiI=
private key: (hidden)
listening port: 51820
root@A:~# wg
interface: wg0
public key: cHQaOlh6/d8tvPn/7ESawn+DcbO01UeR5Z/DvRu8YiI=
private key: (hidden)
listening port: 47580
peer: wclxVxrolgdsquZ3gD9Ysu71+IQt7bFfetRfBsWKYWo=
endpoint: 192.168.1.14:39785
allowed ips: 10.0.0.2/32
latest handshake: 22 minutes, 21 seconds ago
transfer: 32.11 KiB received, 34.48 KiB sent
==== Machine B ====
**ip 192.168.1.14/24**
* même manipulation pour les clés
cd /etc/wireguard
umask 077 ; wg genkey | tee private.key | wg pubkey > public.key
* fichier **etc/wireguard/wg0.conf**
[Interface]
PrivateKey = SHUt1BtkKjAKn12MLKorv3Mm2G45iwseZigCDe1PXno=
Address = 10.0.2.2/32
#DNS = 192.168.1.254
[Peer]
PublicKey = xKzwFyVVjeyuLS/vSb1T3PgdGDS7kkaDABX1icr3Bjo= # de machineA
#AllowedIPs = 10.0.0.0/8, 192.168.1.0/24
AllowedIPs = 0.0.0.0/0
Wireguard - Scripts de configuration
Endpoint = 192.168.1.13:51820
Wireguard - Scripts de configuration
PersistentKeepalive = 20
La commande **wg** permet d'afficher les paramètres de base et l'état de fonctionnement de **wireguard**
wg
interface: wg0
public key: zpNm6Du5j8Y2SqsWOcPj67KYPxqQ1M2sv0Uvi0a9oA8=
private key: (hidden)
listening port: 57250
fwmark: 0xca6c
peer: xKzwFyVVjeyuLS/vSb1T3PgdGDS7kkaDABX1icr3Bjo=
endpoint: 192.168.1.13:51820
allowed ips: 0.0.0.0/0
latest handshake: 22 seconds ago
transfer: 10.56 KiB received, 80.12 KiB sent
persistent keepalive: every 20 seconds
===== Wireguard - Scripts de configuration =====
**Remarque** : **wireguard** n'est pas activé au démarrage. Pour l'activer :
systemctl enable --now wg-quick@wg0
systemctl status wg-quick@wg0
==== Configuration point à point ====
Le script génère deux fichier de configuration **wg0-a.conf** et **wg0-b.conf** à copier sur les deux machines et à renommer **wg0.conf**
#!/bin/bash
set -u
set -e
AddressAwg=10.0.0.1/32 # Adresse VPN Wireguard extremite A
EndpointA=192.168.1.81 # Adresse extremite A
PortA=51820 # Port ecoute extremite A
AddressBwg=10.0.0.2/32 # Adresse VPN Wireguard extremite B
EndpointB=192.168.1.82 # Adresse extremite B
PortB=51820 # Port ecoute extremite B
umask 077 ;
wg genkey > endpoint-a.key
wg pubkey < endpoint-a.key > endpoint-a.pub
wg genkey > endpoint-b.key
wg pubkey < endpoint-b.key > endpoint-b.pub
PKA=$(cat endpoint-a.key)
pKA=$(cat endpoint-a.pub)
PKB=$(cat endpoint-b.key)
pKB=$(cat endpoint-b.pub)
cat < wg0-a.conf
# local settings for Endpoint A
[Interface]
PrivateKey = $PKA
Address = $AddressAwg
ListenPort = $PortA
# remote settings for Endpoint B
[Peer]
PublicKey = $pKB
Endpoint = ${EndpointB}:$PortB
AllowedIPs = $AddressBwg
FINI
cat < wg0-b.conf
# local settings for Endpoint B
[Interface]
PrivateKey = $PKB
Address = $AddressBwg
ListenPort = $PortB
# remote settings for Endpoint A
[Peer]
PublicKey = $pKA
Endpoint = ${EndpointA}:$PortA
AllowedIPs = $AddressAwg
FINI
==== Configuration site à site ====
Le script est similaire au précédent avec en plus l'adresse du réseau distant dans la clause **AllowedIPs** (variables **NetworkA** et **NetworkB**)
#!/bin/bash
set -u
set -e
# Version Site to Site
AddressAwg="10.0.0.1/32" # Adresse VPN Wireguard cote A
EndpointA="192.168.1.81" # Adresse extremite A
PortA="51820" # Port ecoute extremite A
NetworkA="10.0.1.0/24" # reseau cote A
AddressBwg="10.0.0.2/32" # Adresse VPN Wireguard cote B
EndpointB="192.168.1.82" # Adresse extremite B
PortB="51820" # Port ecoute extremite B
NetworkB="10.0.2.0/24" # reseau cote B
umask 077
wg genkey > endpoint-a.key
wg pubkey < endpoint-a.key > endpoint-a.pub
wg genkey > endpoint-b.key
wg pubkey < endpoint-b.key > endpoint-b.pub
PKA=$(cat endpoint-a.key)
pKA=$(cat endpoint-a.pub)
PKB=$(cat endpoint-b.key)
pKB=$(cat endpoint-b.pub)
cat < wg0-a.conf
# local settings for Endpoint A
[Interface]
PrivateKey = $PKA
Address = $AddressAwg
ListenPort = $PortA
# IP forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# remote settings for Endpoint B
[Peer]
PublicKey = $pKB
Endpoint = ${EndpointB}:$PortB
AllowedIPs = $AddressBwg, $NetworkB
FINI
cat < wg0-b.conf
# local settings for Endpoint B
[Interface]
PrivateKey = $PKB
Address = $AddressBwg
ListenPort = $PortB
# IP forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# remote settings for Endpoint A
[Peer]
PublicKey = $pKA
Endpoint = ${EndpointA}:$PortA
AllowedIPs = $AddressAwg, $NetworkA
FINI
echo "wg0-a.conf et wg0-b.conf sont generes ..."
echo "copier wg0-b.conf sur la machine b et renommer les fichiers de configuration ..."