Коротко — это почти всегда либо 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 на клиенте,
и я конкретно укажу, где ошибка и что править.