Skip to content

Instantly share code, notes, and snippets.

@drankard
Created November 17, 2021 09:15
Show Gist options
  • Save drankard/64cfae56c47152274c416b9d24374d30 to your computer and use it in GitHub Desktop.
Save drankard/64cfae56c47152274c416b9d24374d30 to your computer and use it in GitHub Desktop.
#!/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; yes | cp -i $TMP_RESOLV /etc/resolv.conf; set +x)
cat /etc/resolv.conf
echo
echo "Fixing network metrics for cisco anyconnect"
echo "-------------------------------------------"
cat $TMP_SCRIPT
# run the network metrics fix script
echo "$POWERSHELL"
$POWERSHELL -command "$pcmd"
removeTempFiles
@drankard
Copy link
Author

drankard commented Nov 17, 2021

This script will hack the WSL - >AnyConnect network routing

This order is important

  1. Connect to VPN
  2. Open WSL Linux terminal
  3. Run route_hack.sh (this script)
  4. Test. can you ping www.google.dk

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