WireGuard PersistentKeepalive 25 и PresharedKey на VPS
PersistentKeepalive = 25 шлёт keepalive каждые 25 с, чтобы NAT держал туннель открытым; задавайте его на клиенте за NAT. PresharedKey добавляет симметричную постквантовую страховку.
Коротко: `PersistentKeepalive = 25` велит WireGuard каждые 25 секунд отправлять пиру крошечный аутентифицированный пакет, который поддерживает записи NAT и stateful-файрвола, чтобы другая сторона по-прежнему могла до вас достучаться. Обычно его задают только на пире за NAT (ноутбук, телефон или домашний роутер), а не на VPS с публичным IP. `PresharedKey` — необязательный дополнительный 256-битный симметричный секрет на пару пиров, генерируемый через `wg genpsk`; он подмешивается в рукопожатие как страховка от будущих квантовых атак на Curve25519.
В этом руководстве объясняются обе опции и приводятся рабочие конфиги сервера и клиента для WireGuard VPS. Полная настройка VPN с NAT и DNS — в руководстве по WireGuard VPN.
Что на самом деле делает PersistentKeepalive = 25
WireGuard по задумке молчалив: когда данных нет, он ничего не отправляет. Это хорошо для приватности и батареи, но роутеры с NAT и отслеживанием соединений удаляют простаивающие UDP-записи, часто через 30 секунд, иногда через несколько минут. Как только запись пропала, пакеты от сервера больше не доходят до клиента за NAT, пока клиент снова что-нибудь не отправит.
`PersistentKeepalive` — интервал в секундах. Со значением `25` пир отправляет пустой зашифрованный keepalive всякий раз, когда ничего не отправлял 25 секунд. Значение 25 рекомендовано в документации WireGuard, потому что оно надёжно меньше самых коротких распространённых UDP-таймаутов. По умолчанию опция выключена (`0`), а накладные расходы — один небольшой пакет примерно каждые 25 секунд на пира.
| Значение | Эффект | Когда использовать |
|---|---|---|
| 0 или не задано | Без keepalive; в простое туннель молчит | У обоих пиров публичные IP, или клиент всегда сам инициирует трафик |
| 25 | Keepalive каждые 25 с простоя | Клиент за NAT или CGNAT, который должен оставаться доступным |
| 15–20 | Более частые keepalive | Сети с необычно агрессивными UDP-таймаутами |
| 60+ | Меньше пакетов, выше риск потери записи NAT | Редко полезно; большинство NAT-устройств сбрасывают раньше |
На какой стороне нужен PersistentKeepalive
Задавайте keepalive на пире, до которого нельзя достучаться напрямую, — на том, что за NAT. Этот пир отправляет пакеты наружу, обновляя собственную запись NAT. У VPS с публичным IPv4 перед ним нет NAT, поэтому опция не нужна ему для доступности, и сам он не может держать открытым удалённый NAT, ведь адрес клиента он узнаёт только из пакетов клиента.
Если клиент лишь ходит в интернет через туннель, он мгновенно переподключается, как только отправляет трафик, так что keepalive необязателен. Он нужен, когда сервер или другие пиры должны сами инициировать соединения к клиенту: например, SSH на домашнюю машину, мониторинг или site-to-site связь.
- ▹Ноутбук или телефон за NAT к VPS: задайте `PersistentKeepalive = 25` только на клиенте.
- ▹VPS к VPS, у обоих публичные IP: обычно не задавайте; см. [руководство по mesh-сети WireGuard](/guides/wireguard-mesh-vps-cluster).
- ▹Домашний сервер за CGNAT, опубликованный через VPS: задайте на домашнем сервере, иначе VPS потеряет маршрут через несколько минут.
- ▹Мобильные клиенты: keepalive тратит немного батареи; включайте, только если устройство должно быть доступно.
PresharedKey: необязательный симметричный слой
Рукопожатие WireGuard использует обмен ключами Curve25519. Достаточно мощный квантовый компьютер теоретически мог бы взломать этот обмен, а противник — записывать трафик сегодня и расшифровать его позже. `PresharedKey` подмешивает в рукопожатие дополнительный 256-битный симметричный ключ. Симметричные ключи такого размера не считаются практически взламываемыми известными квантовыми алгоритмами, так что, пока PSK остаётся секретным, записанный трафик защищён даже при взломе части с открытыми ключами.
PSK задаётся на пару пиров, должен быть одинаковым в секциях `[Peer]` обоих пиров и уникальным для каждой пары. Он не заменяет приватные ключи, а добавляет ещё один слой. Если PSK не совпадают, рукопожатие молча не проходит, и в `wg show` нет `latest handshake`.
- ▹Генерируйте его через `wg genpsk` — команда выводит случайный 32-байтный ключ в base64.
- ▹Передавайте его по каналу, которому уже доверяете, например по SSH, — никогда через чат или email.
- ▹Один PSK на пару: в mesh-сети из пяти узлов это десять разных PSK.
- ▹Меняйте его, как любой другой секрет, когда устройство потеряно или выведено из эксплуатации.
Генерация ключей и PresharedKey
Установите инструменты в Debian 12/13 или Ubuntu 24.04 через `apt install wireguard`, затем генерируйте ключи на той машине, где будет жить каждый приватный ключ. PSK можно сгенерировать на любой стороне и скопировать на другую. `umask 077` гарантирует, что файлы будут доступны для чтения только root.
umask 077
cd /etc/wireguard
# on the VPS
wg genkey | tee server.key | wg pubkey > server.pub
# on the client
wg genkey | tee client.key | wg pubkey > client.pub
# once, on either side; copy to the other over SSH
wg genpsk > client.pskКонфиг сервера на VPS: /etc/wireguard/wg0.conf
У сервера фиксированный порт прослушивания, нет keepalive и нет `Endpoint` для клиента, потому что текущий адрес клиента он узнаёт из аутентифицированных пакетов.
[Interface]
Address = 10.8.0.1/24, fd08::1/64
ListenPort = 51820
PrivateKey = <contents of server.key>
[Peer]
# laptop
PublicKey = <contents of client.pub>
PresharedKey = <contents of client.psk>
AllowedIPs = 10.8.0.2/32, fd08::2/128Note · Откройте UDP 51820 в файрволе VPS и запустите туннель командой `systemctl enable --now wg-quick@wg0`. Прежде чем открывать что-то ещё, закройте SSH по руководству по защите SSH и проверьте права на ключи по руководству по StrictModes.
Конфиг клиента за NAT
Клиент указывает на публичный адрес VPS и содержит keepalive. Используйте `AllowedIPs = 10.8.0.0/24, fd08::/64` только для приватного туннеля или `0.0.0.0/0, ::/0`, чтобы весь трафик шёл через VPS.
[Interface]
Address = 10.8.0.2/32, fd08::2/128
PrivateKey = <contents of client.key>
[Peer]
PublicKey = <contents of server.pub>
PresharedKey = <contents of client.psk>
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.8.0.0/24, fd08::/64
PersistentKeepalive = 25Note · Для личной точки WireGuard достаточно VPS Wisp NoctisNode (1 vCPU, 1 GB RAM, $6 за 28-дневный цикл) с выделенным IPv4; оплатить его можно в Monero или другой крипте, а для регистрации нужны только email и пароль.
Проверка и устранение неполадок
Выполните `wg show` на обеих сторонах. У исправного клиента для пира видны свежий `latest handshake`, `persistent keepalive: every 25 seconds` и `preshared key: (hidden)`.
- 01.Рукопожатия нет вообще: проверьте, что UDP 51820 открыт на VPS, а в `Endpoint` указаны правильные IP и порт.
- 02.Рукопожатие проходит без PSK, но не с ним: PresharedKey в двух конфигах различается; скопируйте его заново.
- 03.Туннель работает, но через минуту сервер не может достучаться до клиента: добавьте `PersistentKeepalive = 25` на клиенте.
- 04.Изменить keepalive без перезапуска: `wg set wg0 peer <server-public-key> persistent-keepalive 25`.
- 05.Добавить PSK из файла на лету: `wg set wg0 peer <public-key> preshared-key /etc/wireguard/client.psk`.
FAQ
QЧто означает PersistentKeepalive 25 в WireGuard?
AПир отправляет зашифрованный keepalive-пакет после 25 секунд без другого трафика. Это держит открытыми записи NAT и файрвола, чтобы туннель оставался доступным с другой стороны.
QPersistentKeepalive задавать на сервере или на клиенте?
AНа пире за NAT — почти всегда это клиент. VPS с публичным IP он не нужен, и сам VPS не может держать открытой запись NAT клиента.
QОбязателен ли PresharedKey в WireGuard?
AНет, он необязателен. Он добавляет в рукопожатие симметричный секрет как страховку от будущих квантовых атак на Curve25519, поэтому это хороший выбор по умолчанию для долгоживущих туннелей.
QКак сгенерировать PresharedKey для WireGuard?
AВыполните `wg genpsk > peer.psk` и укажите одно и то же значение в строке `PresharedKey` секций `[Peer]` обоих пиров. Для каждой пары пиров используйте свой PSK.
QРасходует ли PersistentKeepalive много трафика?
AНет. Он отправляет один небольшой пакет примерно каждые 25 секунд простоя — для VPS это пренебрежимо мало, хотя на телефонах может немного сократить время работы от батареи.