Клиент WireGuard не подключается к интернету после перезагрузки сервера WireGuard на Windows 10.

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

Я настроил сервер Wireguard на своем ПК с Windows 10 для доступа к домашней сети, следуя этому видео-уроку.

Конфигурация сервера

[Interface]
PrivateKey = server-private
ListenPort = 51820
Address = 192.168.200.1/24

[Peer]
PublicKey = client-public
AllowedIPs = 192.168.200.2/32

Я попытался подключиться к серверу через клиент Wireguard на Android

Конфигурация клиента

[Interface]
PrivateKey = client-private
Address = 192.168.200.2/24
DNS = 8.8.8.8, 1.1.1.1

[Peer]
PublicKey = server-public
AllowedIPs = 0.0.0.0/0
Endpoint = server.public.ip:51820

Я включил перенаправление портов на роутере на порт 51820 к статическому внутреннему IP моего ПК с Windows 10 на порт 51820

Я также подключил мой домашний WiFi адаптер к адаптеру интерфейса Wireguard (Wireguard_Server) через правый клик на WiFi адаптере –> Свойства –> Общий доступ –> Отметьте оба флажка, чтобы разрешить подключение моей домашней сети Wireguard_Server.

Клиент смог подключиться к моему серверу и успешно получить доступ к домашней сети из публичного интернета и также смог просматривать интернет через мою домашнюю сеть.

Проблема началась, когда мой домашний ПК перезагрузился. Я смог установить подключение Wireguard от клиента к серверу, но не могу получить доступ к другим ресурсам в моей домашней сети и не могу подключиться к интернету.

Как исправить эту проблему?

Технически, устройства, подключенные в интерфейсе WireGuard, являются узлами. Но сервер-клиент для меня проще понять, поэтому я пошел этим путем.

После просмотра множества статей, я наткнулся на эту статью от Генри.

Оказывается, Windows как бы отключает настройку ICS, выполненную при перезагрузке.

Следовал статье, добавил ключ реестра и изменил службу ICS, но это не сработало, и мне все равно пришлось вручную отключать и включать ICS на сервере, чтобы интернет через Wireguard работал.

Создал следующий скрипт PowerShell, упомянутый в статье

Function Set-NetConnectionSharing
{
    Param
    (
        [Parameter(Mandatory=$true)]
        [string]
        $LocalConnection,

        [Parameter(Mandatory=$true)]
        [bool]
        $Enabled        
    )

    Begin
    {
        $netShare = $null

        try
        {
            # Create a NetSharingManager object
            $netShare = New-Object -ComObject HNetCfg.HNetShare
        }
        catch
        {
            # Register the HNetCfg library (once)
            regsvr32 /s hnetcfg.dll

            # Create a NetSharingManager object
            $netShare = New-Object -ComObject HNetCfg.HNetShare
        }
    }

    Process
    {
        #Clear Existing Share          
        $oldConnections = $netShare.EnumEveryConnection |? { $netShare.INetSharingConfigurationForINetConnection.Invoke($_).SharingEnabled -eq $true}           
        foreach($oldShared in $oldConnections)
        {
            $oldConfig = $netShare.INetSharingConfigurationForINetConnection.Invoke($oldShared)
            $oldConfig.DisableSharing()                        
        }        
    
        # Find connections
        $InternetConnection = Get-NetRoute | ? DestinationPrefix -eq '0.0.0.0/0' | Get-NetIPInterface | Where ConnectionState -eq 'Connected'        
        $publicConnection = $netShare.EnumEveryConnection |? { $netShare.NetConnectionProps.Invoke($_).Name -eq $InternetConnection.InterfaceAlias }
        $privateConnection = $netShare.EnumEveryConnection |? { $netShare.NetConnectionProps.Invoke($_).Name -eq $LocalConnection }

        # Get sharing configuration
        $publicConfig = $netShare.INetSharingConfigurationForINetConnection.Invoke($publicConnection)
        $privateConfig = $netShare.INetSharingConfigurationForINetConnection.Invoke($privateConnection)

        if ($Enabled)
        {           
            $publicConfig.EnableSharing(0)
            $privateConfig.EnableSharing(1)
        }
        else
        {
            $publicConfig.DisableSharing()
            $privateConfig.DisableSharing()
        }
    }
}

и настроил его как запланированную задачу

пакетный файл задачи

@echo off
"%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" Set-NetConnectionSharing "Wireguard_Server" $true
  • запуск при включении компьютера автоматически
  • независимо от того, вошел ли пользователь в систему

Мне также пришлось включить запуск локальных скриптов PowerShell в групповой политике. Execution Policy: RemoteSigned

После настройки задачи подключение Wireguard работает без каких-либо проблем, даже после перезагрузки сервера Wireguard.

Обновление:

Мой скрипт начал давать сбой недавно при выполнении

@echo off
"%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" Set-NetConnectionSharing "Wireguard_Server" $true

с ошибкой,

An event was unable to invoke any of the subscribers (Exception from HRESULT: 0x80040201)
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Wireguard\Wireguard.psm1:54 char:13
+             $publicConfig.EnableSharing(0)
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

An event was unable to invoke any of the subscribers (Exception from HRESULT: 0x80040201)
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Wireguard\Wireguard.psm1:55 char:13
+             $privateConfig.EnableSharing(1)
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

Следовал шагам, указанным в этом проекте на Github, чтобы снова заработало. Не уверен, как часто мне придется делать это вручную, так как скрипт должен был бы это делать.

Откройте Сетевые подключения в Панели управления. Щелкните правой кнопкой мыши > Свойства на сетевом интерфейсе, который вы хотите расшарить.

Перейдите на вкладку Общий доступ и установите “Разрешить другим пользователям сети использовать подключение к Интернету этого компьютера”.
Из выпадающего списка “Подключение к домашней сети” выберите wg_server.
Нажмите ОК.

Ответ или решение

Конфигурация WireGuard-сервера и клиента, настроенных на Windows 10, включает несколько сложных моментов, которые могут привести к проблемам при перезагрузке сервера. Рассмотрим проблему и возможные решения более подробно.

Теория

На первый взгляд, настройки выглядят корректно. WireGuard — это современный протокол VPN, который обеспечивает безопасное соединение между устройствами. В этом случае одно устройство (с ролью сервера) размещает соединение, а другие устройства подключаются к нему в качестве клиентов, используя криптографические ключи.

Основная проблема, с которой сталкивается пользователь, связана с тем, что после перезагрузки Windows 10 WireGuard-сервера Android-клиент может подключиться, но не может получить доступ ни к домашней сети, ни к интернету. Когда Windows перезагружается, возможно, автоматически выключается функция общего доступа к Интернету (ICS, Internet Connection Sharing), что мешает маршрутизации трафика между адаптерами.

Пример

Рассмотрим конкретные шаги, которые уже были предприняты:

  1. Настройка сервера и клиента: Вы использовали WireGuard для доступа к домашней сети через VPN. Конфигурации интерфейса и Peers, указанные для сервера и клиента, указывают на правильно настроенные адреса и ключи.

  2. Настройка ICS: Вы настроили ICS, позволяя WireGuard-серверу использовать существующее интернет-соединение, чтобы трафик клиента мог маршрутизироваться через него.

  3. Скрипт PowerShell: После обнаружения проблемы с перезагрузкой сервера вы создали PowerShell-скрипт для автоматического включения ICS, добавив дубликаты действий из графического интерфейса в автоматизированный процесс.

Применение

  1. Диагностика ICS: Убедитесь, что проблема действительно связана с отключением ICS. Каждый раз после перезагрузки проверяйте статус этой службы. Автоматические задачи могут не срабатывать из-за отсутствия необходимых привилегий.

  2. Управление службами Windows: Включите автоматический запуск ICS. Однако имейте в виду, что службы общего доступа могут отключаться самостоятельно при изменении конфигурации сети.

  3. Использование Windows Event Viewer: Сделайте обзор системных журналов, чтобы отслеживать ошибки, которые могут объяснить отключение ICS. Бывают случаи, когда конфликты сетевых адресов или программного обеспечения безопасности мешают работе.

  4. Обходные пути с помощью PowerShell: В случае трудностей с автоматизацией через штатные средства, пересмотрите PowerShell-скрипт. Убедитесь, что его запуск происходит с достаточными правами. Возможно, стоит уточнить способ его выполнения, избегая ошибок COMException.

  5. Альтернативные методы автоматизации: Вместо ICS можно попробовать другие способы маршрутизации, использующие встроенные инструменты Windows таких как netsh, для настройки NAT. Это может позволить более надежное управление сетями без зависимости от ICS.

  6. Обновление и резервное копирование системы: Иногда бывает полезно обновить Windows и драйвера сетевых адаптеров. Также неплохо сохранить работоспособную конфигурацию WireGuard. Это поможет избежать проблем в случае несовместимости с обновлениями.

  7. Сообщество WireGuard и ресурсы поддержки: При необходимости, обратитесь в форумы и группы сообщества WireGuard. Возможно, пользователи уже сталкивались с подобными проблемами и могут предложить рабочее решение.

Используя данные рекомендации, можно не только устранить существующую проблему, но и стабилизировать работу WireGuard даже после перезагрузки системы, обеспечив бесперебойный доступ к интернету и домашней сети.

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

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