Depoussierage Wireguard [réseau]
La machine
Konpon nous avait confié ce vieux serveur PowerEdge 1950 sans garantie qu’il fonctionne. Avec une nouvelle carte scsi (merci Daweed !), un nettoyage des ventilateurs et quelques heures passées à comprendre qu’il ne voudrait jamais booter sur autre chose qu’un CD, Lothaire akka le serveur hurlant joyeusement dans le garage méritait d’avoir son adresse IP publique. Ca tombait bien, baionet avait une machine virtuelle servant de serveur un peu poussiéreuse qui ne demandait qu’à servir.
Ndlr Et un tunnel VPN, ca évite de rajouter du malheur aux regles du pare-feu déja bien maltraité
La solution du tunnel Wireguard, solution VPN léger et bien implémenté s’imposait… sa mise en oeuvre l’a été un petit peu moins.
Troll Ca aurait été plus simple sous openBSD
Rappel
Un tunnel wireguard est un tunnel chiffré entre deux réseaux. Cela permet de “faire voir” le réseau d’une machine par une autre. Ainsi, Lothaire allait voir le réseau internet vu par notre machine virtuelle chez Stolon. Cela permet également de lui assigner une adresse IPv4 et IPv6.
Installation et échanges
Le début s’est passé sans encombre et l’installation des paquets nécessaires s’est faite sans problème. Il a fallut ensuite créer une clef wireguard secrete à Lothaire ainsi qu’une clef publique. La clef publique a été immédiatement envoyée à Loris
Loris : - Et le secret partagé il est ou ? Pizzacoca : Oups, j’ai oublié qu’il en fallait une…
Chez Baionet nous utilisons également une “pre-shared key”, ce qui permet d’améliorer la sécurité des échanges.
Il a donc fallut également générer une clef secrete partagée et la transmettre à Loris qui s’est alors occupé du serveur.
Pour échanger les informations nous sommes allés au plus simple : un paste-bin avec accès par mot de passe. Nous avons utilisé celui des copains de Bordeaux
Configuration
En retour des secrets, Loris a transmis un fichier de configuration (toujours via paste-bin) qu’il a suffit de compléter avec le secret de la machine Lothaire.
Premier essai
Le premier démarrage avec wg-quick a fonctionné … sans fonctionner. La machine voyait toujours le réseu local mais plus internet … etrange !
En étudiant un peu les messages de wg-quick, nous avons constaté que wg-quick se fabriquait ses propres règles de routage à la volée. Comme ca ne fonctionnait pas et qu’il nous fallait identifier la cause de la defaillance nous avons décidé de ne plus passer par cette commande-raccourci et de créer un fichier de configuration avec ses tables de routage
Deuxième essai
… ou plutot deuxièmeS essaiS car il a fallut se rememorrer la syntaxe pour créer les regles de routage !
Créer un fichier de configuration n’est pas absolument nécessaire, Mais cela permet de paramétrer le démarrage du tunnel wireguard comme ‘il s’agissait d’une carte réseau.
La logique est la suivante : le fichier /etc/wireguard/wg0.conf indique au système les paramètres principaux du tunnel Coté Lothaire :
- secret de Lothaire (clef privée)
- port d’écoute Coté serveur wireguard :
- clef publique du serveur en face
- secret partagé
- port d’écoute
- plage d’adresses ip connnues par le tunnel (on considère qu’il connait tout internet)
Le fichier /etc/network/interface.d/wg0 précise les paramètre e la carte réseau virtuelle concernée par le tunnel
- Adresse ip publique
- regles de routage avant et après démarrage du tunnel (on fait le même travail que wg-quick, en somme)
Nota : l’ip aurait put être précisée dans l’un ou l’autre fichier.
Serveur
Ces réglages étaient réalisés à distance par la sympathique équipe de Stolon, Dam64 auscultait le trafic réseau sur le serveur à Pau et NinjaTrappeur modifiait et relancait le tunnel sur Lothaire. C’est ainsi que nous avons put identifier que les routes paramétrées sur le serveur n’étaient pas toutes à jour, ce qui nous a rappelé qu’il ne faudrait pas l’oublier dans son coin.
Morale de l’histoire
La configuration réseau est une affaire de … réseau et le travail en équipe associative a été très sympathique !
Memo commandes
Installation
sous debian quelques paquets suffisent
# Mise à jour du système (noubliez pas de lire ce qu'il propose
apt update && apt full-upgrade
# Installation des paquets
apt install wireguard-dkms resolvconf
Clefs
# On se place dans le répertoire créé lors de l'installation
cd /etc/wireguard/
# On modifie les autorisations par défaut lors de la création de fichiers
umask 077
# Génération des clefs wireguard
wg genkey | tee privatekey | wg pubkey > publickey
Secret partagé
wg genpsk > preshared.key
Premier essai
Fichier de configuration /etc/wireguard/wg0.conf
# définition du service wireguard
# On décomment si on veut un tunnel a chaque démarrage de la machine
#auto wg0
[Interface]
# contenu de la clef privée
PrivateKey = ici_la_clef_secrete_de_Lothaire
# adresse assignée par le serveur/fournisseur
Address = 80.67.186.16/32, 2001:913:5200:950::/56
# DNS proposés par le serveur
DNS = 80.67.169.12, 80.67.169.40, 2001:910:800::12, 2001:910:800::40
# On impose le port d'écoute
ListenPort = 44451
[Peer]
# clef publique du serveur
PublicKey = pmcbNukQLOFSdImt2Tzy5gG4NLDOxHGI4MYGugBKWAE=
# secret partagé
PresharedKey = ici_le_secret_partage
AllowedIPs = 0.0.0.0/0, ::/0
#Adresse_publique_serveur:numero_de_port
Endpoint = 80.67.186.254:51820
# on veut une persistence de la connexion meme en cas d'inactivité
PersistentKeepalive = 25
wg-quick up : ou l’on voit la cration des règles de routage
# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] nft -f /dev/fd/63
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] nft -f /dev/fd/63
wg-quick down : ou l’on voit la csuppression des règles de routage
# wg-quick down wg0
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip -6 rule delete table 51820
[#] ip -6 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg0
[#] nft -f /dev/fd/63
deuxième essai
fichier de configuration /etc/network/interfaces.d/wg0
# On décommente cette ligne si on veut que le tunnel soit actif dès le démarrage de la machine
#auto wg0
# Description de wg0 avec une adresse ipv4 Statique
iface wg0 inet static
address 80.67.186.16/32
# eventuellement on peut ajouter une adresse IPv6 si le serveur en propose une
# 2001:913:5200:950::/56
# before ifup, create the device with this ip link command
pre-up ip link add $IFACE type wireguard
# before ifup, set the WireGuard config from earlier
post-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
# Carioca (c'est le nom du serveur wireguard)
# la règle du que tout ce qui vient de l'adresse ip doit regarder la table n°10
post-up ip rule add from 80.67.186.16/32 lookup 10
# On crée la table N°10 qui indique la route par défaut pour l'interface wg0
post-up ip route add table 10 default via 10.0.0.1 dev wg0 onlink
post-up ip route add 10.0.0.1 dev wg0
# lors du ifdown on supprime la regle créée
post-down ip rule del from 80.67.186.16 lookup 10
# after ifdown, destroy the wg0 interface
post-down ip link del $IFACE
Fichier de configuration /etc/wireguard/wg0.conf
# définition du service wireguard
# On décomment si on veut un tunnel a chaque démarrage de la machine
#auto wg0
[Interface]
# contenu de la clef privée
PrivateKey = ici_la_clef_secrete_de_Lothaire
# l'adresse ip est définie dans /etc/interface/interface.d/wg0
# On impose le port d'écoute
ListenPort = 44451
[Peer]
# clef publique du serveur
PublicKey = pmcbNukQLOFSdImt2Tzy5gG4NLDOxHGI4MYGugBKWAE=
# secret partagé
PresharedKey = ici_le_secret_partage
AllowedIPs = 0.0.0.0/0, ::/0
#Adresse_publique_serveur:numero_de_port
Endpoint = 80.67.186.254:51820
# on veut une persistence de la connexion meme en cas d'inactivité
PersistentKeepalive = 25
Cheat sheet wireguard debian
# avec /etc/wireguard/wg0.conf
wg-quick up wg0
wg-quick down wg0
# avec /etc/network/interface.d/wg0
ifup wg0
ifdown wg0
# afficher les infos du tunnel
wg show wg0
Cheat sheet routage debian
# afficher les routes
ip route
# afficher les routes de la table 10
ip route show table 10
# afficher les regles
ip rule
ip rule show
# supprimer la regle venant de 80.67.186.16 de la table 10
ip rule del from 80.67.186.16 lookup 10
# supprimer le lien wg0
# (voir post-down ip link del sIFACE dans /etc/network/interface.d/wg0 )
ip link del wg0
Lcaracol
-
Je veux compreeendre !
-
*Tu as tout dans le blog post, dans le fichier /etc/network/interfaces.d/wg0 .
D’abord, il te faut créer l’interface wireguard et la configurer. En pratique via:
ip link add wg0 type wireguard
wg setconf $IFACE /etc/wireguard/wg0.conf
Pour ce qui est des règles de routage.
En gros, tu crée une ip rule qui va associer les paquets qui viennent de l’IP Baionet a une table de routage autre que la défaut (ici 10).
Sur cette table de routage, tu fais passer la route par défaut par le tunnel wireguard. En pratique:
ip rule add from $ip_baionet/32 lookup 10
post-up ip route add $autre_côté_du_tunnel dev wg0
ip route add table 10 default via $ip_autre_côté_du_tunnel dev wg0 onlink
Tu ne touches a rien sur la table de routage par défaut, tu laisse ce que ton FAI premier met dans la table via DHCP.
Ça te fera sortir tous tes paquets par ton FAI premier, mais fera passer tout ce qui est a destination de ton IP Baionet via le VPN.*
Une fois le tunnel effectif sur lothaire voici ce que donnent les commandes suivantes
wg show wg0
# wg show wg0
interface: wg0
public key: DUH/fhci/NgvDxlu1vHoz1rrt1i++PI6XhrYHYqN7wo=
private key: (hidden)
listening port: 44451
peer: pmcbNukQLOFSdImt2Tzy5gG4NLDOxHGI4MYGugBKWAE=
preshared key: (hidden)
endpoint: 80.67.186.254:51820
allowed ips: 0.0.0.0/0, ::/0
latest handshake: 1 minute, 37 seconds ago
transfer: 605.78 KiB received, 566.42 KiB sent
persistent keepalive: every 25 seconds
ip a
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:1e:c9:ad:ad:b3 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 11.11.11.2/24 brd 11.11.11.255 scope global dynamic enp3s0
valid_lft 6037sec preferred_lft 6037sec
inet6 fe80::21e:c9ff:fead:adb3/64 scope link
valid_lft forever preferred_lft forever
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:1e:c9:ad:ad:b5 brd ff:ff:ff:ff:ff:ff
altname enp7s0
inet 11.11.11.3/24 brd 11.11.11.255 scope global dynamic enp7s0
valid_lft 5328sec preferred_lft 5328sec
inet6 fe80::21e:c9ff:fead:adb5/64 scope link
valid_lft forever preferred_lft forever
12: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 80.67.186.16/32 brd 80.67.186.16 scope global wg0
valid_lft forever preferred_lft forever
ip r
# ip r
default via 11.11.11.1 dev eno1
10.0.0.1 dev wg0 scope link
11.11.11.0/24 dev eno1 proto kernel scope link src 11.11.11.2
11.11.11.0/24 dev eno2 proto kernel scope link src 11.11.11.3