Skip to content

OpenVPN — sing-box ​

sing-box поддерживает OpenVPN нативно через две конечные точки — openvpn-client и openvpn-server в endpoints[] — плюс DNS-сервер openvpn, который разрешает имена через резолверы, переданные сервером клиенту. Обе конечные точки совместимы со стандартными узлами OpenVPN, включая режим статического ключа, устаревшие шифры и дайджесты, а также проверки сертификатов в стиле OpenVPN.

Теги сборки

OpenVPN включается в сборку только с тегом with_openvpn; внутреннему сетевому стеку по умолчанию (system: false) нужен также with_gvisor. Без них конечные точки и DNS-сервер завершаются ошибкой при запуске с подсказкой пересобрать.

Общие поля интерфейса ​

Обе конечные точки встраивают эти поля:

ПолеТипПо умолчаниюДопустимые значенияОписание
systemboolfalsetrue | falseИспользовать системный интерфейс (нужны привилегии, не должен конфликтовать с существующим интерфейсом). На нём настраиваются адреса и MTU, но маршруты и DNS операционной системы не устанавливаются. false использует внутренний сетевой стек.
namestring(auto, ovpn…)<interface name>Имя интерфейса при system: true.
mtuuint321500<bytes>MTU туннельного интерфейса. На клиенте используется 1500, пока сервер не передаст своё значение.
udp_mappingUDPNATBehaviorendpoint_independentendpoint_independent | address_dependent | address_and_port_dependentСопоставление UDP NAT: одно сопоставление на адрес и порт источника для всех назначений (по умолчанию) либо отдельное для каждого адреса назначения / адреса и порта.
udp_filteringUDPNATBehaviorendpoint_independentendpoint_independent | address_dependent | address_and_port_dependentФильтрация UDP NAT: принимать пакеты от любого удалённого узла (по умолчанию) либо только от адресов / пар адрес-порт, куда уже отправлялись пакеты.
udp_nat_maxuint320 (auto)<uint32>Максимум сессий UDP NAT; при достижении лимита закрывается дольше всех не использовавшаяся. 0 — это 4096 на iOS, на других платформах от 4096 до 16384 в зависимости от объёма памяти.

Исходный код: option/openvpn.go:10-17 · зафиксировано на v1.14.2 (af6e64c)

Клиентская конечная точка (openvpn-client) ​

type: "openvpn-client" в endpoints[]. Помимо полей ниже принимает server / server_port (конфликтуют с servers) и поля подключения, которые применяются к соединению с сервером OpenVPN.

Соединение и адресация ​

ПолеТипПо умолчаниюДопустимые значенияОписание
modestringtlstls | static_keyРежим сессии. static_key — устаревший режим совместимости без управляющего канала TLS и без прямой секретности; он игнорирует tls, имя пользователя/пароль, получаемые от сервера параметры и повторное согласование.
networkstringudpudp | tcp | udp4 | udp6 | tcp4 | tcp6Транспорт до сервера по умолчанию. Применяется к server и к элементам servers без собственного network.
servers[]OpenVPNRemoteOptions[][{server, server_port, network}]Серверы, перебираемые по порядку с переходом к следующему при ошибке соединения. Каждому элементу нужны server и server_port, network можно переопределить. Конфликтует с верхнеуровневым server; нужен один из двух.
remote_randomboolfalsetrue | falseПеремешать servers перед подключением.
addressbadoption.Listable[netip.Prefix][][<CIDR>]Локальные туннельные префиксы IPv4 / IPv6. Обязательны в режиме static_key; в режиме TLS необязательны — сервер может их передать.
peer_address*badoption.Addr(unset)<IPv4>IPv4-узел туннеля и шлюз VPN. Обязателен при IPv4 address в режиме static_key.
peer_address_ipv6*badoption.Addr(unset)<IPv6>IPv6-узел туннеля и шлюз VPN. Обязателен при IPv6 address в режиме static_key.
topologystring(pushed)net30 | p2p | subnetТопология туннеля. Если пусто, в режиме TLS берётся топология, переданная сервером.
udp_timeoutUDPTimeoutCompat5m<duration>Тайм-аут сессий UDP NAT для трафика через туннель.
explicit_exit_notifyuint320<count>Число уведомлений о выходе, отправляемых с интервалом в секунду при закрытии UDP-соединения. 0 отключает их.

Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)

Аутентификация и ключи ​

ПолеТипПо умолчаниюДопустимые значенияОписание
usernamestring(unset)<string>Имя пользователя для аутентификации OpenVPN по логину и паролю. Только в режиме TLS.
passwordstring(unset)<string>Пароль для аутентификации по логину и паролю.
auth_retrystringnonenone | nointeract | interactПоведение после неудачной аутентификации: none считает её окончательной; nointeract и interact разрешают повторы.
static_challengestring(unset)<text>Текст статического запроса, показываемый при запросе ответа аутентификации (например, одноразового кода).
static_challenge_echoboolfalsetrue | falseПоказывать ответ на статический запрос открытым текстом при вводе.
static_keybadoption.Listable[string](unset)<key content>Содержимое статического ключа OpenVPN. Обязателен в режиме static_key, если не задан static_key_path; конфликтует с ним.
static_key_pathstring(unset)<path>Путь к файлу статического ключа OpenVPN. Конфликтует с static_key.
key_directionstring(bidirectional)server | clientНаправление статического ключа, только в режиме static_key. Если пусто, ключ используется в обе стороны.
tls*OpenVPNOutboundTLSOptions(required in tls mode)OpenVPNOutboundTLSOptionsКонфигурация TLS управляющего канала; см. таблицу tls ниже.

Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)

Канал данных ​

ПолеТипПо умолчаниюДопустимые значенияОписание
cipherstringBF-CBC<cipher name>Шифр канала данных только для режима static_key. Апстрим-умолчание BF-CBC — устаревший шифр с 64-битным блоком, задайте шифр сервера явно. NONE не даёт конфиденциальности.
data_ciphersbadoption.Listable[string]AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305[<cipher name>]Шифры канала данных, допустимые при согласовании. Только в режиме TLS. Устаревшие шифры CBC / CFB / OFB и NONE доступны, но по умолчанию не включены.
data_ciphers_fallbackstring(disabled)<cipher name>Шифр для серверов, не умеющих согласовывать шифр. Только в режиме TLS.
authstringSHA1<digest name>HMAC-дайджест канала данных. Влияет только на шифры без AEAD и на tls_auth; устаревшие дайджесты вроде MD5 и RIPEMD160 принимаются при явном указании.
mss_fixuint32(OpenVPN default)<bytes>Максимальный размер пакета OpenVPN для ограничения MSS TCP-соединений в туннеле. Если пусто — апстрим-умолчание: fragment, если задан, иначе 1492 или заданный MTU туннеля.
mss_fix_disabledboolfalsetrue | falseПолностью отключить ограничение MSS, включая умолчание. Конфликтует с mss_fix и mss_fix_mode.
mss_fix_modestring(encapsulation-aware)mtu | fixedКак трактуется явный mss_fix: mtu учитывает также внешние заголовки IP и UDP/TCP; fixed считает его размером внутреннего IPv4-пакета. Требует mss_fix.
fragmentuint3200 | >= 68Максимальный размер UDP-пакета для собственной фрагментации канала данных OpenVPN. 0 отключает её; недопустимо с транспортом TCP.
replay_windowuint3264<= 65536Размер окна защиты от повторов для UDP-канала данных. TCP всегда требует строго последовательных ID пакетов.
replay_window_timebadoption.Duration15s<= 10m, whole secondsДлительность окна защиты от повторов для UDP-канала данных.
compressionstring(disabled)none | no | lz4 | lz4-v2 | stub | stub-v2 | disabled | offКадрирование compress в OpenVPN. Сжатие может ослабить конфиденциальность; если нужна лишь совместимость кадрирования, предпочитайте stub / stub-v2.
compression_lzostring(disabled)none | no | yes | adaptive | asym | disabled | offРежим comp-lzo в OpenVPN. Включайте только если этого требует сервер.
allow_compressionstringnono | asym | yesПолитика для сжатия, передаваемого сервером: no разрешает только кадрирование stub; asym принимает сжатые пакеты, но никогда не сжимает исходящие; yes — устаревший синоним asym.

Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)

Переданные параметры и маршрутизация ​

ПолеТипПо умолчаниюДопустимые значенияОписание
route_no_pullboolfalsetrue | falseИгнорировать маршруты, параметры DNS / DHCP, метрики маршрутов, redirect-gateway, redirect-private, block-ipv6 и block-outside-dns от сервера. Адресация, топология и MTU всё равно применяются.
pull_filters[]OpenVPNPullFilterOptions[][{action, text}]Упорядоченные фильтры для передаваемых сервером параметров; см. таблицу pull_filters[] ниже.
routesbadoption.Listable[netip.Prefix][][<CIDR>]Дополнительные префиксы, которые маршрутизация sing-box предпочитает отправлять через эту конечную точку, сверх маршрутов от сервера. Маршруты ОС не устанавливаются.
route_gateway*badoption.Addr(pushed gateway)<IPv4>IPv4-шлюз для маршрутов через конечную точку. Оставлен для совместимости с OpenVPN; предпочтение маршрутов основано на префиксах.
route_metricint0<int>Метрика маршрутов по умолчанию. Оставлена для совместимости с OpenVPN; системный маршрут не устанавливается.
redirect_gatewayboolfalsetrue | falseВ маршрутизации sing-box предпочитать эту конечную точку для всех IPv4-назначений. Маршрут по умолчанию ОС не устанавливается.
redirect_gateway_flagsbadoption.Listable[string][]!ipv4 | def1 | ipv6 | local | autolocalФлаги redirect-gateway в OpenVPN: !ipv4 снимает предпочтение IPv4, def1 выражает его двумя префиксами /1, ipv6 предпочитает также IPv6. block-local не поддерживается; bypass-dhcp / bypass-dns неприменимы.
redirect_privateboolfalsetrue | falseПринимать redirect_gateway_flags без добавления предпочтения маршрута по умолчанию.
block_ipv6boolfalsetrue | falseОтклонять IPv6-трафик локально вместо отправки через VPN.

Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)

Таймеры и повторное согласование ​

ПолеТипПо умолчаниюДопустимые значенияОписание
ping_intervalbadoption.Duration(disabled)<duration>Отправлять ping канала данных после такого интервала без отправки на сервер. Переданный сервером ping его переопределяет. Целые секунды.
ping_restartbadoption.Duration120s (UDP, pull)<duration>Переподключаться после такого интервала без приёма пакетов. Переданный сервером ping-restart его переопределяет; для TCP умолчания нет. Целые секунды.
ping_restart_disabledboolfalsetrue | falseОтключить начальный тайм-аут pull 120s для UDP и любой локальный ping_restart. Конфликтует с ping_restart.
renegotiate_intervalbadoption.Duration1h<duration>Интервал повторного согласования TLS.
renegotiate_disabledboolfalsetrue | falseОтключить повторное согласование TLS по времени, включая интервал по умолчанию. Конфликтует с renegotiate_interval.
renegotiate_bytesuint640<bytes>Пересогласовать ключи канала данных после такого числа байт. 0 — зависящее от шифра умолчание OpenVPN.
renegotiate_packetsuint640<packets>Пересогласовать ключи канала данных после такого числа пакетов. 0 — зависящее от шифра умолчание OpenVPN.
tls_timeoutbadoption.Duration2s<duration>Начальный тайм-аут повторной передачи управляющих пакетов TLS.
handshake_windowbadoption.Duration1m<duration>Максимальное время начального рукопожатия TLS и каждого повторного согласования.

Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)

pull_filters[] ​

ПолеТипПо умолчаниюДопустимые значенияОписание
actionstring(required)accept | ignore | rejectaccept применяет совпавший параметр, ignore отбрасывает его, reject разрывает соединение.
textstring(required)<prefix>Префикс полного переданного параметра с учётом регистра. Срабатывает первый совпавший фильтр; несовпавшие параметры принимаются. "route " совпадает с переданными IPv4-маршрутами, но не с route-gateway.

Исходный код: option/openvpn.go:117-120 · зафиксировано на v1.14.2 (af6e64c)

tls ​

ПолеТипПо умолчаниюДопустимые значенияОписание
server_namestring(unset)<name>Ожидаемое имя в сертификате сервера. Если пусто, имя не проверяется; цепочка или отпечаток и назначение сертификата всё равно проверяются.
server_name_typestringnamesubject | name | name-prefixПоле сертификата, сравниваемое с server_name: полный subject, точное общее имя или префикс общего имени.
certificatebadoption.Listable[string](unset)<PEM>Содержимое доверенного сертификата CA. Нужен один из certificate, certificate_path или peer_fingerprint; конфликтует с certificate_path.
certificate_pathstring(unset)<path>Путь к доверенному сертификату CA. Конфликтует с certificate.
client_certificatebadoption.Listable[string](unset)<PEM>Содержимое клиентского сертификата; задаётся вместе с клиентским ключом. Конфликтует с client_certificate_path.
client_certificate_pathstring(unset)<path>Путь к клиентскому сертификату. Конфликтует с client_certificate.
client_keybadoption.Listable[string](unset)<PEM>Содержимое закрытого ключа клиента. Конфликтует с client_key_path.
client_key_pathstring(unset)<path>Путь к закрытому ключу клиента. Конфликтует с client_key.
peer_fingerprintbadoption.Listable[string][][<64 lowercase hex chars>]Допустимые отпечатки SHA-256 листового сертификата сервера. С доверенным CA проверяется и то и другое; без него сама цепочка не проверяется.
crl_pathstring(unset)<path>Список отзыва сертификатов в PEM или DER для отклонения отозванных серверных сертификатов.
remote_certificate_kubadoption.Listable[string][][<hex mask>]Обязательные маски использования ключа в формате remote-cert-ku OpenVPN; сертификат должен содержать все биты хотя бы одной маски.
remote_certificate_ekustring(unset)<OID or name> | server | clientОбязательное расширенное использование ключа. Заменяет проверку remote_certificate_tls по умолчанию и конфликтует с явно заданной.
remote_certificate_tlsstringserverserver | client | noneПроверка назначения серверного сертификата; none отключает её.
certificate_profilestringlegacyinsecure | legacy | preferred | suitebПрофиль стойкости сертификатов: insecure принимает также цепочки MD5 / SHA-1 и короткие ключи, legacy принимает SHA-1, но не MD5, preferred требует более стойких подписей и ключей, suiteb по умолчанию ставит шифры TLS 1.2 из Suite B.
ns_certificate_typestring(disabled)server | clientУстаревшая проверка типа сертификата Netscape. Предпочтительнее remote_certificate_tls.
version_minstring1.21.0 | 1.1 | 1.2 | 1.3Минимальная версия TLS.
version_maxstring(highest supported)1.0 | 1.1 | 1.2 | 1.3Максимальная версия TLS; не может быть ниже version_min.
cipherstring(default suites)<OpenSSL names, colon-separated>Наборы шифров для TLS 1.2 и ниже. На наборы TLS 1.3 не влияет.
groupsstring(default groups)X25519 | SECP256R1 | SECP384R1 | SECP521R1Группы обмена ключами в порядке предпочтения, через двоеточие.
control_wrap*OpenVPNControlWrapOptions(disabled)OpenVPNControlWrapOptionsОбёртка управляющего канала (tls-auth / tls-crypt / tls-crypt-v2); см. следующую таблицу.

Исходный код: option/openvpn.go:122-143 · зафиксировано на v1.14.2 (af6e64c)

tls.control_wrap ​

ПолеТипПо умолчаниюДопустимые значенияОписание
typestring(required when set)tls_auth | tls_crypt | tls_crypt_v2Тип обёртки, соответствующий tls-auth, tls-crypt и tls-crypt-v2 в OpenVPN.
keybadoption.Listable[string](unset)<key content>Содержимое ключа обёртки. Конфликтует с key_path.
key_pathstring(unset)<path>Путь к ключу обёртки. Конфликтует с key.
directionstring(bidirectional)server | clientНаправление ключа tls_auth; только при type tls_auth. Если пусто, ключ используется в обе стороны.

Исходный код: option/openvpn.go:169-174 · зафиксировано на v1.14.2 (af6e64c)

Серверная конечная точка (openvpn-server) ​

type: "openvpn-server" в endpoints[], плюс поля слушателя (listen, listen_port и udp_timeout для сессий UDP NAT).

Сессия и адресация ​

ПолеТипПо умолчаниюДопустимые значенияОписание
modestringtlstls | static_keyРежим сессии. static_key обслуживает единственный узел без TLS и прямой секретности и игнорирует tls, users, push и параметры повторного согласования.
networkstringudpudp | tcpТранспорт, обслуживаемый этой конечной точкой. Одна сеть на конечную точку — чтобы обслуживать обе, настройте две конечные точки с разными подсетями address.
remotestring(unset)<address>Фиксированный адрес узла для UDP-сервера в режиме static_key, обязателен вместе с remote_port. TCP-серверы берут узел из принятого сокета.
remote_portuint16(unset)<port>Фиксированный порт узла для UDP-сервера в режиме static_key.
max_clientsint1024< 16777216Максимум установленных и ожидающих TLS-сессий. Режим static_key поддерживает один узел, поэтому там значение должно быть 0 или 1.
addressbadoption.Listable[netip.Prefix](required)[<CIDR>]Префиксы сервера — не более одного IPv4 и одного IPv6. Адрес префикса назначается интерфейсу сервера, а маскированный префикс становится пулом адресов и маршрутом клиентов. В режиме static_key это локальные туннельные префиксы.
peer_address*badoption.Addr(unset)<IPv4>IPv4-адрес узла туннеля. Обязателен при IPv4 address в режиме static_key.
peer_address_ipv6*badoption.Addr(unset)<IPv6>IPv6-адрес узла туннеля. Обязателен при IPv6 address в режиме static_key.
topologystringsubnet (tls) / p2p (static_key)subnet | p2p | net30Топология, передаваемая клиентам.
duplicate_cnboolfalsetrue | falseРазрешить несколько активных клиентов с одинаковым общим именем сертификата или именем пользователя. Если выключено, новая сессия заменяет старую и повторно использует её адрес. Только в режиме TLS.
users[]auth.User[][{username, password}]Пользователи с логином и паролем. Если заданы, клиенты должны пройти эту проверку в дополнение к политике сертификатов. Только в режиме TLS.

Исходный код: option/openvpn.go:75-110 · зафиксировано на v1.14.2 (af6e64c)

Ключи и канал данных ​

ПолеТипПо умолчаниюДопустимые значенияОписание
static_keybadoption.Listable[string](unset)<key content>Содержимое статического ключа OpenVPN. Обязателен в режиме static_key, если не задан static_key_path; конфликтует с ним.
static_key_pathstring(unset)<path>Путь к файлу статического ключа OpenVPN. Конфликтует с static_key.
key_directionstring(bidirectional)server | clientНаправление статического ключа, только в режиме static_key. По соглашению сервер использует server, а узел — client.
tls*OpenVPNInboundTLSOptions(required in tls mode)OpenVPNInboundTLSOptionsКонфигурация TLS управляющего канала; см. серверную таблицу tls ниже.
cipherstringBF-CBC<cipher name>Шифр канала данных только для режима static_key. BF-CBC — устаревшее апстрим-умолчание; NONE не даёт конфиденциальности.
data_ciphersbadoption.Listable[string]AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305[<cipher name>]Шифры канала данных, предлагаемые при согласовании. Только в режиме TLS. Устаревшие шифры доступны, но по умолчанию не включены.
data_ciphers_fallbackstring(disabled)<cipher name>Шифр для старых клиентов, не умеющих согласовывать шифр (data-ciphers-fallback в OpenVPN). Только в режиме TLS.
authstringSHA1<digest name>HMAC-дайджест канала данных, как в апстриме по умолчанию. Влияет только на шифры без AEAD и на tls_auth.
mss_fixuint32(OpenVPN default)<bytes>Максимальный размер инкапсулированного пакета для ограничения TCP MSS; при MTU по умолчанию расчёт использует 1492.
mss_fix_disabledboolfalsetrue | falseОтключить ограничение MSS, включая умолчание.
mss_fix_modestring(encapsulation-aware)mtu | fixedКак трактуется явный mss_fix. Требует mss_fix.
replay_windowuint3264<= 65536Размер окна защиты от повторов для UDP-канала данных; ID пакетов TCP всегда строго последовательны.
replay_window_timebadoption.Duration15s<duration>Длительность окна защиты от повторов для UDP. Целые секунды.

Исходный код: option/openvpn.go:75-110 · зафиксировано на v1.14.2 (af6e64c)

Передача параметров и таймеры ​

ПолеТипПо умолчаниюДопустимые значенияОписание
push*OpenVPNPushOptions(unset)OpenVPNPushOptionsПараметры, передаваемые клиентам; см. таблицу push ниже.
ping_intervalbadoption.Duration(disabled)<duration>На стороне сервера: отправлять ping после такого интервала без отправки клиенту. Для клиентов используйте push.ping_interval. Целые секунды.
ping_restartbadoption.Duration(disabled)<duration>На стороне сервера: закрывать сессию клиента после такого интервала без приёма от него. Делайте его длиннее клиентского тайм-аута. Целые секунды.
renegotiate_intervalbadoption.Duration1h<duration>Интервал повторного согласования TLS. Только в режиме TLS.
renegotiate_disabledboolfalsetrue | falseОтключить повторное согласование TLS по времени, включая интервал по умолчанию. Только в режиме TLS.
renegotiate_bytesuint640<bytes>Пересогласовать ключи канала данных после такого числа байт; 0 — зависящее от шифра умолчание. Только в режиме TLS.
renegotiate_packetsuint640<packets>Пересогласовать ключи канала данных после такого числа пакетов; 0 — зависящее от шифра умолчание. Только в режиме TLS.
handshake_windowbadoption.Duration1m<duration>Максимальное время начального рукопожатия TLS и каждого повторного согласования. Только в режиме TLS.

Исходный код: option/openvpn.go:75-110 · зафиксировано на v1.14.2 (af6e64c)

tls ​

ПолеТипПо умолчаниюДопустимые значенияОписание
certificatebadoption.Listable[string](required)<PEM>Содержимое серверного сертификата. Нужен certificate или certificate_path; они конфликтуют.
certificate_pathstring(required)<path>Путь к серверному сертификату. Конфликтует с certificate.
keybadoption.Listable[string](required)<PEM>Содержимое закрытого ключа сервера. Нужен key или key_path; они конфликтуют.
key_pathstring(required)<path>Путь к закрытому ключу сервера. Конфликтует с key.
client_certificatebadoption.Listable[string](unset)<PEM>Содержимое сертификата CA для проверки клиентских сертификатов. При verify_client_certificate require или optional нужен один из client_certificate, client_certificate_path или peer_fingerprint.
client_certificate_pathstring(unset)<path>Путь к сертификату CA для проверки клиентских сертификатов. Конфликтует с client_certificate.
verify_client_certificatestringrequirerequire | optional | noneПолитика клиентских сертификатов: optional проверяет сертификат, если он предъявлен, none его не запрашивает. users, если заданы, проверяются всё равно.
client_namestring(unset)<name>Ожидаемое имя в клиентском сертификате. Если пусто, проверка отключена.
client_name_typestringnamesubject | name | name-prefixПоле сертификата, сравниваемое с client_name.
peer_fingerprintbadoption.Listable[string][][<64 lowercase hex chars>]Допустимые отпечатки SHA-256 листовых сертификатов клиентов; работает без клиентского CA.
crl_pathstring(unset)<path>Список отзыва для отклонения отозванных клиентских сертификатов.
remote_certificate_kubadoption.Listable[string][][<hex mask>]Обязательные маски использования ключа клиента в формате remote-cert-ku OpenVPN.
remote_certificate_ekustring(unset)<OID or name> | server | clientОбязательное расширенное использование ключа клиента. Конфликтует с явно заданным remote_certificate_tls.
remote_certificate_tlsstringclientserver | client | noneПроверка назначения клиентских сертификатов; none отключает её.
certificate_profilestringlegacyinsecure | legacy | preferred | suitebПрофиль стойкости сертификатов, с тем же смыслом, что у клиента.
ns_certificate_typestring(disabled)server | clientУстаревшая проверка типа сертификата Netscape.
version_minstring1.21.0 | 1.1 | 1.2 | 1.3Минимальная версия TLS.
version_maxstring(highest supported)1.0 | 1.1 | 1.2 | 1.3Максимальная версия TLS.
cipherstring(default suites)<OpenSSL names, colon-separated>Наборы шифров для TLS 1.2 и ниже. На наборы TLS 1.3 не влияет.
groupsstring(default groups)X25519 | SECP256R1 | SECP384R1 | SECP521R1Группы обмена ключами в порядке предпочтения, через двоеточие.
control_wrap*OpenVPNInboundControlWrapOptions(disabled)OpenVPNInboundControlWrapOptionsОбёртка управляющего канала; см. следующую таблицу.

Исходный код: option/openvpn.go:145-167 · зафиксировано на v1.14.2 (af6e64c)

tls.control_wrap ​

ПолеТипПо умолчаниюДопустимые значенияОписание
typestring(required)tls_auth | tls_crypt | tls_crypt_v2Тип обёртки. Для tls_crypt_v2 ключ — это ключ сервера.
keybadoption.Listable[string](unset)<key content>Содержимое ключа обёртки. Нужен key или key_path; они конфликтуют.
key_pathstring(unset)<path>Путь к ключу обёртки. Конфликтует с key.
directionstring(bidirectional)server | clientНаправление ключа tls_auth: server соответствует key-direction 0 в OpenVPN, client — 1. Если пусто, ключ используется в обе стороны.
force_cookieboolfalsetrue | falseТолько tls_crypt_v2: требовать от UDP-клиентов поддержки cookie сессий без состояния. Если выключено, клиенты без поддержки cookie всё равно принимаются.

Исходный код: option/openvpn.go:176-182 · зафиксировано на v1.14.2 (af6e64c)

push ​

ПолеТипПо умолчаниюДопустимые значенияОписание
routesbadoption.Listable[netip.Prefix][][<CIDR>]Маршруты, передаваемые клиентам; IPv4 и IPv6 можно смешивать.
dnsbadoption.Listable[netip.Addr][][<IP>]DNS-серверы, передаваемые как устаревший dhcp-option DNS / DNS6. На совместимых клиентах переданная группа серверов нового формата их переопределяет.
dns_servers[]OpenVPNPushDNSServerOptions[][{priority, addresses, resolve_domains, dnssec, transport, sni}]Группы DNS-серверов нового формата. addresses принимают IP или IP:port ([IPv6]:port); transport — plain, dot или doh; dnssec — yes, optional или no. Клиенты используют только группу с наименьшим числом priority.
search_domainsbadoption.Listable[string][][<domain>]Домены поиска нового формата для передачи.
dhcp_optionsbadoption.Listable[string][][<option>]Дополнительные значения устаревшего dhcp-option, без префикса dhcp-option.
redirect_gatewayboolfalsetrue | falseПередавать redirect-gateway, чтобы клиенты направляли свой трафик через VPN.
redirect_gateway_flagsbadoption.Listable[string]def1[<flag>]Флаги redirect-gateway для передачи; используются только с redirect_gateway.
block_outside_dnsboolfalsetrue | falseПередавать block-outside-dns, блокирующий DNS вне VPN на клиентах Windows.
ping_intervalbadoption.Duration(disabled)<duration>Интервал ping OpenVPN, передаваемый клиентам. Целые секунды.
ping_restartbadoption.Duration(disabled)<duration>Тайм-аут ping-restart OpenVPN, передаваемый клиентам. Целые секунды.

Исходный код: option/openvpn.go:184-195 · зафиксировано на v1.14.2 (af6e64c)

DNS-сервер (openvpn) ​

type: "openvpn" в dns.servers[]:

ПолеТипПо умолчаниюДопустимые значенияОписание
endpointstring(required)<openvpn-client tag>Тег конечной точки openvpn-client, чьи переданные сервером резолверы используются. Запросы отправляются через эту конечную точку.
accept_default_resolversboolfalsetrue | falseИспользовать переданные резолверы и для запросов, не совпавших ни с одним переданным resolve-domains, DOMAIN-ROUTE или суффиксом домена поиска. Если выключено, такие запросы получают NXDOMAIN.
accept_search_domainboolfalsetrue | falseПовторять одноуровневые запросы (например, intranet) с каждым переданным доменом поиска, пока один не разрешится.

Исходный код: option/openvpn.go:206-210 · зафиксировано на v1.14.2 (af6e64c)

Примеры ​

Клиент с аутентификацией по сертификату и tls-crypt, направляющий одну подсеть через туннель и разрешающий внутренние имена сервера через переданные резолверы:

json
{
  "endpoints": [
    {
      "type": "openvpn-client",
      "tag": "ovpn-client",
      "server": "vpn.example.com",
      "server_port": 1194,
      "network": "udp",
      "tls": {
        "certificate_path": "/etc/openvpn/ca.crt",
        "client_certificate_path": "/etc/openvpn/client.crt",
        "client_key_path": "/etc/openvpn/client.key",
        "control_wrap": { "type": "tls_crypt", "key_path": "/etc/openvpn/tc.key" }
      }
    }
  ],
  "dns": {
    "servers": [
      { "type": "local", "tag": "local" },
      { "type": "openvpn", "tag": "ovpn-dns", "endpoint": "ovpn-client", "accept_default_resolvers": true }
    ],
    "rules": [
      { "preferred_by": "ovpn-dns", "action": "route", "server": "ovpn-dns" }
    ],
    "final": "local"
  },
  "route": {
    "rules": [
      { "ip_cidr": ["10.8.0.0/16"], "outbound": "ovpn-client" }
    ]
  }
}

Сервер на UDP 1194, раздающий 10.8.0.0/24 и передающий маршрут по умолчанию:

json
{
  "endpoints": [
    {
      "type": "openvpn-server",
      "tag": "ovpn-server",
      "listen": "::",
      "listen_port": 1194,
      "network": "udp",
      "address": ["10.8.0.1/24"],
      "tls": {
        "certificate_path": "/etc/openvpn/server.crt",
        "key_path": "/etc/openvpn/server.key",
        "client_certificate_path": "/etc/openvpn/ca.crt",
        "control_wrap": { "type": "tls_crypt", "key_path": "/etc/openvpn/tc.key" }
      },
      "push": {
        "redirect_gateway": true,
        "dns": ["1.1.1.1"]
      }
    }
  ]
}

Примечания ​

  • Конечные точки находятся в endpoints[] и выбираются по тегу в правилах маршрутизации так же, как исходящие. Ни одна из них не устанавливает маршруты или DNS операционной системы: routes, redirect_gateway и переданные маршруты лишь определяют, какие назначения sing-box предпочитает отправлять через конечную точку.
  • Поля подключения клиента применяются к его соединению с сервером OpenVPN; это управляющее соединение никогда не идёт по маршрутам самой конечной точки, поэтому флагам redirect-gateway local / autolocal не нужно исключение маршрута.
  • Режим static_key оставлен только для совместимости с узлами, которые нельзя обновить, — у него нет управляющего канала TLS и прямой секретности. Предпочитайте tls.
  • Интерактивная аутентификация (запрос / ответ, auth_retry: "interact") выполняется через графические клиенты sing-box или Dashboard в разделе Tools › Endpoints.
  • DNS-параметры, переданные сервером, никогда не записываются в операционную систему. Чтобы ими пользоваться, применяйте DNS-сервер openvpn: активна только переданная группа серверов с наименьшим числом priority, при отсутствии групп нового формата используется устаревший dhcp-option DNS, а группа, требующая DNSSEC (dnssec yes), отклоняется, так как этот транспорт не проверяет DNSSEC.
  • Длительности вроде ping_interval, ping_restart и replay_window_time должны быть целыми секундами.

Сравнение с другими ядрами ​

  • У mihomo есть только клиент OpenVPN: исходящий type: openvpn, ключи которого повторяют директивы .ovpn (ca / cert / key, tls-auth / tls-crypt, username / password и т. д.). Сервера OpenVPN в mihomo нет. mihomo по умолчанию использует auth SHA256, а sing-box следует апстриму OpenVPN с SHA1 — при смешивании реализаций задавайте auth явно на обеих сторонах. См. OpenVPN — mihomo.
  • Xray-core не поддерживает OpenVPN.

Исходный код: option/openvpn.go:10-210 · v1.14.2 (af6e64c)

Core Tutorial от Argsment