Почему WireGuard VPN начинает работать только после смены сети (например, при переключении между Wi‑Fi и мобильной сетью)?

Арендовал за рубежом три VPS в разных странах (Нидерланды, Англия, США), установил на них Ubuntu и WireGuard по самым простым инструкциям. При подключении к любому из серверов ситуация одинаковая: первый handshake проходит успешно — на сервере <code>wg show</code> видно, что peer подключился и были приняты/отправлены какие‑то пакеты, — но клиент не выходит в интернет и не может достучаться до сервера WireGuard (и сервер не достучаться до клиента). Все последующие handshakes завершаются таймаутом.
  • 6 июня 2026 г. 22:00
Ответы на вопрос 1
Коротко — это почти всегда либо NAT/«жизнь» NAT‑маппинга + поведение мобильных сетей/приложений, либо ошибка в маршрутах/форварде/маскараде на сервере. Симптом «первый handshake виден, пакеты в wg show, а дальше ничего; работает только после смены сети» очень похоже на то, что после initial‑handshake у клиента или NAT‑роутера не сохраняется корректная 5‑tuple (IP:port) или сокет мобильного приложения уходит в спящий режим, и серверу дальше некуда слать трафик.

Что проверить и как исправить (пошагово)

1) Правильность маршрутов и AllowedIPs
- На клиенте: ip addr show wg0 и ip route show. Если вы хотите весь трафик через VPN — в peer конфиге на клиенте должно быть AllowedIPs = 0.0.0.0/0 (и ::/0 для IPv6).
- На сервере: в peer для клиента AllowedIPs = клиент_vpn_ip/32 (например 10.0.0.2/32). Если там стоит 0.0.0.0/0 — это неправильно для многопользовательского сервера.

2) Форвардинг и NAT на сервере (если вы даёте доступ в интернет через VPS)
- Включить ip_forward:
  sudo sysctl -w net.ipv4.ip_forward=1
  и в /etc/sysctl.conf прописать net.ipv4.ip_forward=1
- Настроить MASQUERADE (пример для eth0 и wg0):
  sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  sudo iptables -A FORWARD -i eth0 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
  sudo iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
- Если используете nftables/ufw — не забыть соответствующие правила.

3) NAT и PersistentKeepalive (особенно для мобильных / роутеров)
- Если клиент за NAT или в мобильной сети — поставить в конфиге клиента в секции peer:
  PersistentKeepalive = 25
  Это держит NAT‑маппинг и socket «тёплыми», сервер сможет доставлять пакеты. Без этого многие мобильные сети/роутеры убивают UDP‑маппинг через десятки секунд.
- Для мобильных приложений (Android/iOS) убедитесь, что приложение не уходит в жёсткий фон и что «keepalive» включён (Android‑приложение обычно делает это при настройке).

4) Диагностика трафика
- На сервере смотрите wg show и tcpdump:
  sudo wg show
  sudo tcpdump -n -i eth0 udp port 51820
  и на клиенте tcpdump -i <интерфейс> чтобы увидеть, приходят ли ответы.
- Проверяйте latest handshake unix timestamp в wg show — если он обновляется при переключении сети, значит endpoint меняется.

5) MTU/фрагментация
- Если handshake проходит, а дальнейшие пакеты «пропадают», может быть PMTU/фрагментация. Попробуйте снизить MTU на wg интерфейсе, например:
  ip link set mtu 1420 dev wg0
  Или 1280 при проблемах с мобильными сетями.

6) Другие моменты
- Порт и firewall провайдера VPS: убедитесь, что UDP‑порт WireGuard (обычно 51820) открыт и не блокируется.
- Если у вас в peer в качестве Endpoint указан домен, резолв может возвращать разные IP (CDN) — лучше фиксировать текущий IP или обновлять его.
- На клиенте проверьте DNS: если VPN подключён, но DNS неверный — «кажется» что нет интернета. В конфиге клиента можно прописать DNS = 1.1.1.1 или ваш DNS.

Почему переключение сети решает проблему
- При смене сети мобильный стэк генерирует новый исходный IP/порт и/или приложение пересоздаёт UDP‑сокет — это принудительно создает новый NAT‑mapping и заставляет инициировать полноценный handshake, после чего соединение начинает работать. Добавление PersistentKeepalive и корректной настройки NAT/форварда устраняет необходимость в «ручной перезагрузке» сети.

Если хотите — пришлите:
- вывод sudo wg show,
- конфиги /etc/wireguard/*.conf (обезличьте приватные ключи),
- вывод ip route и ip addr на клиенте,
и я конкретно укажу, где ошибка и что править.
Похожие вопросы