Utiliser WSL2 dans un environnement professionnel
En 2019, Microsoft opère une vraie révolution dans le monde de l'informatique grand public en publiant la version 2 de son logiciel WSL pour Windows 10. Celle-ci permet en effet d'embarquer le noyau Linux dans l'OS propriétaire intégré à la quasi-totalité des ordinateurs vendus dans le monde, ouvrant ainsi la voie à de nombreux projets. Si comme moi vous utilisez WSL2 dans un contexte professionnel (en remplacement de l'honnorable Putty par exemple), vous serez peut-être frustré par quelques points de détail qui gâchent la vie au quotidien, comme l'impossibilité de faire un ping ou d'utiliser des serveurs DNS et domaines de recherche locaux, ou l'impossibilité de capturer les liens ssh://
. Voici les solutions, testées et validées pour Debian et Ubuntu.
ping: socket: Operation not permitted
Si vous ne parvenez pas à effectuer un ping depuis votre environnement WSL2, c'est probablement parce que la capacité cap_net_raw
n'est pas permise (pour en savoir plus sur les capacités sous Linux, jetez un œil à la documentation Connect dédiée). Pour y remédier, éxecutez simplement la commande suivante (vous devrez saisir votre mot de passe) :
sudo setcap cap_net_raw+p /bin/ping
Résolution de noms via serveurs DNS privés et domaine de recherche implicites
Qui dit environnement informatique professionnel dit bien souvent domaine et/ou serveur DNS privés. Malheureusement, les machines tournant sous WSL2 n'héritent pas de la configuration de la carte réseau hôte. Impossible alors de contacter votre serveur interne avec son petit nom car vous interrogez un serveur public et que l'OS ne connait pas les domaines de recherche implicite :
Pour personnaliser les serveurs que vous interrogez et indiquer un ou plusieurs domaines de recherche implicite, il faut créer le fichier /etc/resolv.conf
, indiquer à l'OS de l'utiliser et lui interdire de le modifier pour éviter toute mauvaise surprise lors d'une mise à jour ultérieure de WSL2 ou de l'OS.
Désactiver la configuration automatique
Par défaut, le système créera automatiquement le fichier de configuration /etc/resolv.conf
contenant les DNS à interroger. Pour modifier ce comportement, créez le fichier /etc/wsl.conf
dans votre shell Linux et saisissez les lignes suivantes :
[network]
generateResolvConf = false
Redémarrez ensuite WSL2 en lançant la commande wsl --shutdown
dans une invite de commande Windows. Ceci fermera le shell Linux
Configurer le serveur DNS et le domaine de recherche
Relancez votre shell Linux et créez/modifiez le fichier /etc/resolv.conf
en y saisissant vos réglages. Pour chaque serveur DNS, une ligne nameserver
est requise. La ligne domain
indique le domaine auquel appartient votre ordinateur (facultatif) et la ligne search
comprend les domaines à utiliser pour la résolution implicite (les domaines de recherche sont à séparer par un espace) :
nameserver 192.168.0.20
nameserver 192.168.0.21
domain mycompany.lan
search mycompany.lan mybranch.mycompany.lan
Vérouiller la configuration
Afin d'éviter toute modification de ce fichier (par un utilisateur ou par le système), utilisez la commande suivante qui le rendra immuable :
sudo chattr +i /etc/resolv.conf
Pour dévérouiller ce fichier à l'avenir, il suffira d'utiliser le paramètre -i
à la place de +i
.
Bonus : Capturer les liens ssh:// avec Windows Terminal
Autre belle évolution du système d'exploitation aux quatre couleurs : la sortie de l'application Terminal qui vient remplacer la vieillissante invite de commande en lui ajoutant tout un tas de fonctionnalités et permet d'ouvrir directement un shell Linux. Vous utilisez Windows Terminal et souhaitez y ouvrir les liens ssh://
via WSL2 ? Si vous utilisez Debian ou Ubuntu dans WSL2, vous pouvez copier le texte ci-dessous dans un fichier .reg et l'éxecuter en tant qu'administrateur sur Windows :
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ssh]
@="URL: ssh Protocol"
"URL Protocol"=""
;Protocol handler command
[HKEY_CLASSES_ROOT\ssh_custom_handler\shell\open\command]
@="\"C:\\Windows\\System32\\cmd.exe\" /k SET TARGETHOST=%1 && CALL SET T2=%%TARGETHOST:~6,-2%% && CALL \"%%LOCALAPPDATA%%\\Microsoft\\WindowsApps\\debian.exe\" run /bin/bash -c '/usr/bin/ssh %%T2%%'"
;default apps registration
[HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications]
"SSH Custom handler"="Software\\Classes\\ssh_custom_handler\\Capabilities"
;Declare app capabilities
[HKEY_CLASSES_ROOT\ssh_custom_handler\Capabilities\UrlAssociations]
"ssh"="ssh_custom_handler"
;Protocol handler registration
[HKEY_CLASSES_ROOT\ssh_custom_handler\Application]
"ApplicationIcon"="\"C:\\Program Files\\WindowsApps\\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\\debian.exe\""
"ApplicationName"="WSL Debian SSH Handler"
"ApplicationDescription"="WSL Debian SSH Handler"
"ApplicationCompany"="WSL Debian SSH Handler"
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ssh]
@="URL: ssh Protocol"
"URL Protocol"=""
;Protocol handler command
[HKEY_CLASSES_ROOT\ssh_custom_handler\shell\open\command]
@="\"C:\\Windows\\System32\\cmd.exe\" /k SET TARGETHOST=%1 && CALL SET T2=%%TARGETHOST:~6,-2%% && CALL \"%%LOCALAPPDATA%%\\Microsoft\\WindowsApps\\ubuntu.exe\" run /bin/bash -c '/usr/bin/ssh %%T2%%'"
;default apps registration
[HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications]
"SSH Custom handler"="Software\\Classes\\ssh_custom_handler\\Capabilities"
;Declare app capabilities
[HKEY_CLASSES_ROOT\ssh_custom_handler\Capabilities\UrlAssociations]
"ssh"="ssh_custom_handler"
;Protocol handler registration
[HKEY_CLASSES_ROOT\ssh_custom_handler\Application]
"ApplicationIcon"="\"C:\\Program Files\\WindowsApps\\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\\ubuntu.exe\""
"ApplicationName"="WSL Ubuntu SSH Handler"
"ApplicationDescription"="WSL Ubuntu SSH Handler"
"ApplicationCompany"="WSL Ubuntu SSH Handler"
Il s'agit ici de créer une clé de registre qui va configurer Windows pour ouvrir les liens ssh://
avec un shell Linux via l'application Windows Terminal. Le résultat parle de lui-même :