Ошибка WireGuard «Handshake did not complete»: решение проблемы
Симптомы ошибки соединения WireGuard
В интерфейсе клиента WireGuard (Windows, Android, iOS, macOS) статус туннеля горит зеленым («Подключено»), счетчик «Отправлено» (Sent) увеличивается с каждым кликом, однако счетчик «Получено» (Received) показывает 0 B. В логе клиента циклично повторяется ошибка:
Handshake for peer 1 (xxx.xxx.xxx.xxx:51820) did not complete, retrying after 5 seconds
Retrying handshake with peer...Причины отсутствия рукопожатия (Handshake)
| Причина сбоя | Где допущена ошибка | Что проверить |
|---|---|---|
| Несовпадение открытых ключей | Конфигурация Peer | Public Key клиента на сервере и сервера на клиенте |
| Закрыт входящий порт UDP | Фаервол сервера или роутер провайдера | Проброс порта UDP 51820 (или кастомного) |
| Блокировка провайдером | ЦСПА / DPI фильтрация провайдера | Смена стандартного порта 51820 на нестандартный |
| Неверный адрес Endpoint | Конфигурация клиента [Peer] | Правильность внешнего IP-адреса и порта сервера |
Пошаговый чек-лист исправления ошибки рукопожатия
- Проверка соответствия пар ключей (Самая частая ошибка!):
- В блоке
[Peer]на клиенте должен быть прописан PublicKey сервера (НЕ приватный ключ сервера и не публичный ключ клиента!). - На сервере в блоке
[Peer]клиента должен быть прописан PublicKey клиента.
- В блоке
- Проверка разрешения порта в фаерволе сервера:
WireGuard работает исключительно по протоколу UDP. Убедитесь, что порт открыт в iptables/ufw:
# Для Ubuntu/Debian: sudo ufw allow 51820/udp sudo ufw reload # Проверка прослушивания порта демоном WireGuard: sudo ss -u -l -p -n | grep 51820 - Добавление параметра поддержания сессии (PersistentKeepalive):
Если клиент находится за домашним роутером или строгим NAT мобильного оператора, добавьте в конфигурационный файл клиента в секцию
[Peer]строчку:PersistentKeepalive = 25 - Корректировка размера MTU:
В некоторых мобильных сетях стандартный MTU 1420 слишком велик. Уменьшите его в секции
[Interface]клиента:MTU = 1280
Особенность протокола WireGuard: WireGuard спроектирован по принципу «тишины в эфире» (Stealth). Если ключ или порт неверны, сервер никогда не отвечает кодами ошибок, чтобы не выдать свое присутствие сканерам сети. Клиент просто считает пакеты отправленными в никуда.
Частые вопросы (FAQ)
Почему WireGuard пишет 'Подключено', если рукопожатие не прошло?
WireGuard не имеет постоянного состояния сессии. Клиент активирует виртуальный сетевой интерфейс локально сразу при нажатии кнопки 'Подключить', даже если удаленный сервер физически выключен.
Как сгенерировать правильный Public Key из имеющегося Private Key?
В консоли выполните команду: echo 'ВАШ_ПРИВАТНЫЙ_КЛЮЧ' | wg pubkey — утилита мгновенно выведет соответствующий открытый ключ.
Можно ли перевести WireGuard на работу по протоколу TCP?
Нативно протокол WireGuard работает строго поверх UDP. Для работы через TCP требуются сторонние туннели-обертки (например, wstunnel или shadowsocks).
Что означает статус 'Latest handshake: 1 minute, 10 seconds ago'?
Это означает, что рукопожатие прошло успешно. Нормальный интервал обновления ключей в WireGuard составляет от нескольких секунд до 3 минут.