Skip to content

Instantly share code, notes, and snippets.

@MatMercer
Last active August 23, 2022 06:24
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save MatMercer/f7e25b9c8ce7ca40dd3b220346136d23 to your computer and use it in GitHub Desktop.
Save MatMercer/f7e25b9c8ce7ca40dd3b220346136d23 to your computer and use it in GitHub Desktop.
Fix WSL 2 DNS resolution when connected to Cisco AnyConnect VPN
#!/bin/bash
#--------------------------------------------------------------------------------#
# #
# Fix WSL DNS resolution with Cisco AnyConnect #
# #
# ! Don't forget to set this configuration in /etc/wsl.conf: #
# [network] #
# generateResolvConf = false #
# #
# Based on: #
# https://askubuntu.com/a/15856 #
# https://gist.github.com/coltenkrauter/608cfe02319ce60facd76373249b8Aca6 #
# https://gist.github.com/nfekete/7a277bf9e25e89e1c8bfb8b64dcc08ed #
# https://github.com/microsoft/WSL/issues/4277#issuecomment-921087670 #
# #
# Enjoy, ~ Mateus Mercer <contact@matbm.net> 2021 #
# #
#--------------------------------------------------------------------------------#
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
TMP_DIR=`mktemp -d`
TMP_SCRIPT="$TMP_DIR/network-metrics.ps1"
TMP_RESOLV="$TMP_DIR/resolv.conf"
POWERSHELL="powershell.exe"
touch "$TMP_SCRIPT"
# this starts the script as admin in powershell
pcmd="Start-Process -FilePath $POWERSHELL -verb runas -ArgumentList $POWERSHELL,-noprofile,-executionpolicy,bypass,-file,$(wslpath -aw $TMP_SCRIPT)"
# generate the fix script
echo 'Get-NetIPInterface -InterfaceAlias "vEthernet (WSL)" | Set-NetIPInterface -InterfaceMetric 1
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000' > $TMP_SCRIPT
# required to allow windows do read the folder contents
chmod 777 $TMP_DIR
trap ctrlC INT
removeTempFiles() {
# powershell continues in the background, trying to use a file that was deleted. TODO: fix the racing condition
# rm -rf $TMP_DIR
true
}
ctrlC() {
echo
echo "Trapped Ctrl-C, removing temporary files"
removeTempFiles
stty sane
}
echo "Current resolv.conf"
echo "-------------------"
cat /etc/resolv.conf
echo
echo "Creating new resolv.conf"
echo "------------------------"
{
head -1 /etc/resolv.conf | grep '^#.*generated'
for i in `$POWERSHELL -Command "Get-DnsClientServerAddress -AddressFamily ipv4 | Select-Object -ExpandProperty ServerAddresses"`; do
echo nameserver $i
done
tail -n+2 /etc/resolv.conf | grep -v '^nameserver'
} | tr -d '\r' | tee $TMP_RESOLV
(set -x; cp -i $TMP_RESOLV /etc/resolv.conf; set +x)
echo
echo "Fixing network metrics for cisco anyconnect"
echo "-------------------------------------------"
cat $TMP_SCRIPT
# run the network metrics fix script
$POWERSHELL -command "$pcmd"
removeTempFiles
@jayanmn
Copy link

jayanmn commented Aug 23, 2022

This script did work. left a comment in superuser question : https://superuser.com/questions/1630487/no-internet-connection-ubuntu-wsl-while-vpn

I had dangling reference to /etc/resolve.conf. deleted it. Generated file had permission of 600, changed to 644

OS is Windows10 20h2 (enterprise) with Cisco AnyConnect Secure Mobility Client 4.10.04071

I had to use POWERSHELL absolute path
POWERSHELL="/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment