Справочник конфигурации клиента
Полный справочник всех полей в client.toml.
Поля верхнего уровня
Заголовок раздела «Поля верхнего уровня»| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
server_address | string | "wss://localhost:443/api/v1/ws" | Полный WebSocket URL сервера. Должен включать схему (wss://), имя хоста, порт и путь. |
sni_hostname | string | (из URL) | Переопределяет имя хоста TLS SNI, отправляемое во время рукопожатия. Полезно при подключении по IP-адресу или через CDN. |
identity_key_file | path | "identity.key" | Путь к ключу идентификации клиента. Генерируется командой rvpn keygen. |
prekey_bundle | path | (нет) | Путь к серверному prekey-bundle.json. Обязательно при первой настройке. |
server_public_key | string | (нет) | Публичный ключ сервера в hex. Альтернатива prekey_bundle, когда у вас есть только сырой ключ. |
tls_fingerprint | string | "chrome" | Отпечаток TLS ClientHello для имитации. Варианты: "chrome", "firefox", "safari", "none". Используйте "chrome" для лучшего сопротивления DPI. |
data_dir | path | (по умолчанию платформы) | Каталог для runtime-данных (known hosts, статистика). По умолчанию ~/.local/share/rvpn/ на Linux, ~/Library/Application Support/rvpn/ на macOS. |
[socks5]
Заголовок раздела «[socks5]»Настройки SOCKS5-прокси. Применяются только при запуске в SOCKS5-режиме (по умолчанию).
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
listen_address | string | "127.0.0.1:1080" | Адрес и порт для приёма SOCKS5-соединений. Используйте "0.0.0.0:1080", чтобы поделиться прокси с другими устройствами в сети. |
udp_associate | bool | true | Включить SOCKS5-команду UDP ASSOCIATE (для UDP-приложений). |
auth_enabled | bool | false | Требовать аутентификацию логин/пароль для SOCKS5-клиентов. |
auth_username | string | (нет) | Логин, когда auth_enabled = true. |
auth_password | string | (нет) | Пароль, когда auth_enabled = true. |
multiplex | bool | false | Использовать один мультиплексированный WebSocket для всех соединений. Когда включено, использует создание потока 0-RTT для меньшей задержки. По умолчанию false — один WebSocket на соединение создаёт шаблон трафика, сливающийся с обычным браузингом. См. Режимы соединения. |
mux_path | string | (авто) | Переопределяет путь mux WebSocket-точки. Используется только когда multiplex = true. По умолчанию {server_path}/mux. |
[socks5]listen_address = "127.0.0.1:1080"auth_enabled = trueauth_username = "alice"auth_password = "hunter2"[http_proxy]
Заголовок раздела «[http_proxy]»HTTP/HTTPS-прокси, работающий вместе с SOCKS5-прокси. По умолчанию отключён. Позволяет использовать переменные окружения HTTP_PROXY/HTTPS_PROXY для системной или покомандной маршрутизации VPN. Оба прокси используют общий пул соединений — одновременная работа обоих не создаёт дополнительных накладных расходов.
Обрабатывает два типа запросов:
- HTTP CONNECT — используется для HTTPS. Клиент отправляет
CONNECT host:443 HTTP/1.1, прокси устанавливает зашифрованный туннель к целевому хосту. - Обычная HTTP-пересылка — используется для незашифрованного HTTP. Прокси подключается к хосту и пересылает запрос.
Оба пути учитывают правила раздельного туннелирования и используют тот же мультиплексированный WebSocket-туннель, что и SOCKS5.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled | bool | false | Запустить HTTP-прокси вместе с SOCKS5-прокси. |
listen_address | string | "127.0.0.1:8118" | Адрес и порт для приёма HTTP-прокси-соединений. |
auth_enabled | bool | false | Требовать Basic-аутентификацию для HTTP-прокси-клиентов. |
auth_username | string | (нет) | Логин, когда auth_enabled = true. |
auth_password | string | (нет) | Пароль, когда auth_enabled = true. |
multiplex | bool | false | Использовать один мультиплексированный WebSocket. По умолчанию false рекомендуется — см. Режимы соединения. |
mux_path | string | (авто) | Переопределяет путь mux WebSocket-точки. Используется только когда multiplex = true. По умолчанию {server_path}/mux. |
[http_proxy]enabled = truelisten_address = "127.0.0.1:8118"С аутентификацией:
[http_proxy]enabled = truelisten_address = "127.0.0.1:8118"auth_enabled = trueauth_username = "user"auth_password = "changeme"См. Настройка HTTP-прокси для использования с переменными окружения и настройки под приложение.
[dns_proxy]
Заголовок раздела «[dns_proxy]»Маршрутизирует DNS-запросы через зашифрованный туннель, чтобы предотвратить DNS-утечки в SOCKS5-режиме. По умолчанию отключён.
Когда включён, клиент слушает UDP DNS-запросы на listen_address и пересылает их к серверной WebSocket-точке /dns, используя то же шифрование X3DH + Double Ratchet, что и для обычного трафика. Правила раздельного туннелирования учитываются: домены обхода разрешаются локально, а заблокированные рекламные/трекинговые домены сразу возвращают NXDOMAIN.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled | bool | false | Запустить локальный DNS-прокси вместе с SOCKS5-прокси. |
listen_address | string | "127.0.0.1:5353" | UDP-адрес и порт для DNS-прокси. Используйте порт 53 для системной совместимости (требует root или CAP_NET_BIND_SERVICE). |
nameservers | list | ["223.5.5.5:53", "1.1.1.1:53", "8.8.8.8:53"] | Публичные DNS-серверы, используемые для доменов обхода. Запросы идут напрямую по UDP, чтобы избежать зацикливания на самом DNS-прокси. Пользователям из Китая стоит поставить локальный DNS первым (например, 119.29.29.29:53). |
[dns_proxy]enabled = truelisten_address = "127.0.0.1:53"nameservers = ["223.5.5.5:53", "1.1.1.1:53", "8.8.8.8:53"]См. Настройка DNS-прокси для инструкций по указанию системного DNS на этот адрес.
Настройки TUN-интерфейса. Включите TUN-режим, установив enabled = true. IP-адрес клиента, IP шлюза и DNS-серверы назначаются сервером динамически через сообщение VirtualIp — не задавайте их вручную.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled | bool | false | Включить режим полного туннеля (TUN). Весь IP-трафик направляется через VPN. |
interface_name | string | (авто) | Имя TUN-интерфейса. Опустите, чтобы ОС назначила его — обычно utun0 на macOS и tun0 на Linux/FreeBSD. Задайте конкретное имя, если нужно для правил брандмауэра. |
routes | list | ["0.0.0.0/0"] | Маршруты, направляемые через туннель. По умолчанию направляет весь трафик. Укажите отдельные CIDR для разделённой маршрутизации. |
mtu | integer | 1420 | MTU TUN-интерфейса. Более низкие значения уменьшают фрагментацию на высоколатентных каналах. |
[tun]enabled = true# interface_name = "vpn0" # optional, defaults to OS-assigned namemtu = 1420routes = ["0.0.0.0/0"][split_tunnel]
Заголовок раздела «[split_tunnel]»Управляет тем, какой трафик обходит VPN, а какой принудительно идёт через него.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled | bool | false | Включить раздельное туннелирование. Должно быть true, чтобы любые другие настройки split tunnel вступили в силу. |
builtin_bypass_countries | list | ["CN"] | Коды стран, чьи диапазоны IP автоматически обходятся. Использует данные APNIC. Поддерживаются: "CN", "HK", "TW", "RU" и другие. Установите [], чтобы отключить. |
bypass_networks_file | path | (нет) | Путь к файлу CIDR-сетей (по одной на строку), которые подключаются напрямую в обход VPN. |
bypass_domains_file | path | (нет) | Путь к файлу доменных имён (по одному на строку), которые подключаются напрямую. |
tunnel_networks_file | path | (нет) | Путь к файлу CIDR-сетей, принудительно направляемых через VPN (переопределяет правила обхода). |
tunnel_domains_file | path | (нет) | Путь к файлу доменных имён, принудительно направляемых через VPN. |
bypass_networks | list | [] | Инлайн-список CIDR-сетей обхода. То же, что bypass_networks_file, но задаётся прямо в конфиге. |
auto_reload_interval | integer | 86400 | Как часто (в секундах) перезагружать файлы обхода/туннелирования. Установите 0, чтобы отключить автоперезагрузку. |
block_ads | bool | false | Блокировать известные рекламные и трекинговые домены на уровне DNS. К заблокированным доменам не отправляются байты. |
ad_block_file | path | (нет) | Путь к пользовательскому списку блокировки рекламы (по одному домену на строку). Используется в дополнение к встроенному списку, когда block_ads = true. |
[split_tunnel]enabled = truebuiltin_bypass_countries = ["CN"]block_ads = truebypass_networks_file = "~/.config/rvpn/bypass-networks.txt"[network]
Заголовок раздела «[network]»Сетевое поведение на стороне клиента.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
ipv6_enabled | bool | true | Разрешить IPv6-соединения через прокси. |
prefer_ipv4 | bool | true | Когда доступны и IPv4, и IPv6, предпочитать IPv4. Уменьшает задержку в большинстве сетей. |
dns_cache_enabled | bool | true | Кешировать DNS-ответы, чтобы уменьшить повторные запросы. |
dns_cache_ttl | integer | 14400 | Как долго (в секундах) кешировать записи DNS. По умолчанию 4 часа. |
dns_cache_size | integer | 1000 | Максимальное количество записей в DNS-кеше. |
dns_servers | list | [] | Пользовательские upstream-серверы DNS для разрешения доменов обхода (прямые соединения). Запросы отправляются напрямую по UDP на эти серверы, полностью обходя системный резолвер. Оставьте пустым, чтобы использовать системный. Полезно, когда системный резолвер ненадёжен или вы хотите использовать конкретного DNS-провайдера для китайского трафика. |
[network]prefer_ipv4 = truedns_cache_enabled = truedns_cache_ttl = 14400dns_servers = ["223.5.5.5", "223.6.6.6"] # Alibaba DNS for CN bypass domains[server_identity]
Заголовок раздела «[server_identity]»Закрепляет ключ идентификации Ed25519 сервера в стиле SSH TOFU и отказывается подключаться, если сервер когда-либо предъявит другой ключ. Полная модель, включая церемонию ротации оператора, — на странице Закрепление идентификации сервера.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
fingerprint | string | (нет) | Ожидаемый отпечаток в канонической форме ik:1:<base32> (например, ik:1:d4rgmp5b7ta6qmxi2mccwkjq4qxopfxzr7qivbfgu4wjycmuxnla). Если задан, клиент отклоняет соединения, если идентичность сервера не совпадает. Устаревшие 32-символьные hex-значения из старых установок всё ещё принимаются и переписываются при сохранении. |
trust_on_first_use | bool | true | Принимать любую идентичность сервера при первом соединении и запоминать её для будущей проверки. |
known_hosts_file | path | "known_hosts.json" | Куда сохранять запомненные идентичности серверов. Записи в старом hex-формате мигрируются в ik:1:… при сохранении, метка first_seen сохраняется. |
strict | bool | true | Если true, прерывать соединение при несовпадении. Если false, только логировать предупреждение и продолжать. |
strict_mode | bool | false | Строгий TOFU. Если true, отклонять неизвестные идентичности серверов даже при первом соединении — вы должны задать fingerprint явно до первого подключения. По умолчанию false — принимает и запоминает при первом использовании. |
[server_identity]trust_on_first_use = truestrict = trueМаршрутизация по нескольким серверам
Заголовок раздела «Маршрутизация по нескольким серверам»CLI-клиент может держать небольшой пул серверов и направлять каждое SOCKS5-соединение к одному из них по имени хоста или IP. Типичный сценарий: весь трафик по умолчанию идёт через Гонконг, а google.com (и подобные) — через Сингапур, чтобы гео-контент отдавал сингапурские ответы.
Функция только для SOCKS5. Режим TUN оборачивает весь стек одним туннелем и не имеет крючка на уровне отдельного потока; включение мульти-серверной конфигурации в TUN-режиме отклоняется с явной ошибкой. Мультиплексированный SOCKS5 (socks5.multiplex = true) также отклоняется, потому что общий мультиплекс-туннель — одиночный.
Ключ клиента (identity_key_file) один и тот же на все серверы (модель SSH — один ключ, много хостов). У каждого сервера свой prekey-bundle.
[[server]]
Заголовок раздела «[[server]]»Ноль или более дополнительных серверов объявляются блоками [[server]]. Верхнеуровневые server_address + prekey_bundle остаются неявным сервером "default", поэтому существующие одно-серверные конфиги работают без изменений.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
name | string | да | Символическое имя для [routing.<name>]. Должно быть уникальным; "default" зарезервировано. |
address | string | да | WebSocket URL (wss://...). |
prekey_bundle | path | да | Путь к JSON prekey-bundle этого сервера (X3DH). |
sni_hostname | string | нет | Переопределение TLS SNI. По умолчанию — хост из URL. |
fingerprint | string | нет | Закреплённая ik:1:... идентичность. Переопределяет верхнеуровневый [server_identity] для этого сервера. |
[routing.<name>]
Заголовок раздела «[routing.<name>]»Правила маршрутизации, ключом которых является name сервера. Запрос SOCKS5 направляется к именованному серверу, если совпадает хотя бы один domains или ips; иначе — на сервер по умолчанию.
| Поле | Тип | Описание |
|---|---|---|
domains | array of strings | Шаблоны хостов — см. правила ниже. Регистр не важен. |
ips | array of strings | Литеральные IP (8.8.8.8) или CIDR-блоки (1.1.1.0/24, 2606:4700::/32). |
Матчинг доменных шаблонов
Заголовок раздела «Матчинг доменных шаблонов»Поддерживаются три формы. Разница между google.com и *.google.com важна — они делают разное.
| Шаблон | Совпадает | НЕ совпадает | Использовать когда |
|---|---|---|---|
google.com | google.com и mail.google.com, www.google.com, … | notgoogle.com | Нужен апекс и все поддомены (типичный случай). |
*.google.com | mail.google.com, www.google.com | google.com сам по себе — апекс намеренно исключён | Нужны только поддомены, например если апекс должен идти по другому правилу. |
google.com. (точка на конце) | Только точно google.com | Любой поддомен | Нужно строгое совпадение с одним хостом. |
Другие формы wildcard’ов, кроме ведущего *., отклоняются на старте — google.* или *.google.* невалидны.
Типичная ловушка: если написать *.google.com и потом открыть https://google.com, запрос уйдёт на сервер по умолчанию, а не на маршрутизируемый. Используйте голую форму google.com, чтобы покрыть и апекс, и поддомены.
Порядок совпадений: сначала хост, затем IP как запасной вариант. SOCKS5-запрос с ATYP = 0x03 (domain) несёт голое имя хоста; клиент отправляет это имя на выбранный сервер без резолвинга, поэтому DNS выполняется на стороне сервера — гео-DNS даёт ответы, локальные для выбранного выхода.
Если ваш SOCKS5-клиент делает DNS-резолвинг локально (например curl -x socks5://… вместо socks5h://…, или системная прокси-настройка), запрос приходит с ATYP = 0x01 — литеральным IP — и доменные правила не могут его матчить. Либо переключите клиент в режим передачи хоста (socks5h://), либо добавьте IP-диапазоны назначения в ips.
server_address = "wss://hk.example.com"identity_key_file = "identity.key"prekey_bundle = "hk.bundle.json"
[[server]]name = "sg"address = "wss://sg.example.com"prekey_bundle = "sg.bundle.json"
[routing.sg]domains = ["google.com", "*.google.com", "youtube.com"]ips = ["8.8.8.8/32", "1.1.1.1"]С такой конфигурацией curl -x socks5h://127.0.0.1:1080 https://google.com откроет WebSocket к серверу SG и даст SG самому резолвить google.com; всё остальное продолжит идти через HK.
Если выбранный сервер недоступен, SOCKS5-запрос падает — клиент не молча отваливается на сервер по умолчанию. Это намеренно: гео-маршрутизированный трафик, возвращающийся не из того региона, хуже чистой ошибки.
[performance]
Заголовок раздела «[performance]»Тюнинг для высокой пропускной способности или окружений с ограниченными ресурсами.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
worker_threads | integer | 4 | Количество асинхронных рабочих потоков. Увеличивайте на многоядерных серверах. |
recv_buffer_size | integer | 262144 | Размер TCP receive-буфера в байтах (256 КБ). |
send_buffer_size | integer | 262144 | Размер TCP send-буфера в байтах (256 КБ). |
crypto_worker_count | integer | 4 | Потоки, выделенные для шифрования/дешифрования. Более высокие значения улучшают пропускную способность при высокой параллельной нагрузке. |
[performance]worker_threads = 4crypto_worker_count = 4Полный пример
Заголовок раздела «Полный пример»server_address = "wss://your.server.com/api/v1/ws"identity_key_file = "~/.config/rvpn/identity.key"prekey_bundle = "~/.config/rvpn/prekey-bundle.json"tls_fingerprint = "chrome"
[socks5]listen_address = "127.0.0.1:1080"
[http_proxy]enabled = truelisten_address = "127.0.0.1:8118"
[tun]enabled = truemtu = 1420routes = ["0.0.0.0/0"]
[dns_proxy]enabled = truelisten_address = "127.0.0.1:53"nameservers = ["223.5.5.5:53", "1.1.1.1:53", "8.8.8.8:53"]
[split_tunnel]enabled = truebuiltin_bypass_countries = ["CN"]block_ads = true
[network]prefer_ipv4 = truedns_cache_enabled = true
[server_identity]trust_on_first_use = truestrict = true