Перейти к содержимому

Руководство по устранению неполадок

Решения типичных проблем с rVPN.


Симптомы: клиент зависает на Connecting to wss://... и в итоге падает по таймауту.

Проверьте:

  1. Порт сервера доступен:
Окно терминала
# From a different machine
nc -zv your-server.com 443
curl -I https://your-server.com/api/v1/ws
  1. Брандмауэр разрешает порт 443:
Окно терминала
sudo ufw status # UFW
sudo iptables -L -n | grep 443 # iptables
  1. TLS-сертификат действителен:
Окно терминала
openssl s_client -connect your-server.com:443 -servername your-server.com </dev/null 2>/dev/null | openssl x509 -noout -dates
  1. WebSocket-путь правильный. Клиенты подключаются к {websocket_path} (например, /api/v1/ws). Если ваш сервер использует другой путь, обновите client.toml.

Симптомы: клиент показывает TLS handshake failed или certificate verify failed.

Причины и решения:

  1. Сертификат Let’s Encrypt не обновлён:
Окно терминала
sudo certbot certificates
sudo systemctl reload rvpn-server
  1. Неверное имя хоста в server_address:
# The hostname must match the certificate
server_address = "wss://your-server.com/api/v1/ws" # Certificate must be for your-server.com
  1. Несоответствие SNI:
# If connecting through a CDN or by IP
server_address = "wss://10.0.0.1/api/v1/ws"
sni_hostname = "your-server.com" # Certificate hostname
  1. iOS: проблема проверки сертификата (старые сборки): Убедитесь, что вы пересобрали Rust-библиотеку после обновления. TLS-стек rVPN использует BoringSSL со встроенным корневым хранилищем Mozilla и не обращается к keychain iOS, поэтому ротация сертификатов или изменения доверия на уровне ОС не применяются до пересборки приложения.

Симптомы: клиент моментально падает с Connection refused.

Проверьте:

Окно терминала
# Is the server running?
sudo systemctl status rvpn-server
# Is it listening on the right port?
sudo ss -tlnp | grep 443
# Can you connect locally? (uses whatever bind_address is set to)
curl -I https://127.0.0.1:443/api/v1/ws --insecure

Симптомы: соединение начинается, но падает при установке шифрования.

Причины:

  1. Несоответствие набора prekey: Клиент и сервер должны использовать один и тот же набор prekey. Если сервер провёл ротацию ключей, а у клиента старый набор, это может дать сбой.
Окно терминала
# On server: regenerate prekey bundle
rvpn-server prekey-bundle
# Distribute new prekey-bundle.json to clients
  1. Ключ идентификации изменился: Если ключ идентификации сервера был пересоздан, всем клиентам нужен новый набор prekey.

Симптомы: Connection refused или Rate limited после успешной работы некоторое время.

Проверьте серверные лимиты:

[server.rate_limit]
max_connections_per_ip = 500 # default
max_handshakes_per_minute = 2000 # default

Каждое клиентское соединение занимает один слот. Значения по умолчанию щедрые — если у вас очень большой парк на одном egress-IP, поднимите их; если вас зондируют и вы хотите лимиты жёстче, опустите.


Клиент подключается, но нет доступа в интернет

Заголовок раздела «Клиент подключается, но нет доступа в интернет»

Проверка 1: IP-форвардинг на сервере:

Окно терминала
sysctl net.ipv4.ip_forward
# Must return: net.ipv4.ip_forward = 1

Если не включено:

Окно терминала
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf

Проверка 2: правила NAT на сервере:

Окно терминала
sudo iptables -t nat -L POSTROUTING -v
sudo iptables -L FORWARD -v

Вы должны видеть правила MASQUERADE и FORWARD ACCEPT.

Если их нет:

Окно терминала
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Проверка 3: группа безопасности/брандмауэр сервера разрешает исходящий трафик: Сервер должен иметь возможность инициировать исходящие соединения на любой IP на любом порту, чтобы NAT работал.

Проверка 4: NAT включён в server.toml:

[server.network]
nat_enabled = true

Проверка 5: маршруты клиента:

Окно терминала
# On client, check routing table
ip route show # Linux
route -n get 0.0.0.0 # macOS
# Default route should point to tunnel interface

Симптомы: вы можете пинговать внешние IP, но ответа нет. Логи сервера показывают ретрансляцию фреймов, но нет «Relay completed».

Первопричина: SOCKS5-ответ был отправлен до готовности туннеля.

Исправление: это был баг в старых версиях. Пересоберите и разверните заново:

Окно терминала
cd rvpn-ios && ./build_rust.sh

Проверьте логи сервера:

INFO rvpn_server: Listening on 0.0.0.0:443
INFO rvpn_server: WebSocket path: /api/v1/ws
INFO rvpn_server: TUN mode enabled

Если TUN-режим не включён, клиенты в TUN-режиме не смогут корректно подключиться.


Проверьте:

Окно терминала
sudo ip addr show tun0
sudo ip link show tun0

Если интерфейса нет:

  1. Убедитесь, что enabled = true в [server.tun]
  2. Проверьте логи сервера на ошибки при создании интерфейса
  3. Попробуйте другое имя интерфейса на случай конфликта имён

Проверьте:

Окно терминала
# On server
ping 10.200.0.1 # From server to itself via tun0
# On client
ping 10.200.0.1 # Client should be able to reach server's TUN IP

Если клиент не может достучаться до 10.200.0.1, туннель установлен некорректно.


Проверка 1: прокси запущен:

Окно терминала
curl --socks5 127.0.0.1:1080 https://api.ipify.org

Если это возвращает IP VPN-сервера, прокси работает.

Проверка 2: системные настройки прокси: Убедитесь, что ваша система или приложение настроены на использование 127.0.0.1:1080 как SOCKS5-прокси.

Проверка 3: настройки прокси в браузере: Chrome и Edge используют системные настройки прокси. У Firefox свои собственные настройки прокси.

Проверка 4: специфика приложения: Некоторые приложения не поддерживают SOCKS5 (только HTTP-прокси). Используйте адаптер SOCKS5-в-HTTP или переключитесь на TUN-режим.


Симптомы: тест DNS-утечек показывает DNS вашего провайдера, а не VPN.

Исправление: включите DNS-прокси:

[dns_proxy]
enabled = true
listen_address = "127.0.0.1:53"

Настройте системный DNS на 127.0.0.1. См. Защиту от DNS-утечек для подробной настройки.

Специфика Chrome: Chrome использует собственный безопасный DNS-резолвер по умолчанию, который обходит системный DNS и VPN-туннель.

  • На Desktop/Android: перейдите в Настройки → Конфиденциальность и безопасность → Безопасность → Использовать безопасный DNS и отключите.
  • Очистите DNS-кеш Chrome: посетите chrome://net-internals/#dns и нажмите Clear host cache.
  • На iOS: принудительно закройте Chrome или очистите данные браузера, чтобы сбросить кеш.

Ограничения соединения на поток (компромисс мультиплексирования)

Заголовок раздела «Ограничения соединения на поток (компромисс мультиплексирования)»

multiplex по умолчанию false — стандартный, рекомендуемый режим, — потому что «один WebSocket на поток» сливается с шаблоном трафика обычного браузинга и обходит DPI-классификаторы, ловящие форму мультиплексирования. Компромисс в том, что активный браузер может открыть десятки одновременных WebSocket’ов и на общих egress-IP упереться в серверный лимит max_connections_per_ip.

Два способа справиться:

  1. Попросите администратора сервера повысить лимиты:
    [server.rate_limit]
    max_connections_per_ip = 1000
    max_handshakes_per_minute = 5000
  2. Включите мультиплексирование на клиенте, чтобы один туннель обслуживал все потоки (меньше задержка, но более отличительный шаблон трафика):
    [socks5]
    multiplex = true

Возможные причины:

  1. Высокая задержка: VPN-сервер географически далеко
  2. Перегрузка сервера: слишком много соединений к одному серверу
  3. Ограничение полосы: upstream сервера насыщен
  4. Проблемы с MTU: фрагментация пакетов на высоколатентных каналах

Решения:

  1. Снизьте MTU в client.toml:
[tun]
mtu = 1280
  1. Попробуйте другой сервер, ближе к вам
  2. Проверьте нагрузку сервера: uptime, htop
  3. Отключите IPv6, если он не нужен:
[network]
ipv6_enabled = false
prefer_ipv4 = true

Проверьте:

  1. Адрес сервера начинается с wss:// (не https://)
  2. Ключ идентификации сгенерирован (Settings -> Identity)
  3. Набор prekey импортирован
  4. Сервер работает и доступен

Пересоберите Rust-библиотеку:

Окно терминала
cd rvpn-ios && ./build_rust.sh

Возможные причины:

  1. Нестабильная сеть (переключение Wi-Fi на сотовую)
  2. iOS переводит приложение в фоновой режим
  3. VPN-профиль отзывается

Решения:

  1. Включите «Always-on VPN» в iOS Настройки -> VPN
  2. Проверьте наличие обновлений iOS
  3. Пересоберите и переустановите приложение

Причина: пул DHCP на сервере исчерпан.

Исправление: увеличьте диапазон DHCP на сервере:

[server.network]
dhcp_range = "10.200.0.0/22" # /22 gives 1022 IPs instead of 254

Или отключите неиспользуемых клиентов.


VPN перестал работать после обновления приложения

Заголовок раздела «VPN перестал работать после обновления приложения»

Симптомы: приложение показывает «Connected», но трафик не проходит, или соединение сразу падает после обновления из App Store или пересборки из Xcode.

Причина: macOS хранит VPN-профили в системных настройках независимо от приложения. После обновления ссылка сохранённого профиля на туннельное расширение устаревает, поскольку подпись кода расширения изменилась. Приложение пытается запустить старое расширение, которого больше нет.

Исправление:

  1. Откройте Системные настройки > VPN (или Системные настройки > Основные > VPN и фильтры на более новых версиях macOS).
  2. Удалите запись rVPN.
  3. Заново откройте приложение rVPN и подключитесь. Приложение автоматически создаст свежий профиль.

Это исправлено в версии 1.2.4 и новее, которая автоматически обнаруживает и заменяет устаревшие профили при запуске.


«Failed to start VPN» или соединение молча не удаётся

Заголовок раздела ««Failed to start VPN» или соединение молча не удаётся»

Проверьте:

  1. Откройте приложение rVPN и перейдите в Settings (Cmd+,). Убедитесь, что профиль показывает зелёные галочки и для Identity Key, и для Prekey Bundle.
  2. Адрес сервера должен начинаться с wss:// и не содержать лишних пробелов.
  3. Сервер должен работать и быть доступным на порту 443.

Если в профиле нет ключей:

  1. Сгенерируйте новый ключ идентификации в редакторе профиля.
  2. Импортируйте набор prekey от администратора сервера.

Если ключи есть, но всё равно не работает:

  1. Удалите VPN-профиль из Системных настроек > VPN.
  2. Удалите приложение rVPN.
  3. Переустановите из App Store.
  4. Заново настройте профиль и подключитесь.

Туннель подключается, но DNS не разрешается

Заголовок раздела «Туннель подключается, но DNS не разрешается»

Приложение macOS запускает локальный DNS-прокси для разрешения DNS в split-tunnel. Если DNS не работает:

  1. Проверьте, что адрес сервера доступен из вашей сети.
  2. Попробуйте отключить раздельное туннелирование в редакторе профиля, чтобы протестировать режим полного туннеля.
  3. Проверьте логи сервера на ошибки DNS-прокси.

Логи уровня Rust (обходят редактирование логов macOS):

Окно терминала
cat ~/Library/Group\ Containers/group.org.rvpn.client/rvpn_tunnel_rust.log

Системные логи (могут быть отредактированы на macOS 12+):

Окно терминала
log show --predicate 'subsystem == "org.rvpn.tunnel"' --last 5m --level debug

Также можно использовать Console.app: фильтр по подсистеме org.rvpn.tunnel.


Проверьте:

[split_tunnel]
enabled = true # Must be true for any bypass to work
builtin_bypass_countries = ["CN"]

Убедитесь, что правила загружены: Логи клиента должны показывать правила обхода при запуске:

INFO rvpn_client: Split tunnel enabled, X networks bypassed

Проверьте таблицу маршрутизации:

Окно терминала
ip route show # Linux
route -n get 0.0.0.0 # macOS

Убедитесь, что обходные сети не в таблице маршрутизации VPN.


Причины:

  1. Стриминговые сервисы могут использовать GPS/локаль, а не только IP
  2. Валюта оплаты и история аккаунта влияют на контент
  3. IP CDN могут не совпадать с данными обхода по стране

Решения:

  1. Очистите куки и кеш браузера/приложения
  2. Используйте расширение браузера для подмены таймзоны и локали
  3. Может потребоваться режим полного туннеля (без обхода)

Проверьте задержку до сервера:

Окно терминала
ping your-server.com

Если задержка высока даже до сервера, проблема в географическом расстоянии, а не в VPN.

Оптимизируйте:

  1. Используйте сервер ближе к вам
  2. Снизьте MTU при спутниковом или высоколатентном канале:
[tun]
mtu = 1280

Проверьте:

  1. Полосу сервера: тест iperf3 к серверу
  2. Клиентское железо: шифрование ресурсоёмко на старых устройствах
  3. Перегрузку сети

Оптимизируйте:

[performance]
worker_threads = 4
crypto_worker_count = 4
recv_buffer_size = 262144
send_buffer_size = 262144

Для подробных логов клиента:

Окно терминала
RUST_LOG=debug rvpn -c ~/.config/rvpn/client.toml

Для логов сервера:

Окно терминала
RUST_LOG=debug sudo rvpn-server -c /etc/rvpn/server.toml
Окно терминала
# systemd journal
sudo journalctl -u rvpn-server -f
# kernel logs (for TUN interface issues)
dmesg | grep tun
Окно терминала
# Trace path to server
traceroute your-server.com
# Trace path from server to target
# (on server) sudo tcpdump -i tun0 -n
СообщениеЗначение
Listening on 0.0.0.0:443Сервер успешно запущен
WebSocket path: /api/v1/wsWebSocket-точка настроена
TUN mode enabledTUN-интерфейс сервера активен
X3DH handshake completeШифрование установлено
NAT enabledСервер будет маскарадировать клиентский трафик
Relay completedОдна сессия ретрансляции данных завершена
Too many connectionsПревышен лимит скорости