![Как изменить настройки DNS для WSL2?](https://rvso.com/image/1618338/%D0%9A%D0%B0%D0%BA%20%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8%20DNS%20%D0%B4%D0%BB%D1%8F%20WSL2%3F.png)
Насколько мне удалось выяснить, официальный процесс изменения DNS-сервера, используемого WSL2 в Windows 10, подробно описан ниже. (WSL2 — это новая версия подсистемы Windows для Linux, которая запускает настоящее ядро Linux в облегченной виртуальной машине в Windows 10.)
Однако этот процесс у меня не работает — в итоге система просто отключается и не может разрешить ни одного адреса.
Что я делаю не так?
Вот процесс, который я описал на данный момент:
1. Отключить генерацию/etc/resolv.conf
Используя командную строку Linux (я использую Ubuntu), измените (или создайте) /etc/wsl.conf со следующим содержимым:
[network]
generateResolvConf = false
(По всей видимости, в текущей версии есть ошибка, из-за которой любой завершающий пробел в этих строках может привести к сбою.)
2. Перезапустите виртуальную машину WSL2.
Закройте все окна Linux и выполните следующую команду Powershell:
wsl --shutdown
3. Создайте пользовательский/etc/resolv.conf
Откройте новое командное окно Linux и перейдите в/etc
Если resolv.conf
есть мягкая ссылка на другой файл, удалите ссылку с помощью
rm resolv.conf
Создайте новый resolv.conf
со следующим содержанием
nameserver 1.1.1.1
4. Перезапустите виртуальную машину WSL2.
То же, что и в шаге №2
5. Запустите новую командную строку Linux.
Выгода!
Обновление 18 марта 2020 г.
Мой /etc/hosts
файл содержит следующее:
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1 localhost
127.0.1.1 [redacted] bearps-desktop
10.168.244.140 host.docker.internal
10.168.244.140 gateway.docker.internal
127.0.0.1 kubernetes.docker.internal
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Файл /etc/switch.conf
не существует.
Инструмент resolvectl
не находится на моем пути; его не существует /usr/bin/resolvectl
.
Аналогично systemd-resolve
мне не по пути; его не существует /usr/bin/systemd-resolve
.
решение1
Процесс, который я описал выше, правильный - этоявляетсякак изменить настройки DNS в WSL2.
Моя ошибка заключалась в использовании известных публичных DNS-серверов для CloudFlare (1.1.1.1) и Google (8.8.8.8 и 8.8.4.4) для целей тестирования. Оказывается, моя локальная сеть блокирует мне использование публичных DNS.
Когда я протестировал описанный выше процесс с правильным IP-адресом внутреннего DNS-сервера, все работало правильно.
решение2
Добавляя к другим ответам здесь вытакжехотите сделать resolv.conf
неизменяемым.
sudo chattr +i /etc/resolv.conf
В моем случае он удалялся при каждой загрузке, даже с wsl.conf
.
По этой причине я создал эту небольшую программу, которая автоматизирует все с помощью одной оболочки:
решение3
Мне пришлось сделать это из дома (коронавирус), и в конечном итоге я написал скрипт Powershell Admininstrator Prompt для запуска моего дистрибутива (debian). Также обратите внимание, что это запускает дистрибутив по умолчанию, указанный WSL, вам нужно будет изменить последнюю строку, если это не так. Найдите , \\wsl$\[distro name]
если ваш также не называется Debian, просто введите первую часть в путь проводника Windows, чтобы добраться до WSL2, то есть в верхней строке проводника нажмите Enter, \\wsl$\
и он выведет список ваших дистрибутивов.
Это вытащит DNS-сервер из хоста Windows, создаст новый resolv.conf и запишет его в формате Unix в экземпляр WSL2. Поэтому вам нужно отредактировать /etc/wsl.conf следующим образом:
[network]
generateResolvConf = false
Итак, суперпользователь попытался изменить его на resolv.config; если этот файл существует, потому что вы используете другой дистрибутив Linux, ну, тогда, я полагаю, это тот файл, который вам нужен. Так что измените его соответствующим образом. Хотя я никогда не видел этот файл ни в одной документации, и я не уверен, что редактирование моего поста было правильным.
Затем запустите PowerShell Admin Prompt и выполните команду ./debian.ps1 (если вы так назовете файл):
# Filename: debian.ps1
#
# Get the DNS server of the Windows machine, save into variable nameserver
$nameserver = Get-WmiObject -Namespace root\cimv2 -Query "Select dnsserversearchorder from win32_networkadapterconfiguration" | where {$_.DNSServerSEarchOrder -ne $null} | select -ExpandProperty DNSServerSearchOrder
# Convert nameserver object into a string
$nameserver = Out-String -InputObject $nameserver
# Run Set-Contents (sc) to write the resolv.conf file in a public location as it has DOS formatted line endings written by PowerShell, not readable by Linux
sc -Path 'c:\Users\Public\Documents\resolv.conf' -Value ('nameserver ' + $nameserver) -Encoding utf8
# Convert the DOS formatted file into UNIX format for WSL2 and write it in the proper place (\etc\resolv.conf, its primary location is \\wsl$\[distro_name] from Windows)
[string]::Join( "`n", (gc 'c:\Users\Public\Documents\resolv.conf')) | sc '\\wsl$\debian\etc\resolv.conf'
# Launch the default WSL2 distribution - if you want to use another one, specify in the line below
wsl.exe
Это было протестировано под Debian Buster и Zscaler (корпоративным) VPN. Это хорошая отправная точка, надеюсь, это избавит кого-то от головной боли, с которой я столкнулся, получая доступ к DNS на экземпляре WSL2 моего корпоративного ПК!
решение4
Очень подробные ответы об изменении. Я просто хотел использовать значение по умолчанию и продолжить. Следовал нескольким руководствам, таким как первый ответ, у меня не сработало. Я просто изменил, /etc/wsl.conf
и оно снова заработало.
sudo nano /etc/wsl.conf
Вставьте или измените в этом файле:
[network]
generateResolvConf = true
Вставьте в Powershell/CMD:
wsl --shutdown
или:
wsl --terminate <<Linux distro>>
Сделано и сделано. Дайте мне знать, если это сработало для вас.
Моя настройка была испорчена, потому что Tailscale изменил ее, когда я ее запустил. Теперь она снова работает.