Cet article est en cours de rédaction.
Pour plus d'informations sur WireGuard et systemd-networkd suivez ces liens.
Vous pouvez vouloir utiliser un VPN sur votre serveur pour pleins de raisons.
Personnellement je l'utilise pour désactiver les publicités des applications Android sur mon téléphone. Pour cela j'utilise un serveur DNS ainsi que des blocklists. Je m'en sers aussi pour éviter d'exposer certains services à internet comme les protocoles IMAP et SMTP de mon serveur mail. A l'avenir je souhaiterais aussi faire des backups à distance avec rsync sur un Raspberry Pi Zero.
WireGuard fait parti du kernel Linux mais il vous faut installer le paquet wireguard-tools pour ArchLinux ou wireguard pour les autres distributions pour pouvoir génerer les clés facilement.
Génerez une clé privée et publique avec la commande : wg genkey | tee privatekey | wg pubkey > publickey.
Génerez une clé pré-partagée avec la commande : wg genpsk > presharedkey.
Vous pouvez stocker la clé privée et la clé pré-partagée avec systemd credentials :
systemd-creds encrypt privatekey /etc/credstore.encrypted/network.wireguard.private.wg0
systemd-creds encrypt presharedkey /etc/credstore.encrypted/network.wireguard.psk.wg0
La clé pré-partagée et la clé publique doivent être partagées avec tous les clients.
Exemple de fichier NetDev pour l'interface WireGuard /etc/systemd/network/90-wg0.netdev sur le serveur WireGuard :
[NetDev]
Name=wg0
Kind=wireguard
Description=WireGuard tunnel wg0
[WireGuard]
ListenPort=51871
PrivateKey=@network.wireguard.private.wg0
RouteTable=main
[WireGuardPeer]
PublicKey=<CLIENT_PUBLIC_KEY>
PresharedKey=@network.wireguard.psk.wg0
AllowedIPs=192.168.2.10/32 fc02::a/128
Exemple de fichier Network pour l'interface WireGuard /etc/systemd/network/90-wg0.network sur le serveur WireGuard :
[Match]
Name=wg0
[Network]
Address=192.168.2.2/24
Address=fc02::2/120
IPMasquerade=both
N'oubliez pas d'ajouter une route sur l'interface de toutes les machines qui ne sont pas connectées à WireGuard si vous souhaitez accéder aux différents clients WireGuard.
Exemple de fichier Network pour l'interface Ethernet /etc/systemd/network/00-bond0.network sur une deuxième machine connectée au réseau local mais pas avec WireGuard :
[Match]
Name=bond0
[Link]
RequiredForOnline=routable
[Network]
BindCarrier=end0 wlan0
Address=192.168.1.3/24
Gateway=192.168.1.1
DNS=192.168.1.2
Address=fc01::3/120
DNS=fc01::2
DHCP=ipv6
IPv6AcceptRA=yes
[Route]
Gateway=192.168.1.2
Destination=192.168.2.0/24
[Route]
Gateway=fc01::2
Destination=fc02::/120
Cette configuration me permet d'accèder à un serveur ftp sur mon téléphone depuis l'application Material Files sans avoir à le déconnecter du VPN permanent et sans avoir à faire de tunnel pour chacun de mes appareils.
Pensez à ajouter les IPs à votre serveur DNS pour ne pas avoir à vous en rappeler. 😉
Configurez le pare-feu pour pouvoir vous connecter du client au serveur et avoir accés à internet.
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wg0 -o br0 -j ACCEPT
Vous pouvez également accepter le forwarding dans l'autre direction pour vous connecter aux différents clients.
iptables -A FORWARD -i br0 -o wg0 -j ACCEPT