Как изменить настройки DNS для WSL2?

Как изменить настройки DNS для WSL2?

Насколько мне удалось выяснить, официальный процесс изменения 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.

По этой причине я создал эту небольшую программу, которая автоматизирует все с помощью одной оболочки:

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

решение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 изменил ее, когда я ее запустил. Теперь она снова работает.

Связанный контент