WSL2 & VPN
TL;DR
VPN et WSL2 ne font pas tout le temps bon ménage. Parfois la VM ne peut plus se connecter à l'extérieur. En PJ, un script pour générer la commande route add qui va bien. Il suffit de lancer le script dans WSL et de la copier/coller dans un powershell avec les droits administrateurs.
Symptômes
Le réseau WSL2 fonctionne parfaitement tant qu'on n'est pas déconnecté. Il perd la connexion réseau en cas de déconnexion/reconnexion au VPN. La route par défaut permettant de sortir du conteneur WSL n'existe plus.
Exemple, le diff entre les commandes route print
pendant la première connexion au VPN et une connexion suivante (l'IP de la machine WSL est 192.168.73.237/20) :
diff -rbu avant-deconnexion.txt apres-reconnexion.txt
--- avant-deconnexion.txt 2021-04-16 08:18:23.021858100 +0200
+++ apres-reconnexion.txt 2021-04-16 08:25:14.471858100 +0200
@@ -18,20 +18,12 @@
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
- 172.30.192.0 255.255.240.0 On-link 172.30.192.1 271
172.30.192.1 255.255.255.255 On-link 172.30.192.1 271
- 172.30.207.255 255.255.255.255 On-link 172.30.192.1 271
192.168.1.8 255.255.255.255 On-link 192.168.1.8 296
- 192.168.64.0 255.255.240.0 On-link 192.168.64.1 271
192.168.64.1 255.255.255.255 On-link 192.168.64.1 271
- 192.168.79.255 255.255.255.255 On-link 192.168.64.1 271
194.5.173.155 255.255.255.255 192.168.1.1 192.168.1.8 40
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
- 224.0.0.0 240.0.0.0 On-link 172.30.192.1 271
- 224.0.0.0 240.0.0.0 On-link 192.168.64.1 271
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
- 255.255.255.255 255.255.255.255 On-link 172.30.192.1 271
- 255.255.255.255 255.255.255.255 On-link 192.168.64.1 271
===========================================================================
Itin�raires persistants�:
Adresse r�seau Masque r�seau Adresse passerelle M�trique
Solution
Recréer la route qui n'est plus active. Dans l'exemple ci-dessus ça donne :
route add 192.168.64.0 mask 255.255.240.0 192.168.64.1
Automatisation
Le script ci-dessous écrit la commande route
à copier dans powershell admin.
#!/usr/bin/env python3
import sys
import subprocess
# l'interface utilisée par WSL
DEV = 'eth0'
# récupérer le couple addresse/cidr avec ip a
command = f"ip -br -4 a show dev {DEV}"
result = subprocess.run(command.split(), stdout=subprocess.PIPE, universal_newlines=True)
addr_cidr = result.stdout.split()[-1]
(addrString, cidrString) = addr_cidr.split('/')
# séparer l'adresse en octets et transformer le cidr en entier
addr = addrString.split('.')
cidr = int(cidrString)
# calculer le mask à partir du cidr
_mask = [0, 0, 0, 0]
for i in range(cidr):
_mask[i//8] = _mask[i//8] + (1 << (7 - i % 8))
# calculer l'adresse de réseau
_net = [(int(addr[i]) & _mask[i]) for i in range(4)]
# la passerelle
_gateway = _net[0:3] + [1]
mask = ".".join(map(str, _mask))
gateway = ".".join(map(str, _gateway))
net = ".".join(map(str, _net))
print(f"route add {net} mask {mask} {gateway}")