Skip to content

Instantly share code, notes, and snippets.

@coltenkrauter
Last active May 29, 2025 14:20
Show Gist options
  • Save coltenkrauter/608cfe02319ce60facd76373249b8ca6 to your computer and use it in GitHub Desktop.
Save coltenkrauter/608cfe02319ce60facd76373249b8ca6 to your computer and use it in GitHub Desktop.
Fix DNS resolution in WSL2

Permanent WSL DNS Fix (WSL 2.2.1+)

If you're encountering ping github.com failing inside WSL with a Temporary failure in name resolution, you're not alone — this has been a long-standing issue, especially when using VPNs or corporate networks.

This issue is now fixed robustly with DNS tunneling, which preserves dynamic DNS behavior and avoids limitations like WSL’s former hard cap of 3 DNS servers in /etc/resolv.conf.

DNS tunneling is enabled by default in WSL version 2.2.1 and later, meaning that if you're still seeing DNS resolution issues, the first and most effective fix is simply to upgrade WSL. Upgrading WSL updates the WSL platform itself, but does not affect your installed Linux distributions, apps, or files.

To upgrade WSL, follow these steps,

# Run all of the following in a Windows terminal (PowerShell, Command Prompt, etc.)

# 1. Check your current WSL version
wsl --version

# 2. Close all open *WSL windows* — any Linux terminals running via WSL (Ubuntu, Debian, etc.)

# 3. Shut down the WSL subsystem
wsl --shutdown

# 4. Upgrade WSL
wsl --upgrade

# 5. Verify the upgrade was successful (version should now be >= 2.2.1)
wsl --version

# 6. Open your WSL terminal and test
ping github.com

# 🎉 If it works, drop a comment on this Gist and tell us how happy you are.

If needed, explicitly enable tunneling by creating (source):

# C:\Users\<YourUsername>\.wslconfig
[wsl2]
dnsTunneling=true

That’s it. No more messing with /etc/resolv.conf. No more weird hacks!


🧟 Previous Workarounds (for WSL < 2.2.1 or locked-down systems)

Preserved for historical transparency and for users unable to upgrade WSL.

# In WSL
cd /etc
echo "[network]" | sudo tee wsl.conf
echo "generateResolvConf = false" | sudo tee -a wsl.conf

# Back in Windows
wsl --terminate <DistroName>  # or use wsl --shutdown

# Back in WSL
sudo rm -f /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
sudo chattr +i /etc/resolv.conf

If you're using a VPN like Cisco AnyConnect:

Get-NetAdapter | Where-Object { $_.InterfaceDescription -Match "Cisco AnyConnect" } | Set-NetIPInterface -InterfaceMetric 6000

🙌 Credit & Sources

Big thanks to,


If you're still using manual resolv.conf hacks in 2024+, you're solving a problem that's already been solved.

@hrimhari
Copy link

dnsTunneling

The entire fix:

  1. Create .wslconfig under %USERPROFILE%
  2. Add:
[wsl2]
dnsTunneling=true

That's it. According to the documentation, it should be the default. Apparently it is not.

@jankap
Copy link

jankap commented Jan 23, 2025

I have found that with dnsTunneling=true in .wslconfig in windows and generateResolvConf=true in /etc/wsl.conf in wsl (both of which are now the defaults), DNS is working well for me. I had generateResolvConf=false from previous efforts to fix this, which was preventing dnsTunneling from working

dnsTunneling

The entire fix:

  1. Create .wslconfig under %USERPROFILE%
  2. Add:
[wsl2]
dnsTunneling=true

That's it. According to the documentation, it should be the default. Apparently it is not.

I can confirm those posts. Enabling generateResolvConf=true again and putting dnsTunneling=true to .wslconfig works on Windows 11.

@vprudnikov
Copy link

I use WSL2 2.4.10.0.
By using the proposed solution (default setup with the .wslconfig file), I see strange behaviour:
ping google.com works fine, however, after several minutes this command gives ping: connect: Network is unreachable in the output.

The wsl—- shutdown fixes the problem, but I have to do it repeatedly.

I have no VPN, just WiFi at home.

@coltenkrauter
Copy link
Author

If anyone wants to propose changes to the gist, please provide a codebox with the desired state of the gist. (Perhaps we could do it in markdown) and I will gladly credit you for helping.

@euxoa
Copy link

euxoa commented Mar 4, 2025

For Windows novices like me, you can cut-paste this to Powershell and press enter (thanks AI):

@"
[wsl2]
dnsTunneling=true
"@ | Set-Content -Path "$env:USERPROFILE\.wslconfig"

And remember to re-enable autogeneration of resolv.conf (within WSL), and restart WSL (again).

@skudbucket
Copy link

skudbucket commented May 8, 2025

Dear all, happy to say that mentioned above problem is not a problem anymore since version 22H2 with DNS tunneling introduced .

The only step step you need to perform:

* create [.wslconfig](https://learn.microsoft.com/en-us/windows/wsl/wsl-config#wslconfig) file with a following content
[wsl2]
dnsTunneling=true

That's it. We waited for this solution for years. It's enabled by default since WSL 2.2.1

☝️ this was the key for me (thank you @ThePlenkov !).

I'm not sure what triggered the problem for me, but overnight DNS resolution in WSL stopped working for me - in WSL ping github.com failed with errors like ping: github.com: Temporary failure in name resolution, while the same worked fine in Windows. After the above comment put me onto the fact that this was fixed by DNS tunneling, and that this is enabled by default in recent versions of WSL, I was able to fix this with the following steps:

  1. I checked my WSL version by running wsl --version in Powershell in Windows. I was still on 2.1.x
  2. I closed my open WSL Ubuntu terminal
  3. I ran wsl --shutdown
  4. I ran wsl --upgrade
  5. I ran wsl --version to verify that my version had updated (it had, and was now 2.4.x)
  6. I opened a new WSL Ubuntu terminal and ran ping github.com, which now worked 🎉

If anyone wants to propose changes to the gist, please provide a codebox with the desired state of the gist. (Perhaps we could do it in markdown) and I will gladly credit you for helping.

@coltenkrauter I suggest updating the gist to something like:

## Current resolution

This issue is now [fixed robustly with DNS tunneling](https://learn.microsoft.com/en-us/windows/wsl/troubleshooting#networking-considerations-with-dns-tunneling), which preserves dynamic DNS and avoids limitations like having a maximum of 3 DNS servers in `/etc/resolv.conf`.

DNS tunneling is now enabled by default in WSL version 2.2.1 and later, so if you encounter this issue you should be able to fix it by simply upgrading WSL. (Note that upgrading WSL just updates the WSL platform, and does not affect your Linux user data or installed apps.)

To upgrade WSL, follow these steps:
1. Check your current version of WSL: In a Windows terminal (such as Powershell) run `wsl --version`
2. Close any open WSL windows such as Linux terminals
3. Shut down WSL: in your Windows terminal, run `wsl --shutdown`
4. Upgrade WSL: in your Windows terminal, run `wsl --upgrade`
5. Verify that the upgrade succeeded: In your Windows terminal, run `wsl --version` again. The version number shown should now be > 2.2.1
6. Open a new WSL terminal. DNS resolution should now work in WSL. For example, `ping github.com` should now work.

## Previous resolutions
{older resolutions here for posterity/historical context}

@coltenkrauter
Copy link
Author

@skudbucket @ThePlenkov — I have updated this gist to reflect the DNS tunneling fix in 2.2.1+. Clear upgrade steps, legacy hacks moved down. Followed your phrasing with some tweaks. Thanks for raising the bar here. Let me know if you'd like any adjustments.

@skudbucket
Copy link

@skudbucket @ThePlenkov — I have updated this gist to reflect the DNS tunneling fix in 2.2.1+. Clear upgrade steps, legacy hacks moved down. Followed your phrasing with some tweaks. Thanks for raising the bar here. Let me know if you'd like any adjustments.

Thanks for updating it @coltenkrauter ! My only nit is that it might be helpful to some people to be explicit that the commands should be run in a Windows terminal, not a WSL/Linux terminal - probably obvious to many, especially if they understand what the commands do/how the fix works, but especially for people who are a bit out of their depth I imagine it could save them some headache. Overall looks great though, and I appreciate you taking the time to provide this Gist which even before the updates was very helpful

@coltenkrauter
Copy link
Author

@skudbucket @ThePlenkov — I have updated this gist to reflect the DNS tunneling fix in 2.2.1+. Clear upgrade steps, legacy hacks moved down. Followed your phrasing with some tweaks. Thanks for raising the bar here. Let me know if you'd like any adjustments.

Thanks for updating it @coltenkrauter ! My only nit is that it might be helpful to some people to be explicit that the commands should be run in a Windows terminal, not a WSL/Linux terminal - probably obvious to many, especially if they understand what the commands do/how the fix works, but especially for people who are a bit out of their depth I imagine it could save them some headache. Overall looks great though, and I appreciate you taking the time to provide this Gist which even before the updates was very helpful

Good call – just updated. Look better? Any other thoughts?

@skudbucket
Copy link

Good call – just updated. Look better? Any other thoughts?

Looks great!

@Neznakomec
Copy link

Neznakomec commented May 29, 2025

If you're deleting resolv.conf, then you can't get WSL IP address in Windows,
which is good thing for connecting to "vcxsrv" gui

What is strange in my situation, is that
ping github.com works well,
but sudo apt-get update can't resolve domain addresses

My workaround file # C:\Users\<YourUsername>\.wslconfig
looks like this

[experimental]
autoMemoryReclaim=gradual  # gradual | dropcache | disabled
networkingMode=NAT         # mirrored | NAT | None 
dnsTunneling=true
firewall=true
autoProxy=true
[wsl2]
guiApplications=false     #https://forum.xfce.org/viewtopic.php?id=16906

@toyo2333
Copy link

If you're deleting resolv.conf, then you can't get WSL IP address in Windows, which is good thing for connecting to "vcxsrv" gui

What is strange in my situation, is that ping github.com works well, but sudo apt-get update can't resolve domain addresses

My workaround file # C:\Users\<YourUsername>\.wslconfig looks like this

[experimental]
autoMemoryReclaim=gradual  # gradual | dropcache | disabled
networkingMode=NAT         # mirrored | NAT | None 
dnsTunneling=true
firewall=true
autoProxy=true
[wsl2]
guiApplications=false     #https://forum.xfce.org/viewtopic.php?id=16906

running VPN?

@Neznakomec
Copy link

Neznakomec commented May 29, 2025

If you're deleting resolv.conf, then you can't get WSL IP address in Windows, which is good thing for connecting to "vcxsrv" gui
What is strange in my situation, is that ping github.com works well, but sudo apt-get update can't resolve domain addresses
My workaround file # C:\Users\<YourUsername>\.wslconfig looks like this

[experimental]
autoMemoryReclaim=gradual  # gradual | dropcache | disabled
networkingMode=NAT         # mirrored | NAT | None 
dnsTunneling=true
firewall=true
autoProxy=true
[wsl2]
guiApplications=false     #https://forum.xfce.org/viewtopic.php?id=16906

running VPN?

Yes, I have to run OpenVPN-based VPN in host system.

May be I okay with idea to add WSL machine to exclusions,
but I don't know how to do it

@toyo2333
Copy link

If you're deleting resolv.conf, then you can't get WSL IP address in Windows, which is good thing for connecting to "vcxsrv" gui
What is strange in my situation, is that ping github.com works well, but sudo apt-get update can't resolve domain addresses
My workaround file # C:\Users\<YourUsername>\.wslconfig looks like this

[experimental]
autoMemoryReclaim=gradual  # gradual | dropcache | disabled
networkingMode=NAT         # mirrored | NAT | None 
dnsTunneling=true
firewall=true
autoProxy=true
[wsl2]
guiApplications=false     #https://forum.xfce.org/viewtopic.php?id=16906

running VPN?

Yes, I have to run OpenVPN-based VPN in host system.

May be I okay with idea to add WSL machine to exclusions, but I don't know how to do it

networkingMode ,try mirrored

@Neznakomec
Copy link

If you're deleting resolv.conf, then you can't get WSL IP address in Windows, which is good thing for connecting to "vcxsrv" gui
What is strange in my situation, is that ping github.com works well, but sudo apt-get update can't resolve domain addresses
My workaround file # C:\Users\<YourUsername>\.wslconfig looks like this

[experimental]
autoMemoryReclaim=gradual  # gradual | dropcache | disabled
networkingMode=NAT         # mirrored | NAT | None 
dnsTunneling=true
firewall=true
autoProxy=true
[wsl2]
guiApplications=false     #https://forum.xfce.org/viewtopic.php?id=16906

running VPN?

Yes, I have to run OpenVPN-based VPN in host system.
May be I okay with idea to add WSL machine to exclusions, but I don't know how to do it

networkingMode ,try mirrored

Mirrored networking mode is not supported, falling back to NAT. Windows version 19045. 5073 doesn't have required components.

My CMD is showing Microsoft Windows [Version 10.0.19045.5073]

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