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

Режим SOCKS5-прокси

Режим SOCKS5 — стандартный и самый гибкий способ использования rVPN. Он запускает локальный SOCKS5-прокси, на который можно направлять отдельные приложения — не затрагивая другой трафик на вашей машине.


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

Адрес прослушивания по умолчанию: 127.0.0.1:1080

После запуска вы увидите:

INFO SOCKS5 proxy listening on 127.0.0.1:1080

Системные настройки → Сеть → ваше подключение → Подробности → Прокси

Включите SOCKS Proxy и задайте:

  • Сервер: 127.0.0.1
  • Порт: 1080

Это направляет весь системный трафик (Safari, curl и т. д.) через VPN.

Настройки → Основные → Настройки сети → Ручная настройка прокси

  • SOCKS-узел: 127.0.0.1
  • Порт: 1080
  • Выберите SOCKS v5
  • Отметьте Проксировать DNS при использовании SOCKS v5, чтобы предотвратить DNS-утечки (не нужно, если включён DNS-прокси)

Chrome на macOS использует системный прокси. На Linux используйте расширение SwitchyOmega:

  1. Установите SwitchyOmega
  2. Создайте новый профиль → Протокол: SOCKS5, Сервер: 127.0.0.1, Порт: 1080
  3. Переключайтесь на этот профиль, когда хотите использовать VPN
Окно терминала
curl --socks5 127.0.0.1:1080 https://api.ipify.org
Окно терминала
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, чтобы сохранить между сессиями.


rVPN также может работать как HTTP-прокси вместе с SOCKS5-прокси. Это полезно, когда приложения или окружения ожидают переменных окружения HTTP_PROXY/HTTPS_PROXY, указывающих на HTTP-прокси (самая распространённая конвенция для CLI-инструментов вроде curl, git, npm, pip и Docker).

Оба прокси используют общий пул WebSocket-соединений — одновременная работа обоих не создаёт дополнительных накладных расходов.

[http_proxy]
enabled = true
listen_address = "127.0.0.1:8118"

Перезапустите клиент — вы должны увидеть:

INFO HTTP proxy listening on 127.0.0.1:8118
INFO SOCKS5 proxy listening on 127.0.0.1:1080

Самый распространённый способ использования 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 без покомандной настройки:

Окно терминала
# No --proxy flag needed — env vars are picked up automatically
curl https://api.ipify.org
git clone https://github.com/user/repo.git
pip install requests

Добавьте в ~/.bashrc или ~/.zshrc, чтобы сохранить между сессиями.

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

HTTP-прокси обрабатывает два типа запросов:

  • HTTP CONNECT — используется для HTTPS. Клиент отправляет CONNECT host:443 HTTP/1.1, прокси отвечает 200 Connection Established, и трафик идёт через зашифрованный туннель к целевому хосту.
  • Обычная HTTP-пересылка — используется для незашифрованного HTTP. Клиент отправляет GET http://host/path HTTP/1.1, прокси подключается к хосту и пересылает запрос.

Оба пути учитывают правила раздельного туннелирования и используют тот же пул соединений, что и 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:[email protected]:8118).

SOCKS5HTTP-прокси
ПротоколыЛюбые (TCP + UDP)Только HTTP и HTTPS
Переменные окруженияALL_PROXY=socks5://...HTTP_PROXY=http://...
Поддержка в браузерахНативная на macOS/FirefoxУниверсальная (все браузеры)
Поддержка CLI-инструментовНекоторые (curl, Node)Большинство (curl, git, pip, npm, Docker)
АутентификацияSOCKS5 логин/парольHTTP Basic auth
Лучше всего дляПроксирования отдельных приложений, UDPСистемных env-переменных, CI/CD

В большинстве случаев используйте HTTP-прокси с переменными окружения — у него самая широкая совместимость с CLI-инструментами и системами сборки. Используйте SOCKS5 для проксирования отдельных приложений или когда нужна поддержка UDP.


Раздельное туннелирование позволяет направлять через VPN только определённый трафик, а остальной — напрямую. Это полезно, когда вы хотите достучаться до заблокированных сайтов через VPN, оставив локальный и внутренний трафик нетронутым.

Включите раздельное туннелирование с автоматическим обходом IP Китая в client.toml:

[split_tunnel]
enabled = true
builtin_bypass_countries = ["CN"]

Когда включено, трафик к китайским IP (на основе данных APNIC — ~8800 сетей) идёт напрямую, а всё остальное — через VPN.

[split_tunnel]
enabled = true
bypass_networks_file = "~/.config/rvpn/bypass-networks.txt"

bypass-networks.txt — по одному CIDR на строку:

192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
[split_tunnel]
block_ads = true

Блокирует известные рекламные и трекинговые домены на уровне DNS. Байты не отправляются, соединение не устанавливается.


Важно: Без DNS-прокси ваши DNS-запросы могут утечь провайдеру, даже когда вы используете SOCKS5-прокси. См. Защита от DNS-утечек для полного объяснения.

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

rVPN включает встроенный DNS-прокси, который разрешает все запросы на стороне сервера через тот же зашифрованный WebSocket-туннель. Он также учитывает раздельное туннелирование: домены обхода разрешаются локально, а заблокированные рекламные/трекинговые домены сразу возвращают NXDOMAIN, не создавая сетевого трафика.

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

Замечание: Порт 53 требует root или CAP_NET_BIND_SERVICE. Используйте порт 5353 для непривилегированного тестирования (см. ниже).

Перезапустите клиент — вы должны увидеть:

INFO DNS proxy listening on 127.0.0.1:53

Запустите клиент через sudo (чтобы он мог занять порт 53), затем добавьте 127.0.0.1 как DNS-сервер:

Системные настройки → Сеть → ваше подключение → Подробности → DNS → +127.0.0.1

Или через командную строку (замените Wi-Fi на имя вашего интерфейса):

Окно терминала
sudo networksetup -setdnsservers Wi-Fi 127.0.0.1

Чтобы восстановить исходный DNS, когда закончите:

Окно терминала
sudo networksetup -setdnsservers Wi-Fi empty

Запустите клиент под root (или с capability CAP_NET_BIND_SERVICE) с listen_address = "127.0.0.1:53", затем направьте свой резолвер на него.

/etc/resolv.conf (напрямую):

nameserver 127.0.0.1

systemd-resolved — добавьте в /etc/systemd/resolved.conf:

[Resolve]
DNS=127.0.0.1

Затем перезапустите: sudo systemctl restart systemd-resolved

Непривилегированное тестирование (порт 5353)

Заголовок раздела «Непривилегированное тестирование (порт 5353)»
[dns_proxy]
enabled = true
listen_address = "127.0.0.1:5353"

Проверьте, что работает:

Окно терминала
dig @127.0.0.1 -p 5353 example.com

Ответ придёт от вашего VPN-сервера, а не от локального провайдера.


SOCKS5-прокси поддерживает два режима подключения к серверу:

Стандартный режим (по умолчанию, рекомендуется)

Заголовок раздела «Стандартный режим (по умолчанию, рекомендуется)»

Каждый SOCKS5-поток открывает собственное отдельное WebSocket-соединение со своим рукопожатием X3DH и Double Ratchet. Это рекомендуемый режим.

Почему это умолчание:

  • Шаблон трафика соответствует стандартным инструментам — каждое соединение является независимым WebSocket, аналогично обычному HTTPS-браузингу
  • Короткоживущие соединения сложнее идентифицировать и заблокировать классификаторам трафика
  • Проще изолируются сбои — падение одного соединения не влияет на другие
[socks5]
multiplex = false # default

Мультиплексированный режим (опционально)

Заголовок раздела «Мультиплексированный режим (опционально)»

Все SOCKS5-потоки используют одно WebSocket-соединение с общей сессией Double Ratchet. Каждый SOCKS5 CONNECT создаёт логический «поток» через управляющие сообщения CreateFlow/CloseFlow в том же туннеле.

Преимущества:

  • Одно TLS-рукопожатие, один обмен ключами X3DH — ~250 мс накладных расходов вместо ~600 мс на каждое соединение
  • Создание потока за 0-RTT — данные отправляются немедленно, без ожидания подтверждения сервера
  • Меньшее потребление ресурсов сервера (один WebSocket, один ratchet вместо одного на поток)
  • Сервер поддерживает до 2000 одновременных потоков на mux-сессию
  • 100% успешность в стресс-тестах (против ~85% для стандартного режима)

Компромиссы:

  • Единый долгоживущий бинарный поток — отличительный шаблон трафика, который могут обнаружить классификаторы
  • Все потоки используют одно соединение — если оно упадёт, всё переподключится

Как это работает:

  1. Первый SOCKS5 CONNECT открывает mux-туннель WebSocket ({server_path}/mux)
  2. Выполняется рукопожатие X3DH для установки общего Double Ratchet
  3. Последующие потоки отправляют управляющие сообщения CreateFlow в том же туннеле
  4. Клиент отправляет данные немедленно (0-RTT) — сервер буферизует, пока подключается к цели
  5. Данные идут через мультиплексированные фреймы

Безопасность: Оптимизация 0-RTT — это НЕ TLS 0-RTT. TLS-рукопожатие и обмен ключами X3DH завершаются до того, как пойдут какие-либо данные. Защита от повторов обеспечивается Double Ratchet — у каждого сообщения свой message_number, а ratchet отклоняет сообщения с number < current (см. ratchet.rs:decrypt). Ключи сообщений расходуются после использования, поэтому повторы падают с «Message too old».

Конфигурация:

[socks5]
multiplex = true
# mux_path defaults to {server_path}/mux automatically

Чтобы явно переопределить mux-точку:

[socks5]
multiplex = true
mux_path = "/api/v1/ws/mux"
СтандартныйМультиплексированный
WebSocket на сессию1 на поток1
Рукопожатий X3DH1 на поток1
Потоков на сервереНеограниченноДо 2000
WS-соединений на стороне сервераN1
Шаблон трафикаПохож на обычный HTTPSОдин долгоживущий поток
Успешность (HK, 15 мин)~85%100%
Задержка p50 (HK)~575 мс~315 мс
Задержка p95 (HK)~2000 мс~1060 мс
Лучше всего дляОбхода DPI, слияния с трафикомНадёжности, высокой пропускной способности

Замечание: Стандартный режим открывает один WebSocket на TCP-поток. В нагруженных сетях (например, браузеры с множеством вкладок) это может исчерпать серверный лимит max_connections_per_ip. При необходимости повысьте серверные лимиты:

[server.rate_limit]
max_connections_per_ip = 500
max_handshakes_per_minute = 2000

Чтобы слушать на определённом интерфейсе (например, чтобы поделиться прокси с другими устройствами в локальной сети):

[socks5]
listen_address = "0.0.0.0:1080"

Замечание по безопасности: Открывайте SOCKS5-порт только в доверенных сетях. По умолчанию аутентификации нет.

Чтобы добавить аутентификацию:

[socks5]
listen_address = "0.0.0.0:1080"
auth_enabled = true
auth_username = "user"
auth_password = "changeme"

Окно терминала
sudo nano /etc/systemd/system/rvpn-client.service
[Unit]
Description=rVPN 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
Окно терминала
sudo systemctl daemon-reload
sudo systemctl enable --now rvpn-client

Создайте /usr/local/etc/rc.d/rvpn_client:

#!/bin/sh
# PROVIDE: rvpn_client
# REQUIRE: NETWORKING
# KEYWORD: shutdown
. /etc/rc.subr
name="rvpn_client"
rcvar="rvpn_client_enable"
command="/usr/local/bin/rvpn"
command_args="-c /usr/local/etc/rvpn/client.toml"
pidfile="/var/run/rvpn-client.pid"
load_rc_config $name
run_rc_command "$1"
Окно терминала
chmod +x /usr/local/etc/rc.d/rvpn_client
echo 'rvpn_client_enable="YES"' >> /etc/rc.conf
service rvpn_client start