Last active
August 23, 2022 06:24
-
-
Save MatMercer/f7e25b9c8ce7ca40dd3b220346136d23 to your computer and use it in GitHub Desktop.
Fix WSL 2 DNS resolution when connected to Cisco AnyConnect VPN
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 <[email protected]> 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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 644OS 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"