Режим SOCKS5-прокси¶
Режим SOCKS5 — это режим по умолчанию и самый гибкий способ использования r-vpn. Он запускает локальный SOCKS5-прокси, на который можно направить отдельные приложения, не затрагивая остальной трафик на вашей машине.
Запуск прокси¶
Адрес прослушивания по умолчанию: 127.0.0.1:1080
После запуска вы увидите:
Настройка приложений¶
macOS — Системный прокси¶
Системные настройки → Сеть → ваше подключение → Детали → Прокси
Включите SOCKS-прокси и укажите:
- Сервер: 127.0.0.1
- Порт: 1080
Это маршрутизирует весь системный трафик (Safari, curl и т.д.) через VPN.
Firefox¶
Настройки → Общие → Сетевые настройки → Ручная настройка прокси
- SOCKS Host:
127.0.0.1 - Port:
1080 - Выберите SOCKS v5
- Установите флажок Proxy DNS when using SOCKS v5 для предотвращения утечек DNS (не требуется, если включён DNS-прокси)
Chrome / Brave¶
Chrome использует системный прокси на macOS. На Linux используйте расширение SwitchyOmega:
- Установите SwitchyOmega
- Создайте новый профиль → Протокол: SOCKS5, Сервер:
127.0.0.1, Порт:1080 - Переключитесь на этот профиль, когда хотите использовать VPN
curl¶
Linux — Системный (переменные окружения)¶
export ALL_PROXY=socks5://127.0.0.1:1080
export HTTPS_PROXY=socks5://127.0.0.1:1080
export HTTP_PROXY=socks5://127.0.0.1:1080
Добавьте в ~/.bashrc или ~/.zshrc для сохранения между сессиями.
HTTP-прокси¶
r-vpn также может работать как HTTP-прокси параллельно с SOCKS5-прокси. Это полезно, когда приложения или среды ожидают переменные окружения HTTP_PROXY/HTTPS_PROXY, указывающие на HTTP-прокси (наиболее распространённое соглашение для CLI-инструментов, таких как curl, git, npm, pip и Docker).
Оба прокси используют один и тот же мультиплексированный туннель — запуск обоих одновременно не добавляет никаких накладных расходов.
Включение HTTP-прокси¶
Перезапустите клиент — вы должны увидеть:
Использование переменных окружения¶
Самый распространённый способ использования HTTP-прокси — через переменные окружения. Большинство CLI-инструментов и языков программирования учитывают их автоматически:
export HTTP_PROXY=http://127.0.0.1:8118
export HTTPS_PROXY=http://127.0.0.1:8118
export ALL_PROXY=http://127.0.0.1:8118
После установки этих переменных инструменты вроде curl, git, npm, pip, wget и Docker маршрутизируют трафик через VPN без какой-либо настройки для каждого приложения:
# Флаг --proxy не нужен — переменные окружения подхватываются автоматически
curl https://api.ipify.org
git clone https://github.com/user/repo.git
pip install requests
Добавьте в ~/.bashrc или ~/.zshrc для сохранения между сессиями.
curl (явно)¶
Как это работает¶
HTTP-прокси обрабатывает два типа запросов:
- HTTP CONNECT — используется для HTTPS. Клиент отправляет
CONNECT host:443 HTTP/1.1, прокси отвечает200 Connection Established, и трафик проходит через зашифрованный туннель к получателю. - Прямая HTTP-пересылка — используется для незашифрованного HTTP. Клиент отправляет
GET http://host/path HTTP/1.1, прокси подключается к хосту и пересылает запрос.
Оба пути учитывают раздельное туннелирование и используют тот же мультиплексированный WebSocket-туннель, что и SOCKS5.
Аутентификация¶
Для включения Basic-аутентификации:
[http_proxy]
enabled = true
listen_address = "127.0.0.1:8118"
auth_enabled = true
auth_username = "user"
auth_password = "changeme"
Клиенты должны отправлять заголовок Proxy-Authorization: Basic ... (браузеры и curl -x обрабатывают это автоматически, когда учётные данные указаны в URL: http://user:pass@127.0.0.1:8118).
SOCKS5 vs HTTP-прокси¶
| SOCKS5 | HTTP-прокси | |
|---|---|---|
| Протоколы | Любой (TCP + UDP) | Только HTTP и HTTPS |
| Переменные окружения | ALL_PROXY=socks5://... |
HTTP_PROXY=http://... |
| Поддержка браузерами | Нативно на macOS/Firefox | Универсально (все браузеры) |
| Поддержка CLI-инструментами | Некоторые (curl, Node) | Большинство (curl, git, pip, npm, Docker) |
| Аутентификация | SOCKS5 username/password | HTTP Basic auth |
| Лучше всего для | Поканальная маршрутизация, UDP | Системные переменные окружения, CI/CD |
В большинстве случаев используйте HTTP-прокси с переменными окружения — это обеспечивает наибольшую совместимость с CLI-инструментами и системами сборки. Используйте SOCKS5 для поканальной маршрутизации или когда вам нужна поддержка UDP.
Раздельное туннелирование¶
Раздельное туннелирование позволяет маршрутизировать только определённый трафик через VPN, в то время как остальной подключается напрямую. Это полезно, когда вы хотите получать доступ к заблокированным сайтам через VPN, не затрагивая локальную сеть и внутренний трафик.
Встроенный обход для Китая¶
Включите раздельное туннелирование с автоматическим обходом китайских IP в client.toml:
При включении трафик на китайские IP (на основе данных APNIC — около 8800 сетей) подключается напрямую, а всё остальное маршрутизируется через VPN.
Пользовательские обходные сети¶
bypass-networks.txt — один CIDR на строку:
Блокировка рекламы¶
Блокирует известные рекламные и трекерные домены на уровне DNS. Никаких байт не отправляется, соединение не устанавливается.
DNS-прокси¶
Важно: Без DNS-прокси ваши DNS-запросы могут утекать к вашему интернет-провайдеру даже при использовании SOCKS5-прокси. См. Предотвращение утечек DNS для полного объяснения.
По умолчанию DNS-запросы разрешаются системным DNS-сервером — вне VPN-туннеля. Это означает, что ваш провайдер может наблюдать, какие домены вы запрашиваете, даже когда ваш трафик проксируется.
r-vpn включает встроенный DNS-прокси, который разрешает все запросы на стороне сервера через тот же зашифрованный WebSocket-туннель. Он также учитывает раздельное туннелирование: обходные домены разрешаются локально, а заблокированные рекламные/трекерные домены сразу возвращают NXDOMAIN без обращения к сети.
Включение DNS-прокси¶
Примечание: Порт 53 требует root или
CAP_NET_BIND_SERVICE. Используйте порт5353для тестирования без привилегий (см. ниже).
Перезапустите клиент — вы должны увидеть:
macOS — системный¶
Запустите клиент с sudo (чтобы он мог привязать порт 53), затем добавьте 127.0.0.1 в качестве DNS-сервера:
Системные настройки → Сеть → ваше подключение → Детали → DNS → + → 127.0.0.1
Или через командную строку (замените Wi-Fi на имя вашего интерфейса):
Для восстановления исходного DNS после завершения:
Linux — системный¶
Запустите клиент от root (или с_capability CAP_NET_BIND_SERVICE) с listen_address = "127.0.0.1:53", затем укажите ваш резолвер на него.
/etc/resolv.conf (напрямую):
systemd-resolved — добавьте в /etc/systemd/resolved.conf:
sudo systemctl restart systemd-resolved
Тестирование без привилегий (порт 5353)¶
Проверьте, что всё работает:
Ответ придёт от вашего VPN-сервера, а не от локального провайдера.
Режимы подключения¶
SOCKS5-прокси поддерживает два режима подключения к серверу:
Мультиплексированный режим (по умолчанию)¶
Все SOCKS5-потоки используют одно WebSocket-соединение с одним общим сеансом DoubleRatchet. Каждый SOCKS5 CONNECT создаёт логический «поток» через контрольные сообщения CreateFlow/CloseFlow в одном туннеле.
Преимущества: - Одно TLS-рукопожатие, один обмен ключами X3DH — около 250 мс накладных расходов против ~600 мс на соединение - Меньше нагрузка на сервер (один WebSocket, один ratchet вместо одного на поток) - Лучше подходит для сценариев с большим количеством потоков (браузеры открывают 100+ соединений) - Сервер поддерживает до 2000 одновременных потоков на мультиплексированный сеанс
Как это работает:
1. Первый SOCKS5 CONNECT открывает мультиплексированный WebSocket-туннель ({server_path}/mux)
2. Выполняется X3DH-рукопожатие для установления общего DoubleRatchet
3. Последующие потоки отправляют контрольные сообщения CreateFlow в том же туннеле
4. Сервер отвечает подтверждением FlowCreated, после чего данные передаются через мультиплексированные кадры
Конфигурация:
[socks5]
multiplex = true # включено по умолчанию
# mux_path по умолчанию автоматически = {server_path}/mux
Для явного переопределения конечной точки мультиплексирования:
Устаревший режим (резервный)¶
Каждый SOCKS5-поток открывает отдельное WebSocket-соединение с собственным X3DH-рукопожатием и DoubleRatchet. Это исходное поведение.
Когда использовать: - Устранение неполадок — определить, является ли проблема специфичной для потока или затрагивает весь туннель - Совместимость со старыми версиями сервера без эндпоинта мультиплексирования
Сравнение режимов¶
| Мультиплексированный | Устаревший | |
|---|---|---|
| WebSocket-соединений на сеанс | 1 | 1 на поток |
| X3DH-рукопожатий | 1 | 1 на поток |
| Серверных потоков | До 2000 | Без ограничений |
| WS-соединений на стороне сервера | 1 | N |
| Лучше всего для | Браузеры, тяжёлые сайты | Отладка, старые серверы |
Совет по устранению неполадок: Если вы испытываете проблемы с подключением в мультиплексированном режиме (например, некоторые приложения не загружаются, тайм-ауты на тяжёлых сайтах), попробуйте переключиться на устаревший режим, чтобы определить, затрагивает ли проблема весь туннель или только конкретный поток:
Учтите, что устаревший режим открывает один WebSocket на каждый TCP-поток. На загруженных сетях (например, браузеры со множеством вкладок) это может быстро исчерпать лимитmax_connections_per_ipна сервере. Если вы регулярно используете устаревший режим, увеличьте лимиты скорости сервера соответственно:
Изменение адреса прослушивания¶
Для прослушивания на определённом интерфейсе (например, для совместного использования прокси с другими устройствами в вашей локальной сети):
Примечание по безопасности: Открывайте порт SOCKS5 только в доверенных сетях. По умолчанию аутентификация отсутствует.
Для добавления аутентификации:
[socks5]
listen_address = "0.0.0.0:1080"
auth_enabled = true
auth_username = "user"
auth_password = "changeme"
Запуск в качестве службы¶
Linux (systemd)¶
[Unit]
Description=r-vpn Client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=YOUR_USER
ExecStart=/usr/local/bin/rvpn -c /etc/rvpn/client.toml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
FreeBSD (rc.d)¶
Создайте /usr/local/etc/rc.d/rvpn_client: