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-дайджест (OpenVPN --auth), например SHA256. Он же задаёт HMAC-дайджест tls-auth. |
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. HMAC-дайджест следует auth. |
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_*, отправляемым при обмене ключами. Запись IV_VER заменяет встроенную строку версии. |
ping | int | (unset) | <seconds> | Интервал keepalive-пингов (в секундах). |
ping-restart | int | (unset) | <seconds> | Перезапустить туннель после стольких секунд без пинга (в секундах). |
tran-window | *int | 3600 | <seconds> | Сколько секунд старый ключ данных остаётся пригодным после смены ключей (OpenVPN --tran-window). Если не задано — 3600; явный 0 сразу аннулирует старый ключ. Согласуйте с --tran-window сервера. Отрицательные значения отклоняются. |
handshake-timeout | int | 0 (no limit) | <seconds> | Прервать установление туннеля, если рукопожатие OpenVPN занимает дольше этого числа секунд. 0 отключает тайм-аут. |
mtu | int | 1500 | <integer> | MTU туннеля. |
udp | bool | false | true | false | Разрешить UDP-трафик через прокси. |
ip-stack | IPStackOption | (auto) | IPStackOption | IP-стек в пользовательском пространстве для туннеля: { mode: auto|gvisor|mips, congestion-controller: cubic|reno|bbr|bbr3 } — тот же блок, что ip-stack у WireGuard. |
remote-dns-resolve | bool | false | true | 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). Если сервер работает с умолчанием OpenVPNauth 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)
