DNS не работает в WSL

Вопрос или проблема

В настоящее время я использую сборку 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

Эта проблема меня беспокоила много раз, и в итоге я сделал этот простой вспомогательный код:

https://github.com/epomatti/wsl2-dns-fix-config

Это проблема с WSL, а не с Ubuntu или Windows. Существует множество решений, лучшее, которое я нашел https://gist.github.com/coltenkrauter/608cfe02319ce60facd76373249b8ca6

Он также включает информацию о VPN, но шаги работают и без VPN.

  1. Запустите эти команды в терминале 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.
    
  2. В командной строке Windows, PowerShell или терминале с подключённым VPN выполните: Get-NetIPInterface или ipconfig /all для получения основных и вторичных DNS.

  3. С основными и вторичными DNS, полученными на шаге 2, замените числа в следующем шаге на X.X.X.X

  4. echo "nameserver X.X.X.X" | sudo tee resolv.conf (Создайте resolv.conf и добавьте строку.)

  5. echo "nameserver X.X.X.X" | sudo tee -a resolv.conf (Добавьте строку в resolv.conf)

  6. wsl --terminate Debian (Завершите WSL в командной строке Windows, если это Ubuntu, а не Debian).

  7. sudo chattr +i resolv.conf

  8. Наконец, в командной строке 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

  1. Внутри WSL2 создайте или добавьте файл: /etc/wsl.conf

  2. Добавьте следующие строки в файл, чтобы убедиться, что ваши изменения DNS не будут потеряны

    echo "[network]" | sudo tee /etc/wsl.conf
    echo "generateResolvConf = false" | sudo tee -a /etc/wsl.conf
    
  3. В окне cmd выполните wsl --shutdown

  4. Запустите WSL2

  5. Запустите следующее внутри 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/

Шаги для исправления

  1. Добавьте файл .wslconfig, если он отсутствует в каталоге C:\Users%username%\ и добавьте конфигурации экспериментального флага функции, чтобы включить их.

    winget install GNU.nano Опциональный шаг для редактирования текстового файла в CLI с использованием nano

    nano .wslconfig Опциональный шаг для редактирования текстового файла в CLI с использованием nano

    CTRL + X для выхода и сохранения изменений.

    Добавьте содержимое ниже в файл (описание каждого экспериментального флага указано в приведенной выше статье Microsoft)


[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true

  1. Перезапустите 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 включенным.

https://docs.microsoft.com/en-us/windows/wsl/install-manual#step-2—check-requirements-for-running-wsl-2

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, воспользуйтесь следующим подходом:

  1. Создайте файл конфигурации /etc/wsl.conf:
    Откройте терминал WSL и выполните следующие команды:

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

    Это отключит автоматическую генерацию файла resolv.conf.

  2. Удалите 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-серверы.

  3. Сделайте файл 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 для более глубокого анализа проблемы.

Оцените материал
Добавить комментарий

Капча загружается...