WireGuard не передает трафик (Handshake failed): решение проблемы
Симптомы сбоя: Send растет, а Receive равен нулю
В официальном клиенте WireGuard туннель переходит в активный статус (горит зеленый значок), счетчик отправленных пакетов (Data sent / Передано) непрерывно увеличивается, но счетчик принятых данных (Data received / Получено) остается равным 0 B или замирает на нескольких сотнях байт. Строка Latest handshake (Последнее рукопожатие) отсутствует вовсе.
Диагностика счетчиков трафика WireGuard
| Показатель клиента | Состояние туннеля | В чем неисправность |
|---|---|---|
| Sent: 1.2 MB | Received: 0 B | Рукопожатие не состоялось | Неверный Public Key, закрыт UDP-порт на сервере или блокировка провайдером |
| Sent: 50 KB | Received: 48 KB (потом 0) | Рукопожатие прошло, пакеты застряли | Не настроен IP Forwarding/NAT на сервере или завышен размер MTU |
| Latest Handshake: 5 seconds ago | Туннель полностью исправен | Если сайты не грузятся — дело исключительно в DNS |
Пошаговый чеклист устранения сбоя Handshake
- Проверяем путаницу в публичных ключах (Главная ошибка новичков):
В WireGuard используется строгая перекрестная схема ключей:
- В конфиге Клиента в блоке
[Peer]должен быть прописан Public Key СЕРВЕРА. - В конфиге Сервера в блоке
[Peer]должен быть прописан Public Key КЛИЕНТА. - Ни в коем случае не копируйте Private Key в чужие блоки!
- В конфиге Клиента в блоке
- Проверяем параметр Endpoint и порт:
Убедитесь, что в файле клиента в строке
Endpoint = IP_СЕРВЕРА:51820указан правильный белый адрес сервера и открытый UDP-порт. - Открываем UDP-порт в фаерволе сервера:
WireGuard работает исключительно по протоколу UDP. Проверьте фаервол на Linux VPS:
sudo ufw allow 51820/udp sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT - Проверяем параметр AllowedIPs:
На стороне сервера в блоке пира клиента строка
AllowedIPsдолжна содержать точный внутренний IP клиента с маской /32 (например,AllowedIPs = 10.0.0.2/32). - Уменьшаем размер пакета (MTU):
При работе через мобильные сети или PPPoE стандартный размер пакета 1500 может фрагментироваться и блокироваться. Добавьте в блок
[Interface]клиента строчку с пониженным MTU:MTU = 1280
Важно для РФ: Во многих регионах стандартный порт WireGuard (51820 UDP) и сигнатура протокола блокируются провайдерами через ТСПУ. Попробуйте сменить порт на нестандартный (например, 45678 UDP) или использовать обфускаторы AmneziaWG / ShadowRay.
Частые вопросы (FAQ)
Почему WireGuard всегда показывает «Подключено», даже если сервер выключен?
WireGuard — это протокол без сохранения состояния (Stateless). У него нет постоянной сессии, как у TCP. Клиент просто отправляет UDP-пакеты в пустоту и считает соединение включенным.
Что делает параметр PersistentKeepalive = 25?
Он заставляет клиента отправлять пустой проверочный пакет каждые 25 секунд, чтобы домашний роутер не закрывал состояние трансляции NAT в таблице соединений.
Как посмотреть статус подключенных клиентов на сервере?
Выполните в терминале команду sudo wg show. Вы увидите список пиров, время последнего рукопожатия (latest handshake) и объем переданных данных.
Могут ли два разных клиента использовать один и тот же IP внутри AllowedIPs?
Категорически нет. Сервер WireGuard использует AllowedIPs для внутренней маршрутизации. Если у двух пиров совпадет IP, трафик пойдет только последнему ответившему.