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-дайджест управляющего канала, например `SHA256`.
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`.
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_*`, отправляемым при обмене ключами.
pingint(unset)<seconds>Интервал keepalive-пингов (в секундах).
ping-restartint(unset)<seconds>Перезапустить туннель после стольких секунд без пинга (в секундах).
handshake-timeoutint0 (no limit)<seconds>Прервать установление туннеля, если рукопожатие OpenVPN занимает дольше этого числа секунд. 0 отключает тайм-аут.
mtuint1500<integer>MTU туннеля.
udpboolfalsetrue | falseРазрешить UDP-трафик через прокси.
remote-dns-resolveboolfalsetrue | falseРазрешать имена назначения через DNS туннеля.
dns[]string[][<server>]DNS-серверы, используемые для туннеля.

Исходный код: adapter/outbound/openvpn.go:42-72 · зафиксировано на v1.19.29 (e26714a)

Примеры

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

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-ключом).
  • peer-info добавляет пользовательские пары ключ/значение (например, IV_HWADDR, UV_*) после встроенных записей IV_VER / IV_PROTO / IV_CIPHERS, которые клиент отправляет при обмене ключами.
  • handshake-timeout ограничивает время установления туннеля; 0 (по умолчанию) означает ждать неограниченно.
  • ping отправляет keepalive с заданным интервалом; ping-restart разрывает туннель после указанного числа секунд без принятых пакетов, чтобы он мог быть установлен заново. Оба выражаются в секундах.
  • mtu задаёт MTU туннеля; значение по умолчанию — 1500.
  • remote-dns-resolve направляет разрешение имён назначения через туннель, используя серверы из dns; не действует, пока dns пуст.

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

  • OpenVPN среди этих трёх ядер специфичен для mihomo. Ни Xray-core, ни sing-box не поставляют исходящий OpenVPN — чтобы связать конечную точку OpenVPN с этими ядрами, пришлось бы запустить отдельный клиент OpenVPN и направить на него входящее socks/http или TUN.

Исходный код: adapter/outbound/openvpn.go:42-72 · v1.19.29 (e26714a)

Core Tutorial от Argsment