Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

Ошибка WireGuard: Handshake did not complete after 5 seconds, retrying

Обновлено: 24.08.2026  ·  Официальная база знаний
  • В выводе команды 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 wg0

3. Проверка публичных ключей (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 = 25

5. Проверка брандмауэра и проброса UDP портов

# Разрешить порт WireGuard на сервере (Ubuntu/Debian)
ufw allow 51820/udp

# Разрешить в iptables
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
Практический опыт инженера: Помните правило WireGuard: клиент указывает в [Peer] публичный ключ СЕРВЕРА, а сервер указывает в [Peer] публичный ключ КЛИЕНТА. Приватные ключи (PrivateKey) никогда не должны покидать хост!

Частые вопросы (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.