Skip to content

OpenVPN — mihomo ​

mihomo может подключаться к серверу OpenVPN как к исходящему, запуская клиент в пользовательском пространстве, который поднимает устройство стека типа tun и направляет совпавший трафик через шифрованный туннель. Управляющий канал аутентифицируется сертификатами (ca / cert / key), необязательным tls-crypt и/или учётными данными auth-user-pass; канал данных шифруется согласованным cipher.

Исходящий ​

Запись в proxies: с type: openvpn. Встраивает BasicOption (общие поля исходящих).

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Хост/IP сервера OpenVPN.
portint(required)<port>Порт сервера.
protostringudpudp | tcpТранспортный протокол туннеля OpenVPN.
devstringtuntunТип виртуального устройства (например, tun).
cipherstringAES-128-GCMAES-128-GCM | AES-192-GCM | AES-256-GCM | AES-128-CBC | AES-192-CBC | AES-256-CBC | CHACHA20-POLY1305Шифр канала данных, используемый, когда data-ciphers не задан.
data-ciphers[]string(unset)[<cipher>]Список шифров канала данных, предлагаемый для согласования (OpenVPN --data-ciphers). Согласованным становится первый присланный сервером шифр, который также присутствует здесь; если список не задан, используется одиночное значение cipher.
data-ciphers-fallbackstring(unset)<cipher>Шифр, используемый, когда сервер не поддерживает согласование шифров (OpenVPN --data-ciphers-fallback).
authstringSHA256MD5 | SHA1 | SHA256 | SHA384 | SHA512HMAC-дайджест (OpenVPN --auth), например SHA256. Он же задаёт HMAC-дайджест tls-auth.
comp-lzostring(unset)yes | no | adaptiveНастройка сжатия LZO.
castring(required)<inline PEM>Сертификат CA (инлайновый PEM-блок).
certstring(unset)<inline PEM>Клиентский сертификат (инлайновый PEM-блок).
keystring(unset)<inline PEM>Закрытый ключ клиента (инлайновый PEM-блок).
tls-authstring(unset)<inline static key>Инлайновый блок OpenVPN Static key V1 для HMAC-защиты управляющего канала (tls-auth). Взаимоисключим с tls-crypt и tls-crypt-v2. HMAC-дайджест следует auth.
key-directionstring(bidirectional)0 | 1Направление ключа для tls-auth. 0 / 1 выбирают направленные слоты ключа; без значения один и тот же ключ используется в обоих направлениях.
tls-cryptstring(unset)<inline static key>Статический ключ tls-crypt для шифрования/аутентификации управляющего канала.
tls-crypt-v2string(unset)<inline PEM client key>Инлайновый клиентский ключ tls-crypt-v2 в PEM-кодировке. Взаимоисключим с tls-auth и tls-crypt.
usernamestring(unset)<string>Имя пользователя auth-user-pass.
passwordstring(unset)<string>Пароль auth-user-pass.
peer-infomap[string]string{}{<key>: <value>}Дополнительные пары ключ/значение peer-info (например, IV_HWADDR, UV_*), добавляемые к встроенным записям IV_*, отправляемым при обмене ключами. Запись IV_VER заменяет встроенную строку версии.
pingint(unset)<seconds>Интервал keepalive-пингов (в секундах).
ping-restartint(unset)<seconds>Перезапустить туннель после стольких секунд без пинга (в секундах).
tran-window*int3600<seconds>Сколько секунд старый ключ данных остаётся пригодным после смены ключей (OpenVPN --tran-window). Если не задано — 3600; явный 0 сразу аннулирует старый ключ. Согласуйте с --tran-window сервера. Отрицательные значения отклоняются.
handshake-timeoutint0 (no limit)<seconds>Прервать установление туннеля, если рукопожатие OpenVPN занимает дольше этого числа секунд. 0 отключает тайм-аут.
mtuint1500<integer>MTU туннеля.
udpboolfalsetrue | falseРазрешить UDP-трафик через прокси.
ip-stackIPStackOption(auto)IPStackOptionIP-стек в пользовательском пространстве для туннеля: { mode: auto|gvisor|mips, congestion-controller: cubic|reno|bbr|bbr3 } — тот же блок, что ip-stack у WireGuard.
remote-dns-resolveboolfalsetrue | falseРазрешать имена назначения через DNS туннеля.
dns[]string[][<server>]DNS-серверы, используемые для туннеля.

Исходный код: adapter/outbound/openvpn.go:40-73 · зафиксировано на v1.19.31 (ab405ba)

Примеры ​

Исходящее — аутентификация по сертификату:

yaml
proxies:
  - name: ovpn-cert
    type: openvpn
    server: vpn.example.com
    port: 1194
    proto: udp
    cipher: AES-256-GCM
    auth: SHA256
    ca: |
      -----BEGIN CERTIFICATE-----
      <ca-certificate>
      -----END CERTIFICATE-----
    cert: |
      -----BEGIN CERTIFICATE-----
      <client-certificate>
      -----END CERTIFICATE-----
    key: |
      -----BEGIN PRIVATE KEY-----
      <client-private-key>
      -----END PRIVATE KEY-----
    udp: true

Исходящее — аутентификация по имени пользователя и паролю с keepalive:

yaml
proxies:
  - name: ovpn-userpass
    type: openvpn
    server: vpn.example.com
    port: 1194
    proto: tcp
    ca: |
      -----BEGIN CERTIFICATE-----
      <ca-certificate>
      -----END CERTIFICATE-----
    username: <username>
    password: <password>
    ping: 10
    ping-restart: 60
    udp: true

Примечания ​

  • proto выбирает транспорт канала: udp (по умолчанию) или tcp.
  • Выбор шифра канала данных следует семантике OpenVPN 2.5+: data-ciphers — предложение для согласования (отправляется как IV_CIPHERS), и согласованным становится первый присланный сервером шифр, который в нём также присутствует. data-ciphers-fallback покрывает серверы, не умеющие согласовывать. Когда data-ciphers не задан, используется одиночное значение cipher (по умолчанию AES-128-GCM).
  • ca обязателен. cert + key дают аутентификацию по сертификату; username + password — аутентификацию auth-user-pass. Их можно сочетать, когда сервер требует и то и другое. Весь ключевой материал задаётся инлайн (блочный скаляр YAML) — файлы по путям не читаются.
  • Три обёртки управляющего канала взаимоисключающие: tls-auth (HMAC-аутентифицирует управляющий канал; сочетайте с key-direction: 0|1 для направленных ключей), tls-crypt (шифрует и аутентифицирует его общим статическим ключом) и tls-crypt-v2 (индивидуальный для клиента обёрнутый ключ, задаваемый инлайновым клиентским PEM-ключом).
  • HMAC tls-auth, как и в самом OpenVPN, использует дайджест auth (по умолчанию SHA256). Если сервер работает с умолчанием OpenVPN auth SHA1, явно задайте auth: SHA1.
  • peer-info добавляет пользовательские пары ключ/значение (например, IV_HWADDR, UV_*) после встроенных записей IV_VER / IV_PROTO / IV_CIPHERS, которые клиент отправляет при обмене ключами. Пользовательский IV_VER заменяет встроенное значение; IV_PROTO / IV_CIPHERS всегда генерируются автоматически и не переопределяются.
  • handshake-timeout ограничивает время установления туннеля; 0 (по умолчанию) означает ждать неограниченно.
  • ping отправляет keepalive с заданным интервалом; ping-restart разрывает туннель после указанного числа секунд без принятых пакетов, чтобы он мог быть установлен заново. Оба выражаются в секундах.
  • tran-window сохраняет предыдущий ключ данных в течение указанного числа секунд после смены ключей, чтобы пакеты в пути ещё расшифровывались; оставьте поле незаданным (3600 с), если на сервере не задан нестандартный --tran-window.
  • mtu задаёт MTU туннеля; значение по умолчанию — 1500.
  • remote-dns-resolve направляет разрешение имён назначения через туннель, используя серверы из dns; не действует, пока dns пуст.

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

  • Xray-core не поддерживает OpenVPN — чтобы связать конечную точку OpenVPN с Xray, пришлось бы запустить отдельный клиент OpenVPN и направить на него входящее socks/http или TUN. sing-box реализует OpenVPN в виде конечных точек, а не исходящего (openvpn-client и openvpn-server, совместимые со стандартными узлами OpenVPN), а также DNS-сервер openvpn, использующий DNS-параметры, которые передаёт сервер. См. OpenVPN — sing-box.

Исходный код: adapter/outbound/openvpn.go:40-73 · v1.19.31 (ab405ba)

Core Tutorial от Argsment