EUR
european

EUR

usa

USD

Russian Ru
Ex. VAT Ex. VAT 0%

Настройка WireGuard для Windows

В этом руководстве описано, как настроить VPN-туннель WireGuard между двумя компьютерами с Windows: сервером WireGuard на удалённом Windows-хосте, например Windows VPS, и клиентом WireGuard на вашем локальном компьютере. Когда туннель активен, машины обмениваются данными по зашифрованному частному соединению, а при желании весь трафик клиента можно направить через сервер.

Базовая настройка создаёт туннель между сервером и клиентом. Чтобы направить через сервер весь интернет-трафик клиента, на сервере дополнительно нужен NAT, см. раздел "Настройка NAT на сервере для полного туннелирования".

Чтобы упростить генерацию ключей, в этом руководстве обе конфигурации, серверная и клиентская, создаются в одном приложении WireGuard, а затем каждый файл конфигурации переносится на свою машину. Конфигурация сервера работает на сервере, конфигурация клиента работает на клиенте. Сервер и клиент всегда находятся на разных машинах. Тем же способом добавляется любое количество дополнительных клиентов.

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

Схема в этом руководстве выглядит так:

Server (public IP, listening on UDP 51820) Tunnel address 10.0.0.1/24 | | encrypted WireGuard tunnel | Client Tunnel address 10.0.0.2/32

Создание конфигурации сервера

Запустите C:\Program Files\WireGuard\wireguard.exe, нажмите Add tunnel и выберите Add empty tunnel. WireGuard автоматически создаст пару ключей. Открытый ключ в верхней части окна принадлежит серверу. Он понадобится позже при настройке клиента.

Задайте имя туннеля и заполните секцию интерфейса: закрытый ключ сервера, порт, на котором WireGuard будет принимать подключения, и внутренний адрес сервера в туннеле.

[Interface] PrivateKey = # private key of the WireGuard server ListenPort = # port that WireGuard will listen on Address = # internal IP address of the WireGuard server, for example 10.0.0.1/24

Используйте для сети туннеля частную подсеть, а сервер и всех клиентов держите в одном диапазоне. Обычный вариант: 10.0.0.1/24 для сервера и 10.0.0.2/32, 10.0.0.3/32 и так далее для клиентов. Сервер использует префикс /24, чтобы весь диапазон туннеля считался доступным через интерфейс WireGuard. Каждый клиент использует /32, потому что клиент представляет один адрес, а не подсеть. Клиент с /24 считал бы весь диапазон находящимся на своём интерфейсе и не отправлял бы трафик к другим адресам туннеля через туннель.

В конфигурации сервера флажка Block untunneled traffic (kill-switch) нет. Он появляется только в конфигурации клиента, которая направляет весь трафик через туннель, см. раздел "Создание конфигурации клиента".

Для дополнительной защиты можно добавить каждому пиру общий ключ (pre-shared key). Сгенерируйте его один раз и добавьте одну и ту же строку в соответствующую секцию [Peer] и на сервере, и на клиенте:

PresharedKey = # pre-shared key, identical on the server and the client

Сгенерировать ключ можно утилитой wg, которая входит в комплект WireGuard:

"C:\Program Files\WireGuard\wg.exe" genpsk

Создание конфигурации клиента

Снова нажмите Add tunnel и выберите Add empty tunnel, теперь для клиента. Открытый ключ этого туннеля принадлежит клиенту, он нужен серверу, чтобы принять клиента.

Заполните конфигурацию клиента:

[Interface] PrivateKey = # private key of the WireGuard client Address = # internal IP address of the WireGuard client, for example 10.0.0.2/32 DNS = 1.1.1.1, 1.0.0.1 [Peer] PublicKey = # public key of the WireGuard server AllowedIPs = # 0.0.0.0/0 for a full tunnel, or 10.0.0.0/24 for a split tunnel Endpoint = # public IP address and port of the WireGuard server PersistentKeepalive = 25

В Endpoint нужно указать реальный публичный IP-адрес сервера и порт из параметра ListenPort сервера, а не внутренний адрес туннеля. О выборе значения AllowedIPs см. раздел "Разбираемся с AllowedIPs" ниже.

Строки DNS и PersistentKeepalive необязательны. DNS задаёт DNS-серверы, которые используются, пока туннель активен, это помогает избежать проблем с разрешением имён после подключения. Можно использовать публичные резолверы, например 1.1.1.1, 1.0.0.1 или 8.8.8.8, 8.8.4.4, или DNS-сервер самой VPN-сети. PersistentKeepalive = 25 отправляет небольшой пакет каждые 25 секунд и помогает удерживать соединение, когда клиент находится за NAT.

Если в конфигурации клиента один [Peer] и его AllowedIPs содержит 0.0.0.0/0 (или ::/0), под полем конфигурации в редакторе туннеля появляется флажок Block untunneled traffic (kill-switch). При раздельном туннеле, например AllowedIPs = 10.0.0.0/24, флажка нет совсем.

Kill-switch включается по умолчанию, как только вы указываете 0.0.0.0/0. Пока туннель активен, правила брандмауэра пропускают только трафик через туннель, трафик loopback, DHCP и обнаружение соседей IPv6. Всё остальное блокируется, в том числе устройства в вашей локальной сети, например принтеры и NAS. Если задана строка DNS, DNS-запросы разрешены только к указанным в ней серверам.

Снятие флажка не просто отключает настройку. Редактор переписывает AllowedIPs: 0.0.0.0/0 превращается в 0.0.0.0/1, 128.0.0.0/1, а ::/0 в ::/1, 8000::/1. Весь интернет-трафик по-прежнему идёт через туннель, но блокирующие правила брандмауэра не создаются. Если снова установить флажок, вернётся 0.0.0.0/0.

Копируйте ключи и Endpoint очень внимательно. Чаще всего туннель не подключается из-за опечатки в ключе или неверного Endpoint.

Добавление клиента на сервер

Снова откройте конфигурацию сервера и добавьте секцию [Peer] для клиента с открытым ключом клиента из предыдущего шага.

[Peer] PublicKey = # public key of the WireGuard client AllowedIPs = # internal IP address of the client

В конфигурации сервера у AllowedIPs две роли. Он сообщает серверу, какой адрес туннеля принадлежит этому клиенту, и работает как список маршрутов: любой пакет, адресованный в эти диапазоны, шифруется и отправляется этому пиру. Для одного клиента это его адрес в туннеле, например 10.0.0.2/32. Если с сервера должна быть доступна сеть за этим клиентом, добавьте сюда и эту подсеть, например 10.0.0.2/32, 192.168.1.0/24. Это нужно, только если клиент служит шлюзом в свою локальную сеть. Для обычного доступа к локальным устройствам клиента при активном туннеле см. раздел "Доступ к локальной сети при активном туннеле". Повторите этот шаг для каждого дополнительного клиента.

Настройка брандмауэра Windows на сервере

Сервер должен принимать входящий трафик WireGuard на своём UDP-порту. Откройте Windows Defender Firewall with Advanced Security, выберите Inbound Rules и нажмите New Rule. Выберите Port и нажмите Next. Выберите UDP, введите порт WireGuard, например 51820, и нажмите Next. Если портов несколько, перечислите их через запятую, например 51820, 51821. Выберите Allow the connection и нажмите Next. Отметьте профили, к которым применяется правило. Если сервер размещён в дата-центре, обычно достаточно профиля Public, в остальных случаях оставьте отмеченными Domain, Private и Public. Нажмите Next, дайте правилу понятное имя, например WireGuard UDP 51820, и нажмите Finish.

Это входящее правило нужно только на сервере, потому что именно сервер принимает входящие подключения. На VPS также убедитесь, что провайдер разрешает входящий UDP-трафик на этот порт на уровне сети, а не только в брандмауэре Windows.

Экспорт и развёртывание конфигураций

Когда обе конфигурации готовы, нажмите Export all tunnels to zip, выберите место и сохраните.

В архиве находятся файлы конфигурации всех туннелей. Поместите конфигурацию сервера на сервер и передайте каждому клиенту его собственный файл. Если на машине много туннелей, отдельный туннель можно экспортировать из его контекстного меню. Экспорт в zip удобен, когда оба туннеля созданы на одной машине, как в этом руководстве. Если каждая конфигурация создаётся сразу на своём хосте, экспорт не нужен, файл можно скопировать вручную.

На сервере выберите конфигурацию сервера и нажмите Activate.

На клиенте нажмите Add Tunnel, выберите файл конфигурации клиента и откройте его.

Затем нажмите Activate.

Первый клиент настроен. Остальные клиенты добавляются так же: создайте для каждого новый пустой туннель и добавьте в конфигурацию сервера соответствующую секцию [Peer] с открытым ключом и адресом туннеля этого клиента, как описано в разделе "Добавление клиента на сервер".

Warning

Если вы настраиваете WireGuard на удалённом сервере через RDP, прочитайте раздел "Разбираемся с AllowedIPs", прежде чем активировать туннель, который направляет весь трафик. Конфигурация с AllowedIPs = 0.0.0.0/0 может перенаправить собственный трафик сервера в туннель и оборвать RDP-подключение.

Проверка подключения

После активации туннеля Windows может показывать адаптер WireGuard как "Нет доступа к сети" или "Нет доступа к Интернету" в Центре управления сетями. Это ожидаемое поведение: Windows не считает адаптеры VPN-туннелей обычными интернет-подключениями, на работу туннеля это не влияет. Windows определяет этот статус проверкой подключения, которая обращается к определённым адресам Microsoft, поэтому предупреждение может появиться и тогда, когда эти запросы заблокированы или не разрешаются вашим DNS, даже если туннель работает.

Чтобы убедиться, что туннель работает, проверьте его статус в клиенте WireGuard. Активный туннель показывает статус Active и счётчики переданных данных. Если счётчики растут, туннель передаёт трафик.

На сервере также можно убедиться, что WireGuard слушает свой UDP-порт, пока туннель активен:

netstat -ano | findstr 51820

В PowerShell то же самое:

Get-NetUDPEndpoint -LocalPort 51820

Замените 51820 на свой порт WireGuard. Если ничего не выводится, туннель не активен или порт отличается от указанного в конфигурации сервера.

Затем откройте командную строку и выполните ping внутреннего адреса сервера в туннеле:

ping 10.0.0.1

Замените 10.0.0.1 на внутренний IP, который вы задали серверу. Если сервер отвечает, трафик через туннель проходит. Если ответа нет, сначала проверьте рукопожатие: брандмауэр Windows Server по умолчанию блокирует входящий ping, поэтому отсутствие ответа не всегда означает, что туннель не работает.

Если клиент использует AllowedIPs = 0.0.0.0/0, можно также проверить, что трафик идёт через туннель:

tracert 8.8.8.8

Первым узлом должен быть внутренний IP-адрес сервера WireGuard.

Проверка рукопожатия WireGuard

Рукопожатие (handshake) лучше всего помогает при диагностике соединения WireGuard. В приложении WireGuard откройте туннель и следите за полем Latest handshake. На работающем туннеле рукопожатие появляется в течение нескольких секунд после активации и затем периодически обновляется во время передачи данных. Если туннель простаивает, между рукопожатиями может пройти время, короткий перерыв нормален. Если поле остаётся пустым, пиры не могут связаться друг с другом. Обычно это означает неверный Endpoint, закрытый UDP-порт или несовпадающие ключи.

Рукопожатие можно проверить и из командной строки утилитой wg, которая входит в комплект WireGuard:

wg show

В выводе для каждого пира указаны время последнего рукопожатия и счётчики переданных данных.

Разбираемся с AllowedIPs

Значение AllowedIPs в конфигурации клиента определяет, какой трафик идёт через туннель. Коротко: на клиенте AllowedIPs задаёт, какие пакеты отправляются в туннель, а на сервере задаёт, какие пакеты принимаются от конкретного клиента и куда они маршрутизируются.

Значение 0.0.0.0/0 направляет через туннель весь трафик, включая обычный веб-сёрфинг. Используйте его, когда нужна полная защита трафика. Чтобы этот трафик попадал в интернет, сервер должен его транслировать, см. раздел "Настройка NAT на сервере для полного туннелирования" ниже.

Значение вроде 10.0.0.0/24 направляет через туннель только трафик внутренней сети, а обычный интернет-трафик идёт через обычное подключение. Используйте его, когда нужен доступ только к определённым ресурсам удалённой сети.

Можно указать несколько подсетей через запятую, например 10.0.0.0/24, 192.168.1.0/24.

Tip

Флажок Block untunneled traffic (kill-switch) есть только при полном туннеле с 0.0.0.0/0 и установлен по умолчанию. Он блокирует и локальную сеть. Чтобы сохранить доступ к принтерам и другим устройствам в локальной сети, см. раздел "Доступ к локальной сети при активном туннеле".

Warning

Значение AllowedIPs = 0.0.0.0/0 отправляет через туннель все подключения. Если применить его на удалённом сервере, которым вы управляете по RDP, RDP-сессия может оборваться в момент активации туннеля, потому что трафик сервера перенаправляется. На сервере, доступном по RDP, маршрутизируйте только нужные подсети и проверьте всё с узким значением AllowedIPs, прежде чем переходить на 0.0.0.0/0.

Доступ к локальной сети при активном туннеле

При раздельном туннеле, например AllowedIPs = 10.0.0.0/24, локальная сеть работает как обычно, ничего менять не нужно. Шаги ниже относятся к полному туннелю.

Самый простой вариант: снять флажок Block untunneled traffic (kill-switch) в редакторе клиентского туннеля. Редактор заменит 0.0.0.0/0 на 0.0.0.0/1, 128.0.0.0/1. У вашей локальной подсети, например 192.168.1.0/24, есть более точный маршрут через физический адаптер, поэтому Windows отправляет трафик локальной сети напрямую, а интернет-трафик по-прежнему идёт через туннель. Обратная сторона: если туннель упадёт, ничто не заблокирует трафик.

Если нужно гарантировать, что трафик локальной сети никогда не попадёт в туннель, явно исключите локальный диапазон из AllowedIPs. Например, следующее значение охватывает все адреса IPv4, кроме 192.168.0.0/16:

AllowedIPs = 0.0.0.0/1, 128.0.0.0/2, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4, 224.0.0.0/3

Если ваша локальная сеть использует другой диапазон, например 10.x.x.x или 172.16.x.x, рассчитайте список для него с помощью калькулятора AllowedIPs и убедитесь, что подсеть туннеля в него входит. В этом значении нет маршрута /0, поэтому kill-switch с ним недоступен.

Info Не используйте одну и ту же подсеть для туннеля и локальной сети. Если домашняя сеть 10.0.0.0/24, выберите для туннеля другой диапазон, например 10.8.0.0/24.

Чтобы получить доступ к сети за сервером, например к офисной сети 192.168.10.0/24, на сервере ничего добавлять не нужно: у него уже есть маршрут в собственную локальную сеть. На клиенте добавьте эту подсеть в AllowedIPs секции [Peer], например AllowedIPs = 10.0.0.0/24, 192.168.10.0/24. Сервер также должен пересылать и транслировать этот трафик, см. раздел "Настройка NAT на сервере для полного туннелирования". Устройства в этой сети отвечают на локальный адрес сервера, поэтому проще всего вернуть ответы через туннель с помощью NAT на сервере.

Настройка NAT на сервере для полного туннелирования

Если клиенты используют AllowedIPs = 0.0.0.0/0 и их трафик должен действительно выходить в интернет через сервер, сервер должен транслировать внутренние адреса WireGuard в свой внешний адрес. В Windows для этого используется команда New-NetNat, а не скрипты PostUp и PostDown, как в Linux.

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

New-NetNat -Name WireGuardNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/24

Замените 10.0.0.0/24 на свою подсеть туннеля и убедитесь, что префикс охватывает все адреса клиентов. Клиент вне этого диапазона, например 10.0.1.2, под правило не попадёт. Активные правила можно посмотреть в любой момент:

Get-NetNat

Чтобы позже удалить правило NAT, выполните:

Remove-NetNat -Name WireGuardNAT

Если клиенты подключаются и рукопожатие проходит, но их интернет-трафик всё равно не идёт через сервер, включите IP-пересылку на интерфейсах, участвующих в маршрутизации, и проверьте снова. Точная форма зависит от версии Windows, например:

Set-NetIPInterface -InterfaceAlias "Ethernet" -Forwarding Enabled

Примените её к внешнему интерфейсу, через который идёт интернет-трафик, и к интерфейсу WireGuard, используя их реальные имена из Get-NetIPInterface.

Info

New-NetNat требует Windows 10, Windows 11 или Windows Server 2016 и новее, а в некоторых системах для него нужно включить компонент Hyper-V, даже если Hyper-V больше нигде не используется. На некоторых тарифах VPS Hyper-V включить нельзя, и этот способ не работает. Достаточно ли одного New-NetNat или нужно также включить IP-пересылку, может зависеть от версии Windows, поэтому проверьте это на своём сервере, если полное туннелирование не работает.

Устранение неполадок

Туннель активен, но соединения с сервером нет. Проверьте, что UDP-порт WireGuard, например 51820, открыт в брандмауэре сервера. Убедитесь, что открытые ключи правильно скопированы между конфигурациями сервера и клиента. Проверьте, что Endpoint в конфигурации клиента указывает на реальный публичный IP-адрес сервера, а не на внутренний адрес туннеля.

DNS не работает после подключения. Добавьте DNS-сервер в секцию интерфейса клиента:

[Interface] PrivateKey = ... Address = ... DNS = 1.1.1.1, 1.0.0.1

Счётчики пакетов не растут. Туннель не передаёт данные. Проверьте, что AllowedIPs правильно задан на обеих сторонах, что внутренние адреса WireGuard не пересекаются с существующей локальной сетью и что ListenPort не занят другим приложением.

Флажок kill-switch не снимается. Редактор переписывает AllowedIPs, только если может прочитать всю конфигурацию. Проверьте, что в секции [Peer] указан корректный открытый ключ, скопированный с сервера, и что каждая настройка стоит на отдельной строке, затем попробуйте снова.

Нужно больше деталей для диагностики проблемы. Откройте туннель в приложении WireGuard и перейдите на вкладку Log, где записываются рукопожатия, ошибки и события подключения в момент их возникновения. Оттуда же журнал можно экспортировать, если его нужно кому-то передать.

Автозапуск WireGuard после перезагрузки сервера

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

wireguard /installtunnelservice "C:\Program Files\WireGuard\wg_server.conf"

Выполните эту команду один раз, а не при каждом запуске. Активация туннеля из приложения WireGuard обычно устанавливает ту же службу, поэтому во многих случаях достаточно один раз его активировать. Чтобы позже удалить службу, используйте имя туннеля, то есть имя файла конфигурации без расширения .conf.

wireguard /uninstalltunnelservice wg_server

Чтобы перезапустить службу, например после изменения конфигурации, выполните команду удаления, а затем снова команду установки.

Info

Поскольку туннель работает как служба, отдельная задача в Планировщике заданий не нужна.

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

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • kingdom
  • germany
  • Español
  • French
  • Hrvatska
  • Italiano
  • Poland
  • Slovenski
  • ukraine
  • Türkçe
  • Русский
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA