OpenVPN — sing-box
sing-box поддерживает OpenVPN нативно через две конечные точки — openvpn-client и openvpn-server в endpoints[] — плюс DNS-сервер openvpn, который разрешает имена через резолверы, переданные сервером клиенту. Обе конечные точки совместимы со стандартными узлами OpenVPN, включая режим статического ключа, устаревшие шифры и дайджесты, а также проверки сертификатов в стиле OpenVPN.
Теги сборки
OpenVPN включается в сборку только с тегом with_openvpn; внутреннему сетевому стеку по умолчанию (system: false) нужен также with_gvisor. Без них конечные точки и DNS-сервер завершаются ошибкой при запуске с подсказкой пересобрать.
Общие поля интерфейса
Обе конечные точки встраивают эти поля:
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
system | bool | false | true | false | Использовать системный интерфейс (нужны привилегии, не должен конфликтовать с существующим интерфейсом). На нём настраиваются адреса и MTU, но маршруты и DNS операционной системы не устанавливаются. false использует внутренний сетевой стек. |
name | string | (auto, ovpn…) | <interface name> | Имя интерфейса при system: true. |
mtu | uint32 | 1500 | <bytes> | MTU туннельного интерфейса. На клиенте используется 1500, пока сервер не передаст своё значение. |
udp_mapping | UDPNATBehavior | endpoint_independent | endpoint_independent | address_dependent | address_and_port_dependent | Сопоставление UDP NAT: одно сопоставление на адрес и порт источника для всех назначений (по умолчанию) либо отдельное для каждого адреса назначения / адреса и порта. |
udp_filtering | UDPNATBehavior | endpoint_independent | endpoint_independent | address_dependent | address_and_port_dependent | Фильтрация UDP NAT: принимать пакеты от любого удалённого узла (по умолчанию) либо только от адресов / пар адрес-порт, куда уже отправлялись пакеты. |
udp_nat_max | uint32 | 0 (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.
Соединение и адресация
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
mode | string | tls | tls | static_key | Режим сессии. static_key — устаревший режим совместимости без управляющего канала TLS и без прямой секретности; он игнорирует tls, имя пользователя/пароль, получаемые от сервера параметры и повторное согласование. |
network | string | udp | udp | tcp | udp4 | udp6 | tcp4 | tcp6 | Транспорт до сервера по умолчанию. Применяется к server и к элементам servers без собственного network. |
servers | []OpenVPNRemoteOptions | [] | [{server, server_port, network}] | Серверы, перебираемые по порядку с переходом к следующему при ошибке соединения. Каждому элементу нужны server и server_port, network можно переопределить. Конфликтует с верхнеуровневым server; нужен один из двух. |
remote_random | bool | false | true | false | Перемешать servers перед подключением. |
address | badoption.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. |
topology | string | (pushed) | net30 | p2p | subnet | Топология туннеля. Если пусто, в режиме TLS берётся топология, переданная сервером. |
udp_timeout | UDPTimeoutCompat | 5m | <duration> | Тайм-аут сессий UDP NAT для трафика через туннель. |
explicit_exit_notify | uint32 | 0 | <count> | Число уведомлений о выходе, отправляемых с интервалом в секунду при закрытии UDP-соединения. 0 отключает их. |
Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)
Аутентификация и ключи
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
username | string | (unset) | <string> | Имя пользователя для аутентификации OpenVPN по логину и паролю. Только в режиме TLS. |
password | string | (unset) | <string> | Пароль для аутентификации по логину и паролю. |
auth_retry | string | none | none | nointeract | interact | Поведение после неудачной аутентификации: none считает её окончательной; nointeract и interact разрешают повторы. |
static_challenge | string | (unset) | <text> | Текст статического запроса, показываемый при запросе ответа аутентификации (например, одноразового кода). |
static_challenge_echo | bool | false | true | false | Показывать ответ на статический запрос открытым текстом при вводе. |
static_key | badoption.Listable[string] | (unset) | <key content> | Содержимое статического ключа OpenVPN. Обязателен в режиме static_key, если не задан static_key_path; конфликтует с ним. |
static_key_path | string | (unset) | <path> | Путь к файлу статического ключа OpenVPN. Конфликтует с static_key. |
key_direction | string | (bidirectional) | server | client | Направление статического ключа, только в режиме static_key. Если пусто, ключ используется в обе стороны. |
tls | *OpenVPNOutboundTLSOptions | (required in tls mode) | OpenVPNOutboundTLSOptions | Конфигурация TLS управляющего канала; см. таблицу tls ниже. |
Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)
Канал данных
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
cipher | string | BF-CBC | <cipher name> | Шифр канала данных только для режима static_key. Апстрим-умолчание BF-CBC — устаревший шифр с 64-битным блоком, задайте шифр сервера явно. NONE не даёт конфиденциальности. |
data_ciphers | badoption.Listable[string] | AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305 | [<cipher name>] | Шифры канала данных, допустимые при согласовании. Только в режиме TLS. Устаревшие шифры CBC / CFB / OFB и NONE доступны, но по умолчанию не включены. |
data_ciphers_fallback | string | (disabled) | <cipher name> | Шифр для серверов, не умеющих согласовывать шифр. Только в режиме TLS. |
auth | string | SHA1 | <digest name> | HMAC-дайджест канала данных. Влияет только на шифры без AEAD и на tls_auth; устаревшие дайджесты вроде MD5 и RIPEMD160 принимаются при явном указании. |
mss_fix | uint32 | (OpenVPN default) | <bytes> | Максимальный размер пакета OpenVPN для ограничения MSS TCP-соединений в туннеле. Если пусто — апстрим-умолчание: fragment, если задан, иначе 1492 или заданный MTU туннеля. |
mss_fix_disabled | bool | false | true | false | Полностью отключить ограничение MSS, включая умолчание. Конфликтует с mss_fix и mss_fix_mode. |
mss_fix_mode | string | (encapsulation-aware) | mtu | fixed | Как трактуется явный mss_fix: mtu учитывает также внешние заголовки IP и UDP/TCP; fixed считает его размером внутреннего IPv4-пакета. Требует mss_fix. |
fragment | uint32 | 0 | 0 | >= 68 | Максимальный размер UDP-пакета для собственной фрагментации канала данных OpenVPN. 0 отключает её; недопустимо с транспортом TCP. |
replay_window | uint32 | 64 | <= 65536 | Размер окна защиты от повторов для UDP-канала данных. TCP всегда требует строго последовательных ID пакетов. |
replay_window_time | badoption.Duration | 15s | <= 10m, whole seconds | Длительность окна защиты от повторов для UDP-канала данных. |
compression | string | (disabled) | none | no | lz4 | lz4-v2 | stub | stub-v2 | disabled | off | Кадрирование compress в OpenVPN. Сжатие может ослабить конфиденциальность; если нужна лишь совместимость кадрирования, предпочитайте stub / stub-v2. |
compression_lzo | string | (disabled) | none | no | yes | adaptive | asym | disabled | off | Режим comp-lzo в OpenVPN. Включайте только если этого требует сервер. |
allow_compression | string | no | no | asym | yes | Политика для сжатия, передаваемого сервером: no разрешает только кадрирование stub; asym принимает сжатые пакеты, но никогда не сжимает исходящие; yes — устаревший синоним asym. |
Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)
Переданные параметры и маршрутизация
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
route_no_pull | bool | false | true | false | Игнорировать маршруты, параметры DNS / DHCP, метрики маршрутов, redirect-gateway, redirect-private, block-ipv6 и block-outside-dns от сервера. Адресация, топология и MTU всё равно применяются. |
pull_filters | []OpenVPNPullFilterOptions | [] | [{action, text}] | Упорядоченные фильтры для передаваемых сервером параметров; см. таблицу pull_filters[] ниже. |
routes | badoption.Listable[netip.Prefix] | [] | [<CIDR>] | Дополнительные префиксы, которые маршрутизация sing-box предпочитает отправлять через эту конечную точку, сверх маршрутов от сервера. Маршруты ОС не устанавливаются. |
route_gateway | *badoption.Addr | (pushed gateway) | <IPv4> | IPv4-шлюз для маршрутов через конечную точку. Оставлен для совместимости с OpenVPN; предпочтение маршрутов основано на префиксах. |
route_metric | int | 0 | <int> | Метрика маршрутов по умолчанию. Оставлена для совместимости с OpenVPN; системный маршрут не устанавливается. |
redirect_gateway | bool | false | true | false | В маршрутизации sing-box предпочитать эту конечную точку для всех IPv4-назначений. Маршрут по умолчанию ОС не устанавливается. |
redirect_gateway_flags | badoption.Listable[string] | [] | !ipv4 | def1 | ipv6 | local | autolocal | Флаги redirect-gateway в OpenVPN: !ipv4 снимает предпочтение IPv4, def1 выражает его двумя префиксами /1, ipv6 предпочитает также IPv6. block-local не поддерживается; bypass-dhcp / bypass-dns неприменимы. |
redirect_private | bool | false | true | false | Принимать redirect_gateway_flags без добавления предпочтения маршрута по умолчанию. |
block_ipv6 | bool | false | true | false | Отклонять IPv6-трафик локально вместо отправки через VPN. |
Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)
Таймеры и повторное согласование
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
ping_interval | badoption.Duration | (disabled) | <duration> | Отправлять ping канала данных после такого интервала без отправки на сервер. Переданный сервером ping его переопределяет. Целые секунды. |
ping_restart | badoption.Duration | 120s (UDP, pull) | <duration> | Переподключаться после такого интервала без приёма пакетов. Переданный сервером ping-restart его переопределяет; для TCP умолчания нет. Целые секунды. |
ping_restart_disabled | bool | false | true | false | Отключить начальный тайм-аут pull 120s для UDP и любой локальный ping_restart. Конфликтует с ping_restart. |
renegotiate_interval | badoption.Duration | 1h | <duration> | Интервал повторного согласования TLS. |
renegotiate_disabled | bool | false | true | false | Отключить повторное согласование TLS по времени, включая интервал по умолчанию. Конфликтует с renegotiate_interval. |
renegotiate_bytes | uint64 | 0 | <bytes> | Пересогласовать ключи канала данных после такого числа байт. 0 — зависящее от шифра умолчание OpenVPN. |
renegotiate_packets | uint64 | 0 | <packets> | Пересогласовать ключи канала данных после такого числа пакетов. 0 — зависящее от шифра умолчание OpenVPN. |
tls_timeout | badoption.Duration | 2s | <duration> | Начальный тайм-аут повторной передачи управляющих пакетов TLS. |
handshake_window | badoption.Duration | 1m | <duration> | Максимальное время начального рукопожатия TLS и каждого повторного согласования. |
Исходный код: option/openvpn.go:19-73 · зафиксировано на v1.14.2 (af6e64c)
pull_filters[]
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
action | string | (required) | accept | ignore | reject | accept применяет совпавший параметр, ignore отбрасывает его, reject разрывает соединение. |
text | string | (required) | <prefix> | Префикс полного переданного параметра с учётом регистра. Срабатывает первый совпавший фильтр; несовпавшие параметры принимаются. "route " совпадает с переданными IPv4-маршрутами, но не с route-gateway. |
Исходный код: option/openvpn.go:117-120 · зафиксировано на v1.14.2 (af6e64c)
tls
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
server_name | string | (unset) | <name> | Ожидаемое имя в сертификате сервера. Если пусто, имя не проверяется; цепочка или отпечаток и назначение сертификата всё равно проверяются. |
server_name_type | string | name | subject | name | name-prefix | Поле сертификата, сравниваемое с server_name: полный subject, точное общее имя или префикс общего имени. |
certificate | badoption.Listable[string] | (unset) | <PEM> | Содержимое доверенного сертификата CA. Нужен один из certificate, certificate_path или peer_fingerprint; конфликтует с certificate_path. |
certificate_path | string | (unset) | <path> | Путь к доверенному сертификату CA. Конфликтует с certificate. |
client_certificate | badoption.Listable[string] | (unset) | <PEM> | Содержимое клиентского сертификата; задаётся вместе с клиентским ключом. Конфликтует с client_certificate_path. |
client_certificate_path | string | (unset) | <path> | Путь к клиентскому сертификату. Конфликтует с client_certificate. |
client_key | badoption.Listable[string] | (unset) | <PEM> | Содержимое закрытого ключа клиента. Конфликтует с client_key_path. |
client_key_path | string | (unset) | <path> | Путь к закрытому ключу клиента. Конфликтует с client_key. |
peer_fingerprint | badoption.Listable[string] | [] | [<64 lowercase hex chars>] | Допустимые отпечатки SHA-256 листового сертификата сервера. С доверенным CA проверяется и то и другое; без него сама цепочка не проверяется. |
crl_path | string | (unset) | <path> | Список отзыва сертификатов в PEM или DER для отклонения отозванных серверных сертификатов. |
remote_certificate_ku | badoption.Listable[string] | [] | [<hex mask>] | Обязательные маски использования ключа в формате remote-cert-ku OpenVPN; сертификат должен содержать все биты хотя бы одной маски. |
remote_certificate_eku | string | (unset) | <OID or name> | server | client | Обязательное расширенное использование ключа. Заменяет проверку remote_certificate_tls по умолчанию и конфликтует с явно заданной. |
remote_certificate_tls | string | server | server | client | none | Проверка назначения серверного сертификата; none отключает её. |
certificate_profile | string | legacy | insecure | legacy | preferred | suiteb | Профиль стойкости сертификатов: insecure принимает также цепочки MD5 / SHA-1 и короткие ключи, legacy принимает SHA-1, но не MD5, preferred требует более стойких подписей и ключей, suiteb по умолчанию ставит шифры TLS 1.2 из Suite B. |
ns_certificate_type | string | (disabled) | server | client | Устаревшая проверка типа сертификата Netscape. Предпочтительнее remote_certificate_tls. |
version_min | string | 1.2 | 1.0 | 1.1 | 1.2 | 1.3 | Минимальная версия TLS. |
version_max | string | (highest supported) | 1.0 | 1.1 | 1.2 | 1.3 | Максимальная версия TLS; не может быть ниже version_min. |
cipher | string | (default suites) | <OpenSSL names, colon-separated> | Наборы шифров для TLS 1.2 и ниже. На наборы TLS 1.3 не влияет. |
groups | string | (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
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
type | string | (required when set) | tls_auth | tls_crypt | tls_crypt_v2 | Тип обёртки, соответствующий tls-auth, tls-crypt и tls-crypt-v2 в OpenVPN. |
key | badoption.Listable[string] | (unset) | <key content> | Содержимое ключа обёртки. Конфликтует с key_path. |
key_path | string | (unset) | <path> | Путь к ключу обёртки. Конфликтует с key. |
direction | string | (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).
Сессия и адресация
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
mode | string | tls | tls | static_key | Режим сессии. static_key обслуживает единственный узел без TLS и прямой секретности и игнорирует tls, users, push и параметры повторного согласования. |
network | string | udp | udp | tcp | Транспорт, обслуживаемый этой конечной точкой. Одна сеть на конечную точку — чтобы обслуживать обе, настройте две конечные точки с разными подсетями address. |
remote | string | (unset) | <address> | Фиксированный адрес узла для UDP-сервера в режиме static_key, обязателен вместе с remote_port. TCP-серверы берут узел из принятого сокета. |
remote_port | uint16 | (unset) | <port> | Фиксированный порт узла для UDP-сервера в режиме static_key. |
max_clients | int | 1024 | < 16777216 | Максимум установленных и ожидающих TLS-сессий. Режим static_key поддерживает один узел, поэтому там значение должно быть 0 или 1. |
address | badoption.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. |
topology | string | subnet (tls) / p2p (static_key) | subnet | p2p | net30 | Топология, передаваемая клиентам. |
duplicate_cn | bool | false | true | false | Разрешить несколько активных клиентов с одинаковым общим именем сертификата или именем пользователя. Если выключено, новая сессия заменяет старую и повторно использует её адрес. Только в режиме TLS. |
users | []auth.User | [] | [{username, password}] | Пользователи с логином и паролем. Если заданы, клиенты должны пройти эту проверку в дополнение к политике сертификатов. Только в режиме TLS. |
Исходный код: option/openvpn.go:75-110 · зафиксировано на v1.14.2 (af6e64c)
Ключи и канал данных
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
static_key | badoption.Listable[string] | (unset) | <key content> | Содержимое статического ключа OpenVPN. Обязателен в режиме static_key, если не задан static_key_path; конфликтует с ним. |
static_key_path | string | (unset) | <path> | Путь к файлу статического ключа OpenVPN. Конфликтует с static_key. |
key_direction | string | (bidirectional) | server | client | Направление статического ключа, только в режиме static_key. По соглашению сервер использует server, а узел — client. |
tls | *OpenVPNInboundTLSOptions | (required in tls mode) | OpenVPNInboundTLSOptions | Конфигурация TLS управляющего канала; см. серверную таблицу tls ниже. |
cipher | string | BF-CBC | <cipher name> | Шифр канала данных только для режима static_key. BF-CBC — устаревшее апстрим-умолчание; NONE не даёт конфиденциальности. |
data_ciphers | badoption.Listable[string] | AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305 | [<cipher name>] | Шифры канала данных, предлагаемые при согласовании. Только в режиме TLS. Устаревшие шифры доступны, но по умолчанию не включены. |
data_ciphers_fallback | string | (disabled) | <cipher name> | Шифр для старых клиентов, не умеющих согласовывать шифр (data-ciphers-fallback в OpenVPN). Только в режиме TLS. |
auth | string | SHA1 | <digest name> | HMAC-дайджест канала данных, как в апстриме по умолчанию. Влияет только на шифры без AEAD и на tls_auth. |
mss_fix | uint32 | (OpenVPN default) | <bytes> | Максимальный размер инкапсулированного пакета для ограничения TCP MSS; при MTU по умолчанию расчёт использует 1492. |
mss_fix_disabled | bool | false | true | false | Отключить ограничение MSS, включая умолчание. |
mss_fix_mode | string | (encapsulation-aware) | mtu | fixed | Как трактуется явный mss_fix. Требует mss_fix. |
replay_window | uint32 | 64 | <= 65536 | Размер окна защиты от повторов для UDP-канала данных; ID пакетов TCP всегда строго последовательны. |
replay_window_time | badoption.Duration | 15s | <duration> | Длительность окна защиты от повторов для UDP. Целые секунды. |
Исходный код: option/openvpn.go:75-110 · зафиксировано на v1.14.2 (af6e64c)
Передача параметров и таймеры
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
push | *OpenVPNPushOptions | (unset) | OpenVPNPushOptions | Параметры, передаваемые клиентам; см. таблицу push ниже. |
ping_interval | badoption.Duration | (disabled) | <duration> | На стороне сервера: отправлять ping после такого интервала без отправки клиенту. Для клиентов используйте push.ping_interval. Целые секунды. |
ping_restart | badoption.Duration | (disabled) | <duration> | На стороне сервера: закрывать сессию клиента после такого интервала без приёма от него. Делайте его длиннее клиентского тайм-аута. Целые секунды. |
renegotiate_interval | badoption.Duration | 1h | <duration> | Интервал повторного согласования TLS. Только в режиме TLS. |
renegotiate_disabled | bool | false | true | false | Отключить повторное согласование TLS по времени, включая интервал по умолчанию. Только в режиме TLS. |
renegotiate_bytes | uint64 | 0 | <bytes> | Пересогласовать ключи канала данных после такого числа байт; 0 — зависящее от шифра умолчание. Только в режиме TLS. |
renegotiate_packets | uint64 | 0 | <packets> | Пересогласовать ключи канала данных после такого числа пакетов; 0 — зависящее от шифра умолчание. Только в режиме TLS. |
handshake_window | badoption.Duration | 1m | <duration> | Максимальное время начального рукопожатия TLS и каждого повторного согласования. Только в режиме TLS. |
Исходный код: option/openvpn.go:75-110 · зафиксировано на v1.14.2 (af6e64c)
tls
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
certificate | badoption.Listable[string] | (required) | <PEM> | Содержимое серверного сертификата. Нужен certificate или certificate_path; они конфликтуют. |
certificate_path | string | (required) | <path> | Путь к серверному сертификату. Конфликтует с certificate. |
key | badoption.Listable[string] | (required) | <PEM> | Содержимое закрытого ключа сервера. Нужен key или key_path; они конфликтуют. |
key_path | string | (required) | <path> | Путь к закрытому ключу сервера. Конфликтует с key. |
client_certificate | badoption.Listable[string] | (unset) | <PEM> | Содержимое сертификата CA для проверки клиентских сертификатов. При verify_client_certificate require или optional нужен один из client_certificate, client_certificate_path или peer_fingerprint. |
client_certificate_path | string | (unset) | <path> | Путь к сертификату CA для проверки клиентских сертификатов. Конфликтует с client_certificate. |
verify_client_certificate | string | require | require | optional | none | Политика клиентских сертификатов: optional проверяет сертификат, если он предъявлен, none его не запрашивает. users, если заданы, проверяются всё равно. |
client_name | string | (unset) | <name> | Ожидаемое имя в клиентском сертификате. Если пусто, проверка отключена. |
client_name_type | string | name | subject | name | name-prefix | Поле сертификата, сравниваемое с client_name. |
peer_fingerprint | badoption.Listable[string] | [] | [<64 lowercase hex chars>] | Допустимые отпечатки SHA-256 листовых сертификатов клиентов; работает без клиентского CA. |
crl_path | string | (unset) | <path> | Список отзыва для отклонения отозванных клиентских сертификатов. |
remote_certificate_ku | badoption.Listable[string] | [] | [<hex mask>] | Обязательные маски использования ключа клиента в формате remote-cert-ku OpenVPN. |
remote_certificate_eku | string | (unset) | <OID or name> | server | client | Обязательное расширенное использование ключа клиента. Конфликтует с явно заданным remote_certificate_tls. |
remote_certificate_tls | string | client | server | client | none | Проверка назначения клиентских сертификатов; none отключает её. |
certificate_profile | string | legacy | insecure | legacy | preferred | suiteb | Профиль стойкости сертификатов, с тем же смыслом, что у клиента. |
ns_certificate_type | string | (disabled) | server | client | Устаревшая проверка типа сертификата Netscape. |
version_min | string | 1.2 | 1.0 | 1.1 | 1.2 | 1.3 | Минимальная версия TLS. |
version_max | string | (highest supported) | 1.0 | 1.1 | 1.2 | 1.3 | Максимальная версия TLS. |
cipher | string | (default suites) | <OpenSSL names, colon-separated> | Наборы шифров для TLS 1.2 и ниже. На наборы TLS 1.3 не влияет. |
groups | string | (default groups) | X25519 | SECP256R1 | SECP384R1 | SECP521R1 | Группы обмена ключами в порядке предпочтения, через двоеточие. |
control_wrap | *OpenVPNInboundControlWrapOptions | (disabled) | OpenVPNInboundControlWrapOptions | Обёртка управляющего канала; см. следующую таблицу. |
Исходный код: option/openvpn.go:145-167 · зафиксировано на v1.14.2 (af6e64c)
tls.control_wrap
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
type | string | (required) | tls_auth | tls_crypt | tls_crypt_v2 | Тип обёртки. Для tls_crypt_v2 ключ — это ключ сервера. |
key | badoption.Listable[string] | (unset) | <key content> | Содержимое ключа обёртки. Нужен key или key_path; они конфликтуют. |
key_path | string | (unset) | <path> | Путь к ключу обёртки. Конфликтует с key. |
direction | string | (bidirectional) | server | client | Направление ключа tls_auth: server соответствует key-direction 0 в OpenVPN, client — 1. Если пусто, ключ используется в обе стороны. |
force_cookie | bool | false | true | false | Только tls_crypt_v2: требовать от UDP-клиентов поддержки cookie сессий без состояния. Если выключено, клиенты без поддержки cookie всё равно принимаются. |
Исходный код: option/openvpn.go:176-182 · зафиксировано на v1.14.2 (af6e64c)
push
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
routes | badoption.Listable[netip.Prefix] | [] | [<CIDR>] | Маршруты, передаваемые клиентам; IPv4 и IPv6 можно смешивать. |
dns | badoption.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_domains | badoption.Listable[string] | [] | [<domain>] | Домены поиска нового формата для передачи. |
dhcp_options | badoption.Listable[string] | [] | [<option>] | Дополнительные значения устаревшего dhcp-option, без префикса dhcp-option. |
redirect_gateway | bool | false | true | false | Передавать redirect-gateway, чтобы клиенты направляли свой трафик через VPN. |
redirect_gateway_flags | badoption.Listable[string] | def1 | [<flag>] | Флаги redirect-gateway для передачи; используются только с redirect_gateway. |
block_outside_dns | bool | false | true | false | Передавать block-outside-dns, блокирующий DNS вне VPN на клиентах Windows. |
ping_interval | badoption.Duration | (disabled) | <duration> | Интервал ping OpenVPN, передаваемый клиентам. Целые секунды. |
ping_restart | badoption.Duration | (disabled) | <duration> | Тайм-аут ping-restart OpenVPN, передаваемый клиентам. Целые секунды. |
Исходный код: option/openvpn.go:184-195 · зафиксировано на v1.14.2 (af6e64c)
DNS-сервер (openvpn)
type: "openvpn" в dns.servers[]:
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
endpoint | string | (required) | <openvpn-client tag> | Тег конечной точки openvpn-client, чьи переданные сервером резолверы используются. Запросы отправляются через эту конечную точку. |
accept_default_resolvers | bool | false | true | false | Использовать переданные резолверы и для запросов, не совпавших ни с одним переданным resolve-domains, DOMAIN-ROUTE или суффиксом домена поиска. Если выключено, такие запросы получают NXDOMAIN. |
accept_search_domain | bool | false | true | false | Повторять одноуровневые запросы (например, intranet) с каждым переданным доменом поиска, пока один не разрешится. |
Исходный код: option/openvpn.go:206-210 · зафиксировано на v1.14.2 (af6e64c)
Примеры
Клиент с аутентификацией по сертификату и tls-crypt, направляющий одну подсеть через туннель и разрешающий внутренние имена сервера через переданные резолверы:
{
"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 и передающий маршрут по умолчанию:
{
"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 по умолчанию используетauthSHA256, а sing-box следует апстриму OpenVPN с SHA1 — при смешивании реализаций задавайтеauthявно на обеих сторонах. См. OpenVPN — mihomo. - Xray-core не поддерживает OpenVPN.
Исходный код: option/openvpn.go:10-210 · v1.14.2 (af6e64c)
