Aller au contenu

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