<p>Il y a un problème avec le transfert DNS dans WSL2 lors de l’utilisation d’un VPN (<a href="https://github.com/microsoft/WSL/issues/1350">voir le problème GitHub</a>). De plus, il y a un problème avec <em>Cisco AnyConnect</em>. Voici donc une solution de contournement pour ces problèmes. Devrait fonctionner pour Ubuntu et Debian.</p>
<h2><a name="p-26596-solution-de-contournement-nouvelle-automatique-1" class="anchor" href="#p-26596-solution-de-contournement-nouvelle-automatique-1" aria-label="Heading link"></a>Solution de contournement (nouvelle - automatique)</h2>
<p>Cette solution est automatique et a été créée par <strong>EdwardCooke</strong> (voir <a>https://www.frakkingsweet.com/automatic-dns-configuration-with-wsl-and-anyconnect-client/</a>). Ceci n’est que la première partie de sa solution <strong>mettant à jour resolv.conf au démarrage de WSL.</strong></p>
<ul>
<li></li>
</ul>
<p><strong>Réactiver la génération automatique de resolv.conf</strong> (si désactivée)</p>
<p>en commentant la désactivation avec <code>#</code></p>
<pre><code class="lang-auto">sudo nano /etc/wsl.conf
</code></pre>
<p>`#[network]<br>
<span class="hashtag-raw">#generateResolvConf</span> = false</p>
<pre><code class="lang-auto">
Créer le script
`sudo nano /bin/vpn-dns.sh
</code></pre>
<p>`#!/bin/bash</p>
<p>echo “Getting current DNS servers, this takes a couple of seconds”</p>
<p>/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command ’<br>
$ErrorActionPreference=“SilentlyContinue”<br>
Get-NetAdapter -InterfaceDescription “Cisco AnyConnect” | Get-DnsClientServerAddress | Select -ExpandProperty ServerAddresses<br>
Get-NetAdapter | ?{-not ($_.InterfaceDescription -like “Cisco AnyConnect”) } | Get-DnsClientServerAddress | Select -ExpandProperty ServerAddresses<br>
’ | <br>
awk ‘BEGIN { print “# Generated by vpn fix func on”, strftime(“%c”); print } { print “nameserver”, $1 }’ | <br>
tr -d ‘\r’ > /etc/resolv.conf<br>
clear</p>
<pre><code class="lang-auto">
Le rendre exécutable/exécuter en tant que sudo
`sudo chmod +x /bin/vpn-dns.sh
echo "$(whoami) ALL=(ALL) NOPASSWD: /bin/vpn-dns.sh" | sudo tee /etc/sudoers.d/010-$(whoami)-vpn-dns
</code></pre>
<ul>
<li></li>
</ul>
<p>Le faire <strong>s’exécuter</strong> au <strong>démarrage de WSL</strong><br>
echo “sudo /bin/vpn-dns.sh” | sudo tee /etc/profile.d/vpn-dns.sh</p>
<pre><code class="lang-auto">
Vous pouvez également l'exécuter manuellement :sudo /bin/vpn-dns.sh`
Solution de contournement (ancienne - manuelle)
-
Trouver le serveur de noms avec Windows PowerShell (pendant la session VPN)
`nslookup
</code></pre>
<p>Vous obtiendrez l’adresse IPv4 de votre serveur de noms d’entreprise.<br>
Copiez cette adresse.</p>
<ul>
<li></li>
</ul>
<p>Désactiver la génération de <em>resolv.conf</em> <strong>dans WSL :</strong><br>
sudo nano /etc/wsl.conf</p>
<pre><code class="lang-auto">
Copiez ce texte dans le fichier (pour désactiver la génération de resolve.conf au démarrage de WSL)[network]
generateResolvConf = false
</code></pre>
<ul>
<li></li>
</ul>
<p><strong>Dans WSL</strong>, ajoutez votre serveur de noms d’entreprise à <code>resolv.conf</code><br>
`sudo nano /etc/resolv.conf</p>
<pre><code class="lang-auto">
Supprimez les autres entrées et ajoutez l'IP de votre serveur de noms d'entreprise (si vous avez un serveur de noms secondaire, ajoutez-le sur une ligne séparée)
nameserver X.X.X.X (où X.X.X.X est l'adresse obtenue à l'étape 1)
-
Configurez votre adaptateur VPN (si vous utilisez Cisco AnyConnect) ouvrez un PowerShell en tant qu'administrateur
Trouvez le nom de votre adaptateur VPN : Get-NetIPInterface (dans mon cas : "Cisco AnyConnect")
Définissez la métrique de l'adaptateur (remplacez -Match par votre nom), dans mon cas, je dois exécuter ceci après chaque redémarrage ou reconnexion VPN :
`Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
</code></pre>
<p>(<a href="https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/automatic-metric-for-ipv4-routes">Qu’est-ce que la métrique d’interface</a> : utilisée pour déterminer la route, Windows utilise l’interface avec la métrique la plus basse)</p>
<ul>
<li></li>
</ul>
<p>Redémarrez WSL <strong>dans PowerShell</strong> : <code>wsl.exe --shutdown</code></p>
<ul>
<li></li>
</ul>
<p>Testez <strong>dans WSL</strong> en exécutant : <code>wget google.com</code> — si cette commande fonctionne, c’est terminé.</p>
<p>Dans mon cas, j’ai des problèmes DNS quand j’essaie de me connecter à des ressources internes via le navigateur (sous Windows 10, par exemple : intranet), causés par la valeur de métrique élevée définie à l’étape 4 (ce qui désactive essentiellement la route VPN). Voici donc la solution de contournement de la solution de contournement :</p>
<ul>
<li>Vérifiez votre métrique par défaut (de l’interface VPN) <strong>dans PowerShell</strong> (remplacez -Match par le nom de votre interface)</li>
</ul>
<p>`Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match “Cisco AnyConnect”} | Get-NetIPInterface</p>
<pre><code class="lang-auto">
- En cas de problèmes sous Windows 10, restaurez cette valeur par défaut avec PowerShell en tant qu'administrateur (remplacez la valeur à la fin par votre valeur par défaut) :
`Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 1
</code></pre>