OpenVPN — mihomo
mihomo может подключаться к серверу OpenVPN как к исходящему, запуская клиент в пользовательском пространстве, который поднимает устройство стека типа tun и направляет совпавший трафик через шифрованный туннель. Управляющий канал аутентифицируется сертификатами (ca / cert / key), необязательным tls-crypt и/или учётными данными auth-user-pass; канал данных шифруется согласованным cipher.
Исходящий
Запись в proxies: с type: openvpn. Встраивает BasicOption (общие поля исходящих).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
server | string | (required) | <host> | Хост/IP сервера OpenVPN. |
port | int | (required) | <port> | Порт сервера. |
proto | string | udp | udp | tcp | Транспортный протокол туннеля OpenVPN. |
dev | string | tun | tun | Тип виртуального устройства (например, `tun`). |
cipher | string | AES-128-GCM | AES-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-fallback | string | (unset) | <cipher> | Шифр, используемый, когда сервер не поддерживает согласование шифров (OpenVPN `--data-ciphers-fallback`). |
auth | string | SHA256 | MD5 | SHA1 | SHA256 | SHA384 | SHA512 | HMAC-дайджест управляющего канала, например `SHA256`. |
comp-lzo | string | (unset) | yes | no | adaptive | Настройка сжатия LZO. |
ca | string | (required) | <inline PEM> | Сертификат CA (инлайновый PEM-блок). |
cert | string | (unset) | <inline PEM> | Клиентский сертификат (инлайновый PEM-блок). |
key | string | (unset) | <inline PEM> | Закрытый ключ клиента (инлайновый PEM-блок). |
tls-auth | string | (unset) | <inline static key> | Инлайновый блок `OpenVPN Static key V1` для HMAC-защиты управляющего канала (tls-auth). Взаимоисключим с `tls-crypt` и `tls-crypt-v2`. |
key-direction | string | (bidirectional) | 0 | 1 | Направление ключа для `tls-auth`. `0` / `1` выбирают направленные слоты ключа; без значения один и тот же ключ используется в обоих направлениях. |
tls-crypt | string | (unset) | <inline static key> | Статический ключ tls-crypt для шифрования/аутентификации управляющего канала. |
tls-crypt-v2 | string | (unset) | <inline PEM client key> | Инлайновый клиентский ключ tls-crypt-v2 в PEM-кодировке. Взаимоисключим с `tls-auth` и `tls-crypt`. |
username | string | (unset) | <string> | Имя пользователя auth-user-pass. |
password | string | (unset) | <string> | Пароль auth-user-pass. |
peer-info | map[string]string | {} | {<key>: <value>} | Дополнительные пары ключ/значение peer-info (например, `IV_HWADDR`, `UV_*`), добавляемые к встроенным записям `IV_*`, отправляемым при обмене ключами. |
ping | int | (unset) | <seconds> | Интервал keepalive-пингов (в секундах). |
ping-restart | int | (unset) | <seconds> | Перезапустить туннель после стольких секунд без пинга (в секундах). |
handshake-timeout | int | 0 (no limit) | <seconds> | Прервать установление туннеля, если рукопожатие OpenVPN занимает дольше этого числа секунд. 0 отключает тайм-аут. |
mtu | int | 1500 | <integer> | MTU туннеля. |
udp | bool | false | true | false | Разрешить UDP-трафик через прокси. |
remote-dns-resolve | bool | false | true | 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)
