WSL - DNS не работает при подключении к VPN

man mpv

 mpv [options] [file|URL|PLAYLIST|-]

...

  --playlist=<filename>
        Play  files according to a playlist file (Supports some common formats. 
        If no format is detected, it will be treated as list
        of files, separated by newline characters. Note that XML playlist 
        formats are not supported.)

        You can play playlists directly and without this option, 
        however, this option disables any security mechanisms that might be
        in place. You may also need this option to load plaintext files as playlist.
6
29.05.2020, 11:11
2 ответа

Решено.

Подсистема Ubuntu (WSL )не могла разрешать корпоративные и некорпоративные домены при включенном или выключенном VPN.

Исправлено.

Необходимо создать файл /etc/wsl.conf и добавить запись, чтобы отменить автоматическое создание файла resolv.conf при перезагрузке. Добавьте блок кода в /etc/wsl.conf:

[network] 

generateResolvConf = false

Затем перезагрузите подсистему Ubuntu, открыв powershell от имени администратора и выполнив команду:

wsl --shutdown

Теперь пере -откройте подсистему ubuntu

используйте эти команды по порядку:

cd /etc
ls

В этом каталоге должен отображаться файл 'resolv.conf' (, который является символической ссылкой ). Ссылка теперь должна быть красной, указывая на то, что ссылка ведет в никуда. Удалите ссылку resolv.conf и создайте новый файл /etc/resolv.conf

.

В новом файле resolv.conf напишите этот блок кода

search    your.domain.com
nameserver    x.x.x.x
nameserver    x.x.x.x
nameserver    y.y.y.y

Где X — адрес DNS, настроенный в адаптере Cisco Anyconnect VPN. Найдите адаптер Cisco VPN в сетевых настройках, щелкните правой кнопкой мыши адаптер Cisco VPN и выберите «Свойства», теперь выделите IPv4 и нажмите «Свойства». Затем обратите внимание на Preferred DNS и Alternate DNS и скопируйте их в файл resolv.conf.

Y — ваш обычный DNS-адрес IPv4

Теперь снова перезапустите подсистему из Powershell. ПРИМЕЧАНИЕ. :Если это не сработало, это означает, что файл resolv.conf снова был снесен подсистемой. Чтобы это работало, файл wsl.conf должен быть прочитан системой. Если не читается, попробуйте переустановить подсистему или обновиться до 20.04.

17
18.03.2021, 23:31

Я столкнулся с этим в последние несколько дней, и это сводило меня с ума. Решения, витающие вокруг, были НАМНОГО слишком хакерскими, на мой вкус. Я создал очень простойwsl-resolv-handler.ps1(см. блок сценария далее в этом сообщении ), который может автоматически установить правильный порядок серверов имен, создать правильную строку поиска на основе InterfaceMetric.

По сути, вы можете установить более низкий (== более высокий приоритет )InterfaceMetric для вашего интерфейса VPN следующим образом (запустите powershell от имени администратора):

 # Get a list of interfaces, Note the InterfaceIndex and InterfaceMetric for your VPN adapter
> Get-NetIpInterface
# For example, if your VPN adapter has InterfaceIndex 12, we're setting
# the InterfaceMetric to 10, making sure 10 is lower than whatever your
# WiFi or Ethernet adapter has
> Set-NetIPInterface -InterfaceIndex 12 -InterfaceMetric 10 

После того, как метрики вашего интерфейса установлены -в порядке, вы можете использовать скрипт в блоке скриптов -ниже. В верхней части скрипта содержится полное объяснение того, как использовать + несколько настроек (WslDistroName и ResolvConfFile ), которые должны быть правильными.

# Before attempting to run this script, review and/or follow the 
# following steps.
#
# 0. Make sure you can execute powershell scripts. Start Powershell as an
#    administrator and execute:
#
#      Set-ExecutionPolicy RemoteSigned

# 1. Make sure you disable wsl's broken resolv.conf handler.
#    Create /etc/wsl.conf with the following 2 lines (without the pound signs):
#
#      [network]
#      generateResolvConf = false
#
#    After that, make sure you issue a wsl.exe --shutdown.
#
# 2. Configure your WSL distro name in $WslDistroName below and make sure we're
#    pointing at your resolv.conf file in $ResolvConfFile. Also make sure we can write 
#    to the resolv.conf file. I had to set permissions pretty broadly at 666.
#
# 3. Schedule this script with Task Scheduler:
#
#      * Click Action –> Create Task…
#      * Give your task a name in the General tab
#      * Click on the Triggers tab and then click New…
#      * In the "Begin the task" menu, choose “On an event.” Then, choose:
#
#          Log: Microsoft-Windows-NetworkProfile/Operational
#          Source: NetworkProfile
#          Event ID: 10000
#
#      * Event ID 10000 is logged when you connect to a network. Add another
#        one when a disconnect would occur (Event ID 10001):
#
#          Log: Microsoft-Windows-NetworkProfile/Operational
#          Source: NetworkProfile
#          Event ID: 10001
#
#      * Go to the Conditions tab. Make sure it runs regardless of AC adapter
#        connected/disconnected, peruse the other options there.
#
#      * Go to the Actions tab. Add a run script action and then:
#
#          Program/script: powershell.exe
#          Arguments: -noprofile -file "c:\where\you\stored\wsl-resolv-handler.ps1"
#

$WslDistroName = "Debian"
$ResolvConfFile = [string]::Format("\\wsl$\{0}\etc\resolv.conf", $WslDistroName)

function Convert-To-UnixLineEndings($path) {
  $oldBytes = [io.file]::ReadAllBytes($path)
  if (!$oldBytes.Length) {
      return;
  }
  [byte[]]$newBytes = @()
  [byte[]]::Resize([ref]$newBytes, $oldBytes.Length)
  $newLength = 0
  for ($i = 0; $i -lt $oldBytes.Length - 1; $i++) {
      if (($oldBytes[$i] -eq [byte][char]"`r") -and ($oldBytes[$i + 1] -eq [byte][char]"`n")) {
          continue;
      }
      $newBytes[$newLength++] = $oldBytes[$i]
  }
  $newBytes[$newLength++] = $oldBytes[$oldBytes.Length - 1]
  [byte[]]::Resize([ref]$newBytes, $newLength)
  [io.file]::WriteAllBytes($path, $newBytes)
}

Function Pause ($message)
{
    # Check if running Powershell ISE
    if ($psISE)
    {
        Add-Type -AssemblyName System.Windows.Forms
        [System.Windows.Forms.MessageBox]::Show("$message")
    }
    else
    {
        Write-Host "$message" -ForegroundColor Yellow
        $x = $host.ui.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    }
}

$NetworkInterfaces  = Get-NetIPInterface -AddressFamily IPv4 | Where-Object ConnectionState -EQ 'Connected' | Where-Object NlMtu -LT 9001
$DNSServerAddresses = Get-DnsClientServerAddress -AddressFamily IPv4
$DNSClients = Get-DnsClient

$Entries = $NetworkInterfaces | ForEach-Object {
  [PSCustomObject]@{
    'InterfaceAlias'      = $_.InterfaceAlias
    'InterfaceIndex'      = $_.InterfaceIndex
    'InterfaceMetric'     = $_.InterfaceMetric
    'DNSServerAddresses'  = ($DNSServerAddresses | Where-Object InterfaceIndex -EQ $_.InterfaceIndex | Where-Object AddressFamily -EQ 2).ServerAddresses
    'DNSSuffixes'  =  @(($DNSClients | Where-Object InterfaceIndex -EQ $_.InterfaceIndex).ConnectionSpecificSuffix) + @(($DNSClients).ConnectionSpecificSuffixSearchList | Out-Null)
  }
} | Sort-Object InterfaceMetric -Unique

$CommentLine = [string]::Format("# Generated by wsl-resolv-handler.ps1.")
Write-Output $CommentLine | Set-Content -Path $ResolvConfFile
$SearchLine = [string]::Format("search {0}", ($Entries.DNSSuffixes -join " "))
  Write-Output $SearchLine | Add-Content -Path $ResolvConfFile
$Entries | ForEach-Object {
  $_.DNSServerAddresses | ForEach-Object {
    $NameServerLine = [string]::Format("nameserver {0}", $_)
    Write-Output $NameServerLine | Add-Content -Path $ResolvConfFile
  }
}

Convert-To-UnixLineEndings $ResolvConfFile

Pause "Press any key to continue..."

Сохраните приведенный выше скрипт как wsl-resolv-handler.ps1и следуйте инструкциям в комментариях. Удачи + получайте удовольствие (примечание, этот подход должен работать с любым типом VPN или изменениями топологии сети, он будет работать без ручной глупости, если вы правильно настроите его и правильно настроите задачу в диспетчере задач Windows. Вам не нужны повышенные разрешения для запуска этого, если скрипт может писать в /etc/resolv.conf)!

Примечание :Я также разместил этот ответ на наиболее важную проблему github для этого (существует ОГРОМНОЕ количество проблем github о неработоспособности генератора resolv.conf )здесь:https://github.com/Microsoft/WSL/issues/2884#issuecomment-928299305

3
27.09.2021, 21:45

Теги

Похожие вопросы