Вопрос или проблема
Я настроил сервер 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), что мешает маршрутизации трафика между адаптерами.
Пример
Рассмотрим конкретные шаги, которые уже были предприняты:
-
Настройка сервера и клиента: Вы использовали WireGuard для доступа к домашней сети через VPN. Конфигурации интерфейса и Peers, указанные для сервера и клиента, указывают на правильно настроенные адреса и ключи.
-
Настройка ICS: Вы настроили ICS, позволяя WireGuard-серверу использовать существующее интернет-соединение, чтобы трафик клиента мог маршрутизироваться через него.
-
Скрипт PowerShell: После обнаружения проблемы с перезагрузкой сервера вы создали PowerShell-скрипт для автоматического включения ICS, добавив дубликаты действий из графического интерфейса в автоматизированный процесс.
Применение
-
Диагностика ICS: Убедитесь, что проблема действительно связана с отключением ICS. Каждый раз после перезагрузки проверяйте статус этой службы. Автоматические задачи могут не срабатывать из-за отсутствия необходимых привилегий.
-
Управление службами Windows: Включите автоматический запуск ICS. Однако имейте в виду, что службы общего доступа могут отключаться самостоятельно при изменении конфигурации сети.
-
Использование Windows Event Viewer: Сделайте обзор системных журналов, чтобы отслеживать ошибки, которые могут объяснить отключение ICS. Бывают случаи, когда конфликты сетевых адресов или программного обеспечения безопасности мешают работе.
-
Обходные пути с помощью PowerShell: В случае трудностей с автоматизацией через штатные средства, пересмотрите PowerShell-скрипт. Убедитесь, что его запуск происходит с достаточными правами. Возможно, стоит уточнить способ его выполнения, избегая ошибок COMException.
-
Альтернативные методы автоматизации: Вместо ICS можно попробовать другие способы маршрутизации, использующие встроенные инструменты Windows таких как netsh, для настройки NAT. Это может позволить более надежное управление сетями без зависимости от ICS.
-
Обновление и резервное копирование системы: Иногда бывает полезно обновить Windows и драйвера сетевых адаптеров. Также неплохо сохранить работоспособную конфигурацию WireGuard. Это поможет избежать проблем в случае несовместимости с обновлениями.
-
Сообщество WireGuard и ресурсы поддержки: При необходимости, обратитесь в форумы и группы сообщества WireGuard. Возможно, пользователи уже сталкивались с подобными проблемами и могут предложить рабочее решение.
Используя данные рекомендации, можно не только устранить существующую проблему, но и стабилизировать работу WireGuard даже после перезагрузки системы, обеспечив бесперебойный доступ к интернету и домашней сети.