-
-
Save coltenkrauter/608cfe02319ce60facd76373249b8ca6 to your computer and use it in GitHub Desktop.
More recent resolution: | |
1. cd ~/../../etc (go to etc folder in WSL). | |
2. echo "[network]" | sudo tee wsl.conf (Create wsl.conf file and add the first line). | |
3. echo "generateResolvConf = false" | sudo tee -a wsl.conf (Append wsl.conf the next line). | |
4. wsl --terminate Debian (Terminate WSL in Windows cmd, in case is Ubuntu not Debian). | |
5. cd ~/../../etc (go to etc folder in WSL). | |
6. sudo rm -Rf resolv.conf (Delete the resolv.conf file). | |
7. In windows cmd, ps or terminal with the vpn connected do: Get-NetIPInterface or ipconfig /all for get the dns primary and | |
secondary. | |
8. With the dns primary and secondary getted replace the numbers in the next step in the X.X.X.X | |
9. echo "nameserver X.X.X.X" | sudo tee resolv.conf (Create resolv.conf and append the line.) | |
10. echo "nameserver X.X.X.X" | sudo tee -a resolv.conf (Append the line in resolv.conf) | |
11. wsl --terminate Debian (Terminate WSL in Windows cmd, in case is Ubuntu not Debian). | |
12. sudo chattr +i resolv.conf | |
13. And finally in windows cmd, ps or terminal: | |
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000 | |
Credit: @MartinCaccia, @yukosgiti, @machuu and @AlbesK: | |
https://github.com/microsoft/WSL/issues/4277 | |
https://github.com/microsoft/WSL/issues/4246 | |
--- | |
Original resoltuion: | |
1. Create a file: /etc/wsl.conf. | |
2. Put the following lines in the file in order to ensure the your DNS changes do not get blown away | |
[network] | |
generateResolvConf = false | |
3. In a cmd window, run wsl --shutdown | |
4. Restart WSL2 | |
5. Create a file: /etc/resolv.conf. If it exists, replace existing one with this new file. | |
6. Put the following line in the file | |
nameserver 8.8.8.8 # Or use your DNS server instead of 8.8.8.8 which is a Google DNS server | |
7. Repeat step 3 and 4. You will see git working fine now. | |
Credit: https://github.com/microsoft/WSL/issues/4285#issuecomment-522201021 |
Sorry I didn't write the correct path. Without the
-f
option it didn't worked?
With the '-f
it seem to have worked. Ihave to confirm once I reboot my PC if it still works.
Do you know if it is one-time use?
The first line ensures that the resolv.conf does not get generated by WSL - which is kinda obvious from the name of the variable, isn't it? ;-)
The second line is the actual change to Google's DNS servers.
So yes, it's a one-time thing.
Do you know if it is one-time use?
The first line ensures that the resolv.conf does not get generated by WSL - which is kinda obvious from the name of the variable, isn't it? ;-) The second line is the actual change to Google's DNS servers. So yes, it's a one-time thing.
Before only that was not working, despite the obvious, of course, but I admit that perhaps there had been some update in the WSL
that now obeys the configuration. So at the time I had to have to use the sudo chattr -f +i /etc/resolv.conf
. I never needed to repeat the commands anymore.
Using WSL 2, after:
- Adding
generateResolvConf = false
in/etc/wsl.conf
. - Shutdown WSL by issuing
wsl --shutdown
- Unlink resolv.conf
unlink /etc/resolv.conf
I was able to create /etc/resolv.conf
and add nameserver 8.8.8.8
.
There was no need for a firewall rule in Windows or the use of chattr +i
in my case.
I got it eventually working. So what is this fuss all about?
It's just that wsl
cannot figure out which DNS nameserver to use. Therefore, all that needs to be done is to
- manually adjust the DNS nameserver to use (/etc/resolv.conf)
- ensure that
wsl
sticks with your manual adjustment, i.e. prevent /etc/resolv.conf from being overridden
To get a list of nameservers around you do:
rem cmd.exe
ipconfig /all
and search for 'DNS Servers' within the listed network adapters. Blindly using 8.8.8.8
does not make any sense and I really question why someone even gives such an 'hardcoded' advice.
Next, ensure that /etc/wsl.conf
contains the line generateResolvConf = false
to ensure that handcrafted DNS nameserver is untouched.
By default -- on wsl -- /etc/resolv.conf is linked to a generated file. Therefore you may want to 'unlink' /etc/resolv.conf before changing.
Eventually "restart" wsl
to get your changes effective. Usually done like sudo systemctl restart networking
and friends. Not working in wsl
. Therefore do something like
wsl --terminate <Ubuntu|Debian|whatever> ;; stop
wsl -d <Ubuntu|Debian|whatever> ;; start
Yes, you can also use wsl --shutdown
to kill all running distributions. Not polite cause it may also kill your local Docker as collateral damage.
Blindly using
8.8.8.8
does not make any sense and I really question why someone even gives such an 'hardcoded' advice.
Why? Pretty simple: If someone cares enough about which DNS they use, they should have absolutely no issue understanding what that command does, and how it can be changed to any other DNS IP they prefer.
But for all those "ONOES! Y U NO WERKY? HALP! KTHXBYE" type of people, using 8.8.8.8 should be good enough.
So yes, this does make a whole fucking lot of sense, no matter how much you question it.
Using WSL 2, after:
* Adding `generateResolvConf = false` in `/etc/wsl.conf`. * Shutdown WSL by issuing `wsl --shutdown` * Unlink resolv.conf `unlink /etc/resolv.conf`
I was able to create
/etc/resolv.conf
and addnameserver 8.8.8.8
. There was no need for a firewall rule in Windows or the use ofchattr +i
in my case.
I had to repeat all this weird behavior, due a Windows 11
update and I couldn't make any updates again. So with your information about only using unlink /etc/resolv.conf
doesn't work att all, because after you close and reopen the distro, the /etc/resolv.conf
doesn't exist anymore. Also the command wsl --shutdown
doesn't make sense because it will close the distro and when you reopen the /etc/resolv.conf
is already deleted. So, only with the sudo chattr -f +i /etc/resolv.conf
prevents it from been deleted. Done this to all of my distros and all is working well.
chattr +i
is useful for protection from accidental deletion by root. Also an immutable file cannot be renamed or moved from one directory to another.
For the chattr -f
see this my comment https://gist.github.com/coltenkrauter/608cfe02319ce60facd76373249b8ca6?permalink_comment_id=4466805#gistcomment-4466805
Using WSL 2, after:
* Adding `generateResolvConf = false` in `/etc/wsl.conf`. * Shutdown WSL by issuing `wsl --shutdown` * Unlink resolv.conf `unlink /etc/resolv.conf`
I was able to create
/etc/resolv.conf
and addnameserver 8.8.8.8
. There was no need for a firewall rule in Windows or the use ofchattr +i
in my case.I had to repeat all this weird behavior, due a
Windows 11
update and I couldn't make any updates again. So with your information about only usingunlink /etc/resolv.conf
doesn't work att all, because after you close and reopen the distro, the/etc/resolv.conf
doesn't exist anymore. Also the commandwsl --shutdown
doesn't make sense because it will close the distro and when you reopen the/etc/resolv.conf
is already deleted. So, only with thesudo chattr -f +i /etc/resolv.conf
prevents it from been deleted. Done this to all of my distros and all is working well.chattr +i
is useful for protection from accidental deletion by root. Also an immutable file cannot be renamed or moved from one directory to another. For thechattr -f
see this my comment https://gist.github.com/coltenkrauter/608cfe02319ce60facd76373249b8ca6?permalink_comment_id=4466805#gistcomment-4466805
I should've mentioned I am running Windows 10. My bad!
resolv.conf worked for me but after 10s DNS stops working again. I'm so confused
resolv.conf worked for me but after 10s DNS stops working again. I'm so confused
Please describe all the steps you did.
Thankyou
More recent resolution
worked for me.
thank you,More recent resolution worked for me.
You are the best after 2 hours searching for a solution. you solve it in simple way thank you
DNS on WSL2 STILL JUST BREAKS: CLOSING THOUSANDS OF BUG REPORTS ON THIS 10 YEAR OLD BUG (WHICH IS NOT FIXED) IS WEIRD!
I have implemented that hard coded DNS solution (above) and it is a lot better, but WSL2 still looses it's DNS even if you disconnect briefly and reconnect your IPsec VPN. Once that happens still have to reboot. (I am running WSL2 on top end Dell laptop with up-to-date bios and Windows 10.)
When running ordinary applications under Windows or on a Linux PC, any disconnection of the network and reconnection allows all applications to reconnect to the network no problem; not so with WSL! When running WSL, DNS resolution is lost even with a brief disconnection or the lease time on the network driver laps and reconnects, after that you can’t connect or even ping devices unless you reboot!
Even with millions of complaints, and thousands of bug reports, this bug has been persistent for almost a decade and NOT FEXED IN JULY 2023! This is so serious many developers avoid all Docker development under WSL and Windows. When Windows programmers write Linux network code, what could possibly go wrong?
WSL team members even close bug reports rather than combine the data from thousands of similar reports. When reports are closed so that others can’t comment the geniuses have magically fixed the major bug right? NOT! The use of Docker Desktop makes it 100 times worse, but fortunately Docker Desktop is NOT Docker and many people run WSL2 without Docker Desktop.
Damn, I was following this instruction but somehow I broke my wsl.
My ~ folder has changed and I can't find my files. It seems it is now logging in as a root user, i don't think it was doing that before
Damn, I was following this instruction but somehow I broke my wsl. My ~ folder has changed and I can't find my files. It seems it is now logging in as a root user, i don't think it was doing that before
I fixed it!
Just enter: ubuntu config --default-user YOUR_USERNAME
The user was still there! It was just logging in always as root now for some reason.
Here is my solution for this problem. Basically I have accumulated everything mentioned above:
https://gist.github.com/ThePlenkov/6ecf2a43e2b3898e8cd4986d277b5ecf
- script removes all nameservers in /etc/resolv.conf and replaces them with actual IPs from powershell
sudo sed -i '/nameserver/d' /etc/resolv.conf
powershell.exe -Command '(Get-DnsClientServerAddress -AddressFamily IPv4).ServerAddresses | ForEach-Object { "nameserver $_" }' | tr -d '\r' | sudo tee -a /etc/resolv.conf > /dev/null
- script is configured as a boot command which is available in Win 11. If it's applicable for you - it helps a lot
@ThePlenkov That worked for me, thanks!
@ThePlenkov Superb. Great instruction, efficient solution!
Excellent, thanks so much.
That's all you need:
echo -e "[network]\ngenerateResolvConf = false\n" | sudo tee /etc/wsl.conf echo -e "nameserver 8.8.8.8\n" | sudo tee /etc/resolv.conf
No reboots, no restarts, no line-by-line appending, no messing with non-existent Cisco AnyConnect interfaces. Just those two lines and you're good to go.
Again, this is Linux, not Windows. You don't need to reboot/restart just because you changed your nameserver...
Thanks, this answer is really clean and on point.
Thanks for the help. This worked for me.
BILLION DOLLAR MICROSOFT WSL BUG FIXED AFTER 13 YEARS = WSL DNS Network Failure with VPNs resulted in A TOTAL REWRITE OF WSL2 by October 2023 - PING FAILED IN WSL
Expect this WSL2 broken DNS related issues (above) to be fixed from October 2023.
N.B. Now you have to change all your WSL Linux Network configs to match the totally new design.
Eventually fixed mentioned here
Why be so angry? When I said it cost MICROSOFT BILLIONS over 13 years you laughed at me. I was right - TOTALLY VINDICATED - THIS BUG STUNG THEIR BIGGEST CUSTOMERS THE MOST SO THAT WSL WAS REJECTED! The extent to which WSL was rejected by ALL the biggest companies is staggering! Hell they all used VPNs and Docker! Thousands of the SAME bug reports GOT CLOSED BY GENIUSES that can't fix the bug or bother to reproduce it and FALSELY CLAIM "UNABLE TO REPRODUCE". The bug was there for 13 years breaking WSL1 and Microsoft biggest customers who use compulsory VPNs which broke WSL2 networking DNS and a primary symptom was Ping failures.
- This bug occurred RANDOMLY because WSL2 Network/Subnet settings WERE DELIBERATLY RANDOM - RIGHT IN THE DESIGN! NO JOKE!
- Most bugs are fixed by minor upgrades but this bug was fully rooted in the design, they had to rip WSL NETWORK GARBAGE CODE out and start over!
- The bug was TOTALLY IGNORED BY GENEUSES FOR OVER A DECADE! GENIUSES KEPT ON AND ON CLOSING BUG REPORTS!
- I started to realise that this bug revealed MONSTER SECURITY HOLES IN WSL NETOWRKS making it totally insecure. NOW THEY DID NOT IGNORE ME, STOPPED RIDICULING ME!
- So in 2023 they rewrote the hole of WSL2 Network configuration which was more than a mess: it was a pile ...
ORIGINAL SYMPTOMS of WSL2 Networks Breaking with VPNs RANDOMLY WORKING
ROOT CAUSE - BECAUSE WSL1 & WSL2 RANDOMLY SELECT SUBNETS, SO THE CORPORATIONS VPN (firewall) REJECTS SOME OF THEM - RANOMLY - NOT THE CORPORATIONS FAULT!
DNS on WSL2 WITH VPNs JUST BREAKS: CLOSING THOUSANDS OF BUG REPORTS ON THIS 10 YEAR OLD BUG (WHICH IS NOT FIXED FOR SUCH A LONG TIME) IS WEIRD!
Some 20 solutions claim to work but the root cause of why the bug keeps getting closed and then reopened is that WSL2 network WORKS RANDOMLY - THIS IS BY DESIGN BECAUSE WSL2 RANDOMLY SELECTS A SUBNET!!!!!!!!!!!!!!!! thus WSL2 still looses it's DNS even if you disconnect briefly and reconnect your IPsec VPN ( RANDOM SUBNET IS CHOSEN ). Once the wrong random subnet is REJECTED by the corporations VPN you still have to reboot. (I am running WSL2 on top end Dell laptop with up-to-date bios and Windows 10.)
When running ordinary applications under Windows or on a Linux PC, any disconnection of the network and reconnection allows all applications to reconnect to the network no problem; not so with WSL! When running WSL, DNS resolution is lost even with a brief disconnection or the lease time on the network driver laps and reconnects, after that you can’t connect or even ping devices unless you reboot!
Even with millions of complaints, and thousands of bug reports, this bug has been persistent for almost a decade and NOT FEXED IN JULY 2023! This is so serious many developers avoid all Docker development under WSL and Windows. When Windows programmers write Linux network code, what could possibly go wrong?
WSL team members even close bug reports rather than combine the data from thousands of similar reports. When reports are closed so that others can’t comment the geniuses have magically fixed the major bug right? NOT! The use of Docker Desktop makes it 100 times worse, but fortunately Docker Desktop is NOT Docker and many people run WSL2 without Docker Desktop.
@KonanTheLibrarian this solution works in WSL2 with vpn very smoothly (especially on win11). https://gist.github.com/ThePlenkov/6ecf2a43e2b3898e8cd4986d277b5ecf
But in general I share your frustration. I'd also prefer if generateResolvConf is fixed by taking the right DNS, also including VPN connections.
It works!!!
Just follow the 1~13 steps
The provided steps worked great, thank-you! I utilized Google’s DNS (8.8.8.8/8.8.4.4) and the fix worked like a charm. 🤘
The "More recent resolution" worked.
Didn't run step 13 though.
For the benefits WSL provide, what a mess this issue is... Thank for the solution.
I like this approach.
Makes /root/resolv.conf.sh executable using wsl.conf boot command
Deletes the /etc/resolv.conf file on start-up
Runs the script /etc/resolv.conf.sh and populated with DNS servers from the script.
Change the servers as desired: DNS_SERVERS=("9.9.9.9" "1.1.1.1" "8.8.8.8")
Outputs a log file to /root/resolv.conf.log
vi /etc/wsl.conf
[boot]
command = /bin/bash chmod +x /root/resolv.conf.sh; /bin/bash /root/resolv.conf.sh > /root/resolv.conf.log 2>&1
systemd=true
[network]
generateResolvConf = false
vi /root/resolv.conf.sh
#!/bin/bash
# Specify the DNS servers
DNS_SERVERS=("9.9.9.9" "1.1.1.1" "8.8.8.8")
# Log file path
LOG_FILE="/root/resolv.conf.log"
# Delete the existing /etc/resolv.conf
sudo rm /etc/resolv.conf
# Create or update the /etc/resolv.conf file
for server in "${DNS_SERVERS[@]}"; do
echo "nameserver $server" | sudo tee -a /etc/resolv.conf
done
# Log the changes to the specified log file
echo "DNS servers updated: $(date)" | sudo tee -a "$LOG_FILE"
I like this approach.
Makes /root/resolv.conf.sh executable using wsl.conf boot command Deletes the /etc/resolv.conf file on start-up Runs the script /etc/resolv.conf.sh and populated with DNS servers from the script. Change the servers as desired: DNS_SERVERS=("9.9.9.9" "1.1.1.1" "8.8.8.8") Outputs a log file to /root/resolv.conf.log
vi /etc/wsl.conf
[boot] command = /bin/bash chmod +x /root/resolv.conf.sh; /bin/bash /root/resolv.conf.sh > /root/resolv.conf.log 2>&1 systemd=true
vi /boot/resolv.conf.sh
#!/bin/bash # Specify the DNS servers DNS_SERVERS=("9.9.9.9" "1.1.1.1" "8.8.8.8") # Log file path LOG_FILE="/root/resolv.conf.log" # Delete the existing /etc/resolv.conf sudo rm /etc/resolv.conf # Create or update the /etc/resolv.conf file for server in "${DNS_SERVERS[@]}"; do echo "nameserver $server" | sudo tee -a /etc/resolv.conf done # Log the changes to the specified log file echo "DNS servers updated: $(date)" | sudo tee -a "$LOG_FILE"
Works great! Just a typo in the path of the script /boot/resolv.conf.sh
should be /root/resolv.conf.sh
, right?
What is this solution to? I am switching back to windows+WSL after abandoning it (due to various networking nags), and I remember from a few years ago that I had to toggle this resolv.conf between public DNS servers and corporate DNS server when the windows host is off VPN.
@bayeslearner
The solution from @teeesss fixes the issue of failing DNS because of conflicts with the IP directions randomly assigned and instead using public DNS. Just make sure to have this in /etc/wsl.conf
:
[network]
generateResolvConf = false
Here is my solution for this problem. Basically I have accumulated everything mentioned above: https://gist.github.com/ThePlenkov/6ecf2a43e2b3898e8cd4986d277b5ecf
- script removes all nameservers in /etc/resolv.conf and replaces them with actual IPs from powershell
sudo sed -i '/nameserver/d' /etc/resolv.conf powershell.exe -Command '(Get-DnsClientServerAddress -AddressFamily IPv4).ServerAddresses | ForEach-Object { "nameserver $_" }' | tr -d '\r' | sudo tee -a /etc/resolv.conf > /dev/null
- script is configured as a boot command which is available in Win 11. If it's applicable for you - it helps a lot
This works for me! Thank you so much!
Here is my solution for this problem. Basically I have accumulated everything mentioned above: https://gist.github.com/ThePlenkov/6ecf2a43e2b3898e8cd4986d277b5ecf
- script removes all nameservers in /etc/resolv.conf and replaces them with actual IPs from powershell
sudo sed -i '/nameserver/d' /etc/resolv.conf powershell.exe -Command '(Get-DnsClientServerAddress -AddressFamily IPv4).ServerAddresses | ForEach-Object { "nameserver $_" }' | tr -d '\r' | sudo tee -a /etc/resolv.conf > /dev/null
- script is configured as a boot command which is available in Win 11. If it's applicable for you - it helps a lot
thanks it worked for me
Didn't work like a charm. Thank so much
So here is my configuration
Version WSL : 2.1.5.0
Version du noyau : 5.15.146.1-2
Version WSLg : 1.0.60
Windows 11 version : 23h2 22631.3296
I don't know how it happened, but from the day to the next it stopped working.
I did the original resolution, but putting my router's ip worked.
Original resoltuion:
1. Create a file: /etc/wsl.conf.
2. Put the following lines in the file in order to ensure the your DNS changes do not get blown away
[network]
generateResolvConf = false
3. In a cmd window, run wsl --shutdown
4. Restart WSL2
5. Create a file: /etc/resolv.conf. If it exists, replace existing one with this new file.
6. Put the following line in the file
nameserver 8.8.8.8 # Or use your DNS server instead of 8.8.8.8 which is a Google DNS server
7. Repeat step 3 and 4. You will see git working fine now.
I noticed that the IP that's in the /etc/resolv.conf
is the one indicated here (ipconfig /all)
Which is apparently the WSL Hyper-V firewall....
would it mean that the issue lies in the "forwarding" or letting through of that Hyper V firewall and the host ? at least for dns, the traceroute seemed to work fine
Maybe this will help someone (source)
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultOutboundAction Allow
As @gtedavid mentioned it seems like Hyper-V is blocking some outbound connection by default, for whatever reason.
My setup is with Mullvad VPN. I am also using Windows Firewall Control tool by Malwarebytes.
To add my Mullvad VPN DNS server to WSL, do ipconfig.exe /all and grab the DNS address under your VPN name. Then sudo nano /etc/resolv.conf and add:
nameserver <IPHERE>
I did have to set Local network sharing ON, on Mullvad VPN settings. Try that if you still have issues and you're using a VPN.
Sorry I didn't write the correct path. Without the
-f
option it didn't worked?Edit:
The
-f
(force) flag is really needed if we want to make all the process at once in the same instance, otherwise this error is raisedchattr: Operation not supported while reading flags on /etc/resolv.conf
. The-f
isn't needed if we exit the distro without executing thechattr
command and reopen again, we will find that the/etc/resolv.conf
was deleted. Then we must recreate it again with the nameserver and in this case the-f
isn't needed. So, my advice is doing all this at once before close the distro by using the -f flag.