Перейти к содержанию

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

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


Запуск прокси

rvpn -c ~/.config/rvpn/client.toml

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

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

INFO  SOCKS5 proxy listening on 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:

  1. Установите SwitchyOmega
  2. Создайте новый профиль → Протокол: SOCKS5, Сервер: 127.0.0.1, Порт: 1080
  3. Переключитесь на этот профиль, когда хотите использовать VPN

curl

curl --socks5 127.0.0.1:1080 https://api.ipify.org

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_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 без какой-либо настройки для каждого приложения:

# Флаг --proxy не нужен — переменные окружения подхватываются автоматически
curl https://api.ipify.org
git clone https://github.com/user/repo.git
pip install requests

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

curl (явно)

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, прокси подключается к хосту и пересылает запрос.

Оба пути учитывают раздельное туннелирование и используют тот же мультиплексированный 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:

[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-прокси ваши DNS-запросы могут утекать к вашему интернет-провайдеру даже при использовании SOCKS5-прокси. См. Предотвращение утечек DNS для полного объяснения.

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

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

Включение DNS-прокси

[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

macOS — системный

Запустите клиент с 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

Linux — системный

Запустите клиент от 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)

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

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

dig @127.0.0.1 -p 5353 example.com

Ответ придёт от вашего 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]
multiplex = true
mux_path = "/api/v1/ws/mux"

Устаревший режим (резервный)

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

Когда использовать: - Устранение неполадок — определить, является ли проблема специфичной для потока или затрагивает весь туннель - Совместимость со старыми версиями сервера без эндпоинта мультиплексирования

[socks5]
multiplex = false

Сравнение режимов

Мультиплексированный Устаревший
WebSocket-соединений на сеанс 1 1 на поток
X3DH-рукопожатий 1 1 на поток
Серверных потоков До 2000 Без ограничений
WS-соединений на стороне сервера 1 N
Лучше всего для Браузеры, тяжёлые сайты Отладка, старые серверы

Совет по устранению неполадок: Если вы испытываете проблемы с подключением в мультиплексированном режиме (например, некоторые приложения не загружаются, тайм-ауты на тяжёлых сайтах), попробуйте переключиться на устаревший режим, чтобы определить, затрагивает ли проблема весь туннель или только конкретный поток:

[socks5]
multiplex = false
Учтите, что устаревший режим открывает один 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"

Запуск в качестве службы

Linux (systemd)

sudo nano /etc/systemd/system/rvpn-client.service
[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
sudo systemctl daemon-reload
sudo systemctl enable --now rvpn-client

FreeBSD (rc.d)

Создайте /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