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

Справочник конфигурации клиента

Полный справочник всех полей в client.toml.


ПолеТипПо умолчаниюОписание
server_addressstring"wss://localhost:443/api/v1/ws"Полный WebSocket URL сервера. Должен включать схему (wss://), имя хоста, порт и путь.
sni_hostnamestring(из URL)Переопределяет имя хоста TLS SNI, отправляемое во время рукопожатия. Полезно при подключении по IP-адресу или через CDN.
identity_key_filepath"identity.key"Путь к ключу идентификации клиента. Генерируется командой rvpn keygen.
prekey_bundlepath(нет)Путь к серверному prekey-bundle.json. Обязательно при первой настройке.
server_public_keystring(нет)Публичный ключ сервера в hex. Альтернатива prekey_bundle, когда у вас есть только сырой ключ.
tls_fingerprintstring"chrome"Отпечаток TLS ClientHello для имитации. Варианты: "chrome", "firefox", "safari", "none". Используйте "chrome" для лучшего сопротивления DPI.
data_dirpath(по умолчанию платформы)Каталог для runtime-данных (known hosts, статистика). По умолчанию ~/.local/share/rvpn/ на Linux, ~/Library/Application Support/rvpn/ на macOS.

Настройки SOCKS5-прокси. Применяются только при запуске в SOCKS5-режиме (по умолчанию).

ПолеТипПо умолчаниюОписание
listen_addressstring"127.0.0.1:1080"Адрес и порт для приёма SOCKS5-соединений. Используйте "0.0.0.0:1080", чтобы поделиться прокси с другими устройствами в сети.
udp_associatebooltrueВключить SOCKS5-команду UDP ASSOCIATE (для UDP-приложений).
auth_enabledboolfalseТребовать аутентификацию логин/пароль для SOCKS5-клиентов.
auth_usernamestring(нет)Логин, когда auth_enabled = true.
auth_passwordstring(нет)Пароль, когда auth_enabled = true.
multiplexboolfalseИспользовать один мультиплексированный WebSocket для всех соединений. Когда включено, использует создание потока 0-RTT для меньшей задержки. По умолчанию false — один WebSocket на соединение создаёт шаблон трафика, сливающийся с обычным браузингом. См. Режимы соединения.
mux_pathstring(авто)Переопределяет путь mux WebSocket-точки. Используется только когда multiplex = true. По умолчанию {server_path}/mux.
[socks5]
listen_address = "127.0.0.1:1080"
auth_enabled = true
auth_username = "alice"
auth_password = "hunter2"

HTTP/HTTPS-прокси, работающий вместе с SOCKS5-прокси. По умолчанию отключён. Позволяет использовать переменные окружения HTTP_PROXY/HTTPS_PROXY для системной или покомандной маршрутизации VPN. Оба прокси используют общий пул соединений — одновременная работа обоих не создаёт дополнительных накладных расходов.

Обрабатывает два типа запросов:

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

Оба пути учитывают правила раздельного туннелирования и используют тот же мультиплексированный WebSocket-туннель, что и SOCKS5.

ПолеТипПо умолчаниюОписание
enabledboolfalseЗапустить HTTP-прокси вместе с SOCKS5-прокси.
listen_addressstring"127.0.0.1:8118"Адрес и порт для приёма HTTP-прокси-соединений.
auth_enabledboolfalseТребовать Basic-аутентификацию для HTTP-прокси-клиентов.
auth_usernamestring(нет)Логин, когда auth_enabled = true.
auth_passwordstring(нет)Пароль, когда auth_enabled = true.
multiplexboolfalseИспользовать один мультиплексированный WebSocket. По умолчанию false рекомендуется — см. Режимы соединения.
mux_pathstring(авто)Переопределяет путь mux WebSocket-точки. Используется только когда multiplex = true. По умолчанию {server_path}/mux.
[http_proxy]
enabled = true
listen_address = "127.0.0.1:8118"

С аутентификацией:

[http_proxy]
enabled = true
listen_address = "127.0.0.1:8118"
auth_enabled = true
auth_username = "user"
auth_password = "changeme"

См. Настройка HTTP-прокси для использования с переменными окружения и настройки под приложение.


Маршрутизирует DNS-запросы через зашифрованный туннель, чтобы предотвратить DNS-утечки в SOCKS5-режиме. По умолчанию отключён.

Когда включён, клиент слушает UDP DNS-запросы на listen_address и пересылает их к серверной WebSocket-точке /dns, используя то же шифрование X3DH + Double Ratchet, что и для обычного трафика. Правила раздельного туннелирования учитываются: домены обхода разрешаются локально, а заблокированные рекламные/трекинговые домены сразу возвращают NXDOMAIN.

ПолеТипПо умолчаниюОписание
enabledboolfalseЗапустить локальный DNS-прокси вместе с SOCKS5-прокси.
listen_addressstring"127.0.0.1:5353"UDP-адрес и порт для DNS-прокси. Используйте порт 53 для системной совместимости (требует root или CAP_NET_BIND_SERVICE).
nameserverslist["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 = true
listen_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 — не задавайте их вручную.

ПолеТипПо умолчаниюОписание
enabledboolfalseВключить режим полного туннеля (TUN). Весь IP-трафик направляется через VPN.
interface_namestring(авто)Имя TUN-интерфейса. Опустите, чтобы ОС назначила его — обычно utun0 на macOS и tun0 на Linux/FreeBSD. Задайте конкретное имя, если нужно для правил брандмауэра.
routeslist["0.0.0.0/0"]Маршруты, направляемые через туннель. По умолчанию направляет весь трафик. Укажите отдельные CIDR для разделённой маршрутизации.
mtuinteger1420MTU TUN-интерфейса. Более низкие значения уменьшают фрагментацию на высоколатентных каналах.
[tun]
enabled = true
# interface_name = "vpn0" # optional, defaults to OS-assigned name
mtu = 1420
routes = ["0.0.0.0/0"]

Управляет тем, какой трафик обходит VPN, а какой принудительно идёт через него.

ПолеТипПо умолчаниюОписание
enabledboolfalseВключить раздельное туннелирование. Должно быть true, чтобы любые другие настройки split tunnel вступили в силу.
builtin_bypass_countrieslist["CN"]Коды стран, чьи диапазоны IP автоматически обходятся. Использует данные APNIC. Поддерживаются: "CN", "HK", "TW", "RU" и другие. Установите [], чтобы отключить.
bypass_networks_filepath(нет)Путь к файлу CIDR-сетей (по одной на строку), которые подключаются напрямую в обход VPN.
bypass_domains_filepath(нет)Путь к файлу доменных имён (по одному на строку), которые подключаются напрямую.
tunnel_networks_filepath(нет)Путь к файлу CIDR-сетей, принудительно направляемых через VPN (переопределяет правила обхода).
tunnel_domains_filepath(нет)Путь к файлу доменных имён, принудительно направляемых через VPN.
bypass_networkslist[]Инлайн-список CIDR-сетей обхода. То же, что bypass_networks_file, но задаётся прямо в конфиге.
auto_reload_intervalinteger86400Как часто (в секундах) перезагружать файлы обхода/туннелирования. Установите 0, чтобы отключить автоперезагрузку.
block_adsboolfalseБлокировать известные рекламные и трекинговые домены на уровне DNS. К заблокированным доменам не отправляются байты.
ad_block_filepath(нет)Путь к пользовательскому списку блокировки рекламы (по одному домену на строку). Используется в дополнение к встроенному списку, когда block_ads = true.
[split_tunnel]
enabled = true
builtin_bypass_countries = ["CN"]
block_ads = true
bypass_networks_file = "~/.config/rvpn/bypass-networks.txt"

Сетевое поведение на стороне клиента.

ПолеТипПо умолчаниюОписание
ipv6_enabledbooltrueРазрешить IPv6-соединения через прокси.
prefer_ipv4booltrueКогда доступны и IPv4, и IPv6, предпочитать IPv4. Уменьшает задержку в большинстве сетей.
dns_cache_enabledbooltrueКешировать DNS-ответы, чтобы уменьшить повторные запросы.
dns_cache_ttlinteger14400Как долго (в секундах) кешировать записи DNS. По умолчанию 4 часа.
dns_cache_sizeinteger1000Максимальное количество записей в DNS-кеше.
dns_serverslist[]Пользовательские upstream-серверы DNS для разрешения доменов обхода (прямые соединения). Запросы отправляются напрямую по UDP на эти серверы, полностью обходя системный резолвер. Оставьте пустым, чтобы использовать системный. Полезно, когда системный резолвер ненадёжен или вы хотите использовать конкретного DNS-провайдера для китайского трафика.
[network]
prefer_ipv4 = true
dns_cache_enabled = true
dns_cache_ttl = 14400
dns_servers = ["223.5.5.5", "223.6.6.6"] # Alibaba DNS for CN bypass domains

Закрепляет ключ идентификации Ed25519 сервера в стиле SSH TOFU и отказывается подключаться, если сервер когда-либо предъявит другой ключ. Полная модель, включая церемонию ротации оператора, — на странице Закрепление идентификации сервера.

ПолеТипПо умолчаниюОписание
fingerprintstring(нет)Ожидаемый отпечаток в канонической форме ik:1:<base32> (например, ik:1:d4rgmp5b7ta6qmxi2mccwkjq4qxopfxzr7qivbfgu4wjycmuxnla). Если задан, клиент отклоняет соединения, если идентичность сервера не совпадает. Устаревшие 32-символьные hex-значения из старых установок всё ещё принимаются и переписываются при сохранении.
trust_on_first_usebooltrueПринимать любую идентичность сервера при первом соединении и запоминать её для будущей проверки.
known_hosts_filepath"known_hosts.json"Куда сохранять запомненные идентичности серверов. Записи в старом hex-формате мигрируются в ik:1:… при сохранении, метка first_seen сохраняется.
strictbooltrueЕсли true, прерывать соединение при несовпадении. Если false, только логировать предупреждение и продолжать.
strict_modeboolfalseСтрогий TOFU. Если true, отклонять неизвестные идентичности серверов даже при первом соединении — вы должны задать fingerprint явно до первого подключения. По умолчанию false — принимает и запоминает при первом использовании.
[server_identity]
trust_on_first_use = true
strict = true

CLI-клиент может держать небольшой пул серверов и направлять каждое SOCKS5-соединение к одному из них по имени хоста или IP. Типичный сценарий: весь трафик по умолчанию идёт через Гонконг, а google.com (и подобные) — через Сингапур, чтобы гео-контент отдавал сингапурские ответы.

Функция только для SOCKS5. Режим TUN оборачивает весь стек одним туннелем и не имеет крючка на уровне отдельного потока; включение мульти-серверной конфигурации в TUN-режиме отклоняется с явной ошибкой. Мультиплексированный SOCKS5 (socks5.multiplex = true) также отклоняется, потому что общий мультиплекс-туннель — одиночный.

Ключ клиента (identity_key_file) один и тот же на все серверы (модель SSH — один ключ, много хостов). У каждого сервера свой prekey-bundle.

Ноль или более дополнительных серверов объявляются блоками [[server]]. Верхнеуровневые server_address + prekey_bundle остаются неявным сервером "default", поэтому существующие одно-серверные конфиги работают без изменений.

ПолеТипОбязательноеОписание
namestringдаСимволическое имя для [routing.<name>]. Должно быть уникальным; "default" зарезервировано.
addressstringдаWebSocket URL (wss://...).
prekey_bundlepathдаПуть к JSON prekey-bundle этого сервера (X3DH).
sni_hostnamestringнетПереопределение TLS SNI. По умолчанию — хост из URL.
fingerprintstringнетЗакреплённая ik:1:... идентичность. Переопределяет верхнеуровневый [server_identity] для этого сервера.

Правила маршрутизации, ключом которых является name сервера. Запрос SOCKS5 направляется к именованному серверу, если совпадает хотя бы один domains или ips; иначе — на сервер по умолчанию.

ПолеТипОписание
domainsarray of stringsШаблоны хостов — см. правила ниже. Регистр не важен.
ipsarray of stringsЛитеральные IP (8.8.8.8) или CIDR-блоки (1.1.1.0/24, 2606:4700::/32).

Поддерживаются три формы. Разница между google.com и *.google.com важна — они делают разное.

ШаблонСовпадаетНЕ совпадаетИспользовать когда
google.comgoogle.com и mail.google.com, www.google.com, …notgoogle.comНужен апекс и все поддомены (типичный случай).
*.google.commail.google.com, www.google.comgoogle.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-запрос падает — клиент не молча отваливается на сервер по умолчанию. Это намеренно: гео-маршрутизированный трафик, возвращающийся не из того региона, хуже чистой ошибки.


Тюнинг для высокой пропускной способности или окружений с ограниченными ресурсами.

ПолеТипПо умолчаниюОписание
worker_threadsinteger4Количество асинхронных рабочих потоков. Увеличивайте на многоядерных серверах.
recv_buffer_sizeinteger262144Размер TCP receive-буфера в байтах (256 КБ).
send_buffer_sizeinteger262144Размер TCP send-буфера в байтах (256 КБ).
crypto_worker_countinteger4Потоки, выделенные для шифрования/дешифрования. Более высокие значения улучшают пропускную способность при высокой параллельной нагрузке.
[performance]
worker_threads = 4
crypto_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 = true
listen_address = "127.0.0.1:8118"
[tun]
enabled = true
mtu = 1420
routes = ["0.0.0.0/0"]
[dns_proxy]
enabled = true
listen_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 = true
builtin_bypass_countries = ["CN"]
block_ads = true
[network]
prefer_ipv4 = true
dns_cache_enabled = true
[server_identity]
trust_on_first_use = true
strict = true