- Вопрос или проблема
- исправление проблемы с dns wsl windows
- Шаги для исправления
- Ответ или решение
- Проблема с DNS в WSL: Возможные решения и рекомендации
- 1. Понимание конфигурации DNS в WSL
- 2. Настройка WSL для использования постоянного DNS
- 3. Проверка взаимодействия с VPN
- 4. Изменение параметров WSL
- 5. Ручная настройка DNS с использованием systemd
- Заключение
Вопрос или проблема
В настоящее время я использую сборку Insider Windows 11. (22458)
Однако у меня была эта проблема несколько раз на других сборках. (и wsl работал ранее)
Когда я запускаю wsl, я не могу сделать DNS-запрос. (Пинговать IP-адрес напрямую работает.)
Я выявил эту проблему в файле: /etc/resolv.conf
Он содержит адрес DNS-сервера.
По умолчанию: 172.22.192.1
Однако этот не работает.
Если я изменяю его на 1.1.1.1 (DNS Cloud Flare), он снова работает.
Тем не менее, после каждой перезагрузки wsl он снова меняет его на значение по умолчанию.
Есть файл под названием wsl.conf, в котором я могу отключить генерацию этого файла, но он всегда просто удаляет файл полностью после каждой перезагрузки.
Как я могу это исправить?
Первая идея заключалась в полном сбросе wsl, но ни сброс приложения, ни переустановка WSL через функции это не исправили.
У кого-то есть другая идея, что делать?
Как указывают большинство ответов, создание следующих конфигурационных файлов и последующая перезагрузка WSL должны быть достаточными:
/etc/wsl.conf
[network]
generateResolvConf = false
/etc/resolv.conf
nameserver 8.8.8.8
Тем не менее, по какой-то причине мой resolv.conf
продолжает пересоздаваться при каждой загрузке.
Поэтому мне пришлось сделать его не изменяемым, вот так:
sudo chattr +i /etc/resolv.conf
Эта проблема меня беспокоила много раз, и в итоге я сделал этот простой вспомогательный код:
Это проблема с WSL, а не с Ubuntu или Windows. Существует множество решений, лучшее, которое я нашел https://gist.github.com/coltenkrauter/608cfe02319ce60facd76373249b8ca6
Он также включает информацию о VPN, но шаги работают и без VPN.
Запустите эти команды в терминале Ubuntu.
cd ~/../../etc # Перейти в папку etc в WSL. echo "[network]" | sudo tee wsl.conf # Создать файл wsl.conf и добавить первую строку. echo "generateResolvConf = false" | sudo tee -a wsl.conf # Добавить следующую строку в wsl.conf. wsl --terminate Debian # Завершить WSL в командной строке Windows, если ОС Ubuntu, а не Debian. cd ~/../../etc # Перейти в папку etc в WSL. sudo rm -Rf resolv.conf # Удалить файл resolv.conf.
В командной строке Windows, PowerShell или терминале с подключённым VPN выполните:
Get-NetIPInterface
илиipconfig /all
для получения основных и вторичных DNS.С основными и вторичными DNS, полученными на шаге 2, замените числа в следующем шаге на X.X.X.X
echo "nameserver X.X.X.X" | sudo tee resolv.conf
(Создайте resolv.conf и добавьте строку.)
echo "nameserver X.X.X.X" | sudo tee -a resolv.conf
(Добавьте строку в resolv.conf)
wsl --terminate Debian
(Завершите WSL в командной строке Windows, если это Ubuntu, а не Debian).
sudo chattr +i resolv.conf
Наконец, в командной строке Windows, PowerShell или терминале:
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
Кредит: @MartinCaccia, @yukosgiti, @machuu и @AlbesK:
https://github.com/microsoft/WSL/issues/4277
https://github.com/microsoft/WSL/issues/4246
исправление проблемы с dns wsl windows
-
Внутри WSL2 создайте или добавьте файл: /etc/wsl.conf
-
Добавьте следующие строки в файл, чтобы убедиться, что ваши изменения DNS не будут потеряны
echo "[network]" | sudo tee /etc/wsl.conf echo "generateResolvConf = false" | sudo tee -a /etc/wsl.conf
-
В окне cmd выполните
wsl --shutdown
-
Запустите WSL2
-
Запустите следующее внутри WSL2
sudo rm -rf /etc/resolv.conf sudo cat << EOF > /etc/resolv.conf search domain.local nameserver 8.8.8.8 nameserver 1.1.1.1 EOF
Новые экспериментальные флаги функции (dnsTunneling, mirrored) для WSL 2 исправляют эту давнюю проблему с разрешением DNS, когда вы используете VPN, который не допускает разделения туннелирования, как указано в нижеследующих статьях,
https://github.com/jacob-pro/wsl2-dns-agent (спасибо jacob-pro)
https://devblogs.microsoft.com/commandline/windows-subsystem-for-linux-september-2023-update/
Шаги для исправления
-
Добавьте файл .wslconfig, если он отсутствует в каталоге C:\Users%username%\ и добавьте конфигурации экспериментального флага функции, чтобы включить их.
winget install GNU.nano
Опциональный шаг для редактирования текстового файла в CLI с использованием nanonano .wslconfig
Опциональный шаг для редактирования текстового файла в CLI с использованием nanoCTRL + X
для выхода и сохранения изменений.Добавьте содержимое ниже в файл (описание каждого экспериментального флага указано в приведенной выше статье Microsoft)
[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
-
Перезапустите WSL2.
wsl --shutdown
Разрешение DNS WSL2 начало работать после вышеуказанных шагов.
Послесловие. Я на Windows 11 (Версия 23H2).
WSL получает свой IP-адрес (а также данные о DNS-сервере, маске подсети и другую информацию) от DHCP-сервера Windows. Исправьте это в Windows или исправьте DNS-сервер на 172.22.192.1.
Это проблема Windows, а не проблема Ubuntu.
И нет, я не знаю, как Windows делает DHCP.
В моем случае я использовал VPN Cisco AnyConnect, и контейнер WSL был заблокирован от внешнего мира. Я отключил VPN-соединение, и все заработало, как и ожидалось. Поэтому будьте осторожны, что подключение VPN не позволяет WSL видеть внешний мир на момент публикации этого сообщения.
ПРЕДУПРЕЖДЕНИЕ!!! ЭТО УДАЛИТ ВАШ WSL
В моем случае изменение wsl.conf и resolve.conf просто больше не сработало. В конце концов я удалил дистрибутив wsl с помощью команды:
wsl --unregister <имя-дистрибутива>
Затем я открыл магазин Microsoft и установил ubuntu 22.04. Там все сработало «из коробки».. в конце концов, после нескольких часов попыток исправить.
У меня была эта проблема, когда я переключился на systemd вместо доброго старого init. При обновлении /etc/wsl.conf – изменении systemd=true на systemd=false, проблемы с DNS исчезли, как и 100% использование процессора процессом init.
В моем случае (Ubuntu 24.04) я решил это, отредактировав /etc/systemd/resolved.conf и добавив свою предпочтительную конфигурацию
Потому что на Ubuntu есть локальный DNS-сервер под названием systemd-resolved. Этот сервер работает на 127.0.0.53. С помощью команды ниже вы можете проверить, что resolved работает:
root@WSMH:~# ss -tlpn
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=103,fd=14))
LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* users:(("systemd-resolve",pid=103,fd=16))
127.0.0.53 – это IP-адрес, который вы также найдете в /etc/resolv.conf. systemd-resolved генерирует /etc/resolv.conf. Поэтому, вместо того, чтобы возиться с этим файлом, я бы указал resolved через /etc/systemd/resolved.conf, где находятся следующие DNS-серверы.
[Resolve]
DNS=ip.of.dns.server
Domains=my-domain.local
Перед:
root@WSMH:~# resolvectl
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Link 2 (eth0)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
После:
root@WSMH:~# resolvectl
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Current DNS Server: ip.of.dns.server
DNS Servers: ip.of.dns.server
DNS Domain: my-domain.local
Link 2 (eth0)
Current Scopes: none
Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Вам нужно использовать systemctl restart systemd-resolved после редактирования файла. Просто оставьте /etc/resolved.conf как есть
Моя проблема была вызвана запуском docker в безрутовом режиме в WSL. Когда я запускал dockerd-rootless-setuptool.sh install
, у меня возникали ошибки о невозможности загрузить iptables. Это связано с тем, что в WSL iptables интегрирован в ядро, а не как модуль. Поэтому я запустил dockerd-rootless-setuptool.sh install --skip-iptables
, чтобы правильно настроить docker для безрутового режима. Что я не осознавал, так это то, что это добавит --iptables=false
в файл юнита в моем пользовательском каталоге.
Демон Docker запускался через systemctl с ExecStart=/usr/bin/dockerd-rootless.sh --iptables=false
, что не позволяло мне даже пинговать или выполнять трассировку до 8.8.8.8. Как только я это обнаружил, я удалил --iptables=false
из строки ExecStart
в ~/.config/systemd/user/docker.service
, выполнил systemctl --user stop docker.service && systemctl --user start docker.service
и с контейнерами все стало нормально.
Отключение Network
-> DNS Proxy
в приложении WSL Settings
решило проблему для меня. Это добавляет следующее в .wslconfig
.
[wsl2]
dnsProxy=false
В этом случае вам нужно оставить generateResolvConf
включенным.
cmd run as admin
wsl --shutdown
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Затем вы можете запустить wsl.
Ответ или решение
Проблема с DNS в WSL: Возможные решения и рекомендации
Если у вас возникли проблемы с работой DNS в Windows Subsystem for Linux (WSL) на сборке Insider Windows 11 (22458) или любой другой версии, это может быть вызвано несколькими факторами. Рассмотрим основные моменты, которые помогут вам решить эту проблему.
1. Понимание конфигурации DNS в WSL
Проблема заключается в том, что WSL использует DNS-сервер, получаемый через DHCP от Windows. В вашем случае, адрес DNS-сервера, указанный в файле /etc/resolv.conf
, равен 172.22.192.1
, но он не работает. Вы успешно заменили его на 1.1.1.1
(Cloudflare DNS), но файл все равно восстанавливается при каждой перезагрузке WSL.
2. Настройка WSL для использования постоянного DNS
Чтобы предотвратить автоматическое перезаписывание файла resolv.conf
, воспользуйтесь следующим подходом:
-
Создайте файл конфигурации
/etc/wsl.conf
:
Откройте терминал WSL и выполните следующие команды:echo "[network]" | sudo tee /etc/wsl.conf echo "generateResolvConf = false" | sudo tee -a /etc/wsl.conf
Это отключит автоматическую генерацию файла
resolv.conf
. -
Удалите
resolv.conf
и создайте новый:
Выполните команды:sudo rm /etc/resolv.conf echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf echo "nameserver 1.1.1.1" | sudo tee -a /etc/resolv.conf
Здесь вы указываете ваши предпочтительные DNS-серверы.
-
Сделайте файл
resolv.conf
неизменяемым:
Чтобы убедиться, что файл не будет перезаписан, используйте команду:sudo chattr +i /etc/resolv.conf
Это сделает файл неизменяемым в рамках WSL.
3. Проверка взаимодействия с VPN
Если вы используете VPN (например, Cisco AnyConnect), он может блокировать доступ WSL к интернету. Попробуйте временно отключить VPN и проверьте, работает ли DNS.
4. Изменение параметров WSL
В некоторых случаях возможно использование экспериментальных функций. Создайте или измените файл .wslconfig
в вашей папке пользователя (C:\Users\<ВашеИмя>
):
[experimental]
dnsTunneling=true
networkingMode=mirrored
После внесения изменений закройте все экземпляры WSL, запустив wsl --shutdown
в командной строке Windows.
5. Ручная настройка DNS с использованием systemd
Если вы используете дистрибутив, поддерживающий systemd, вы можете изменить файл конфигурации /etc/systemd/resolved.conf
:
[Resolve]
DNS=ip.of.dns.server
Domains=my-domain.local
Следите за тем, чтобы перезапустить службу после изменения конфигурации:
sudo systemctl restart systemd-resolved
Заключение
Проблемы с DNS в WSL часто вызваны вмешательством Windows, VPN или ошибками конфигурации. Следуя вышеуказанным шагам, вы сможете настроить WSL так, чтобы он использовал предпочитаемые DNS-серверы, и устранить неполадки с подключением. Если вы продолжаете сталкиваться с проблемами, возможно, стоит рассмотреть возможность переустановки вашей WSL-дистрибуции или обращения к поддержке Microsoft для более глубокого анализа проблемы.