Ошибка WireGuard: Handshake did not complete after 5 seconds, retrying
- В выводе команды
wg showотсутствует строкаlatest handshakeили время последнего рукопожатия превышает несколько минут. - В системном журнале ядра:
wireguard: wg0: Handshake for peer N did not complete after 5 seconds, retrying (try 2). - Трафик не проходит через туннель: счетчик
transfer: txувеличивается, аrxостается равным 0 байт.
1. Архитектурная особенность WireGuard («Тишина» протокола)
WireGuard намеренно разработан абсолютно бесшумным (Stealth). Если пакет содержит неверный открытый ключ, неверный порт или отброшен файрволом, сервер никогда не отправляет ICMP или RST ответы. Для клиента это всегда выглядит как таймаут 5 секунд.
2. Проверка статуса пиров через утилиту wg
# Просмотр состояния интерфейса и времени последнего рукопожатия
wg show
# Проверка детальной статистики по интерфейсу
ip -s link show wg03. Проверка публичных ключей (Key Mismatch)
Убедитесь, что публичный ключ, сгенерированный из приватного ключа клиента, в точности прописан в секции [Peer] на сервере:
# На клиенте: генерация публичного ключа из своего приватного
echo "<клиентский_privatekey>" | wg pubkey
# Полученный хэш должен СТРОГО совпадать со строкой PublicKey в секции [Peer] сервера!4. Настройка PersistentKeepalive при работе за NAT
Если клиент находится за домашним роутером или мобильным NAT, входящие пакеты от сервера блокируются. Добавьте в конфигурацию клиента /etc/wireguard/wg0.conf:
[Peer]
PublicKey = <server_public_key>
Endpoint = 203.0.113.10:51820
AllowedIPs = 0.0.0.0/0
# Отправлять heartbeat-пакет каждые 25 секунд для удержания NAT-сессии:
PersistentKeepalive = 255. Проверка брандмауэра и проброса UDP портов
# Разрешить порт WireGuard на сервере (Ubuntu/Debian)
ufw allow 51820/udp
# Разрешить в iptables
iptables -A INPUT -p udp --dport 51820 -j ACCEPT Частые вопросы (FAQ)
Почему в выводе wg show растет только TX, а RX равен 0?
Это классический симптом: клиент зашифровывает и отправляет пакеты рукопожатия (TX), но сервер их либо не получает (закрыт UDP порт), либо молча отбрасывает из-за несовпадения Public Key или AllowedIPs.
Как включить отладочные логи WireGuard в ядре Linux?
Выполните: modprobe wireguard && echo 'module wireguard +p' > /sys/kernel/debug/dynamic_debug/control, после чего смотрите вывод dmesg -wT.
Может ли WireGuard работать через TCP?
Нет, протокол WireGuard спроектирован для работы исключительно поверх UDP. Для туннелирования через TCP требуются сторонние обертки, такие как wstunnel или udp2raw.
Какой стандартный интервал PersistentKeepalive рекомендуется использовать?
Значение 25 секунд является стандартом RFC для большинства маршрутизаторов NAT и файрволов со stateful inspection.