WireGuard Error: PersistentKeepalive failure — Обрыв туннеля за NAT
После нескольких минут отсутствия сетевой активности туннель перестает принимать входящие пакеты. Соединение восстанавливается только после того, как клиент сам отправит любой запрос наружу.
- Сервер теряет возможность инициировать соединение с клиентом за NAT (SSH, мониторинг Prometheus/Zabbix отваливаются).
- Тайм-аут сокета происходит ровно через 30, 60 или 120 секунд после завершения передачи трафика.
- В выводе
wg showна сервереendpointклиента отображает устаревший порт. - Параметр
PersistentKeepaliveотсутствует в конфигурационном файле клиента.
1. Причина закрытия состояния в таблицах NAT роутеров
Домашние роутеры, корпоративные файрволы и CGNAT операторов удаляют трансляции UDP-портов из таблицы NAT (Stateful Firewall Table), если по порту нет трафика в течение короткого промежутка времени (обычно 30–60 секунд).
2. Настройка параметра PersistentKeepalive
Добавьте директиву PersistentKeepalive = 25 в секцию [Peer] на клиенте, находящемся за NAT/брандмауэром:
# Конфигурация клиента (/etc/wireguard/wg0.conf) или мобильного профиля:
[Interface]
PrivateKey = <Client_Private_Key>
Address = 10.0.0.2/24
[Peer]
PublicKey = <Server_Public_Key>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
# Отправка пустого аутентифицированного пакета каждые 25 секунд
PersistentKeepalive = 253. Применение изменений без перезапуска интерфейса
wg set wg0 peer <Server_PublicKey> persistent-keepalive 254. Проверка активности Keepalive
Убедитесь, что параметр применен:
wg show wg0 | grep -i keepaliveВ выводе должна появиться строка: persistent keepalive: every 25 seconds.
Частые вопросы (FAQ)
Нужно ли указывать PersistentKeepalive на сервере?
Нет. На сервере с публичным статическим IP-адресом указывать этот параметр не нужно. Он настраивается исключительно на клиентах, работающих за NAT.
Почему рекомендуется именно интервал 25 секунд?
Большинство маршрутизаторов и мобильных операторов сбрасывают неактивные UDP-сессии через 30 секунд. Интервал в 25 секунд гарантирует поддержание сокета открытым с минимальным расходом трафика и батареи.
Сколько трафика расходует PersistentKeepalive?
Keepalive-пакет имеет размер всего 32 байта. При интервале 25 секунд суммарный трафик за сутки составляет менее 150 килобайт.
Помогает ли PersistentKeepalive при смене IP-адреса клиента (Roaming)?
Да. Как только клиент переключается между сетями (например, с Wi-Fi на LTE), первый же keepalive-пакет сообщает серверу новый endpoint (IP и порт) клиента.