There are tons of gists available for this problem:
However even solution is there - I was not satisfied that this problem always persists and I had to do same steps again from time to time. Also using a static DNS like 8.8.8.8 was not the option for me because we use pool of enterprise DNS servers and those are controlled by our IT on our Windows machines. So I wanted to find the way to get those DNS servers dynamically from Windows.
This guide describes the permanent solution using brand-new WSL boot command.
This gist removes nameservers every time your WSL starts and adds newly from powershell results. If it doesn't work for you - please feel free to adjust the script according to your needs.
- login to your wsl and run
sudo bash
. It's important that you do this with a root user because it's a user which executes this command during boot - change to ~ folder ( or use any folder you like )
- create a new file for example
boot.sh
and update it with a content from boot.sh gist - make it executable with
chmod +x boot.sh
- create a symbolic link in one of PATH folders ( keep in mind, that for root user number of path folders is very limited by default )
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
- i have used
ln -s ~/boot.sh /usr/local/bin/boot.sh
- having such a limited list of folders makes root not aware of powershell.exe and rest of window utilities. I have preferred to use an absolute path like
/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe
in my script - but you may think of creating a symlink for powershell too. - now let's add boot command to
/etc/wsl.conf
file. In my case it looks like this:
[network]
generateResolvConf=false
[boot]
systemd=true
command=boot.sh
- now just
exit
from bash, from wsl as well. Terminate your wsl with a command likewsl -t Ubuntu
and start again - if everything went well
cat /etc/resolv.conf
should have nameservers from your Windows
@ThePlenkov
Finally, I arrived here like so man others and find your solution very helpful - thank you for that! ❤️
Do you have an idea if it is possible to update
resolv.conf
even more programmatically, i.e. not only when booting the WSL distribution but also when enabling a WireGuard tunnel or engaging anther one?I observed the following (hence my question):
The update happens only (and expectedly) when the WSL distribution is booted, not when I login via e.g. Microsoft terminal. However, when I fiddle with my Windows WireGuard tunnel (switching it on after the WSL distribution has been started), then no update happens. Would it make sense to put your code also in e.g.
.profile
, so it is called with every login? I can try this myself, of course, but would like to hear your thoughts in case there are some unwanted side effects etc. Furthermore, it would be nice if a nameserver from a WireGuard tunnel would be programmatically removed from the WSL distribution's/etc/resolv.conf
if the tunnel is closed/WG switched off. I lack the knowledge to try this right away, so hearing back from you if this is feasible and if it makes sense at all, would be great. Thanks for your time and for sharing your thoughts! 👍PS:
Sometimes, opening a WSL distribution from the Microsoft terminal drop-down menu takes longer, and in these cases, the distribution seems to be booted anew; therefore,
resolv.conf
is updated as wanted. However, sometimes, closing the WSL distribution tab and picking it again from the drop-down list opens it quickly, i.e. no booting; then, no update happens.