HTTP & SOCKS — mihomo
mihomo делит входящую сторону на три типа слушателей — http, socks и mixed (HTTP+SOCKS на одном порту) — каждый со своей Go-структурой. Исходящие остаются раздельными: type: http и type: socks5. TLS поддерживается в каждом варианте через поля сертификатов слушателя.
Исходящий HTTP
Запись в proxies: с type: http. Встраивает BasicOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
server | string | (required) | <host> | Хост вышестоящего HTTP-прокси. |
port | int | (required) | <port> | Порт вышестоящего сервера. |
username | string | (unset) | <string> | Имя пользователя HTTP Basic-аутентификации. |
password | string | (unset) | <string> | Пароль HTTP Basic-аутентификации. |
tls | bool | false | true | false | Обернуть соединение с вышестоящим сервером в TLS (HTTPS-прокси). |
sni | string | (server) | <SNI> | TLS Server Name Indication (SNI). |
skip-cert-verify | bool | false | true | false | Отключить проверку TLS (только для тестов). |
name-cert-verify | string | (unset) | <hostname> | Проверять сертификат сервера по этому имени хоста вместо SNI. |
fingerprint | string | (unset) | <SHA256 hex> | Зафиксировать отпечаток TLS-сертификата сервера. |
certificate | string | (unset) | <PEM file path> | Клиентский сертификат (mTLS). |
private-key | string | (unset) | <key file path> | Закрытый ключ для `certificate`. |
headers | map[string]string | {} | {<header>: <value>} | Дополнительные HTTP-заголовки, добавляемые к каждому запросу. |
Исходный код: adapter/outbound/http.go:28-43 · зафиксировано на v1.19.29 (e26714a)
Исходящий SOCKS5
Запись в proxies: с type: socks5. Встраивает BasicOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
server | string | (required) | <host> | Хост вышестоящего SOCKS-сервера. |
port | int | (required) | <port> | Порт вышестоящего сервера. |
username | string | (unset) | <string> | Имя пользователя SOCKS5. |
password | string | (unset) | <string> | Пароль SOCKS5. |
tls | bool | false | true | false | Обернуть SOCKS-соединение в TLS. |
udp | bool | false | true | false | Включить SOCKS5 UDP-associate. |
skip-cert-verify | bool | false | true | false | Отключить проверку TLS (только для тестов). |
name-cert-verify | string | (unset) | <hostname> | Проверять сертификат сервера по этому имени хоста вместо SNI. |
fingerprint | string | (unset) | <SHA256 hex> | Зафиксировать отпечаток TLS-сертификата сервера. |
certificate | string | (unset) | <PEM file path> | Клиентский сертификат (mTLS). |
private-key | string | (unset) | <key file path> | Закрытый ключ для `certificate`. |
Исходный код: adapter/outbound/socks5.go:30-44 · зафиксировано на v1.19.29 (e26714a)
Входящий HTTP
Запись в listeners: с type: http. Встраивает BaseOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
users | AuthUsers | [] | <AuthUsers> | Допущенные пользователи. Каждая запись — строка `user:pass`. |
certificate | string | (unset) | <PEM file path> | Необязательный TLS-сертификат (HTTPS-прокси). Используется в паре с `private-key`. |
private-key | string | (unset) | <key file path> | Закрытый TLS-ключ. |
client-auth-type | string | (none) | no-client-cert | request-client-cert | require-any-client-cert | verify-client-cert-if-given | require-and-verify-client-cert | Режим клиентской аутентификации mTLS. |
client-auth-cert | string | (unset) | <PEM file path> | Набор CA-сертификатов, принимаемых как корневые для клиентов. |
ech-key | string | (unset) | <ECH config> | Ключевой материал Encrypted Client Hello. |
reality-config | RealityConfig | (disabled) | RealityConfig | Серверная конфигурация REALITY. |
Исходный код: listener/inbound/http.go:14-23 · зафиксировано на v1.19.29 (e26714a)
Входящий SOCKS
Запись в listeners: с type: socks. Встраивает BaseOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
users | AuthUsers | [] | <AuthUsers> | Допущенные пользователи. |
udp | bool | false | true | false | Включить SOCKS5 UDP-associate. |
certificate | string | (unset) | <PEM file path> | Необязательный TLS-сертификат. |
private-key | string | (unset) | <key file path> | Закрытый TLS-ключ. |
client-auth-type | string | (none) | <see HTTP> | Как у входящего HTTP. |
client-auth-cert | string | (unset) | <PEM file path> | Как у входящего HTTP. |
ech-key | string | (unset) | <ECH config> | Ключевой материал Encrypted Client Hello. |
reality-config | RealityConfig | (disabled) | RealityConfig | Серверная конфигурация REALITY. |
Исходный код: listener/inbound/socks.go:14-24 · зафиксировано на v1.19.29 (e26714a)
Входящий Mixed (HTTP + SOCKS)
Запись в listeners: с type: mixed. Мультиплексирует HTTP и SOCKS5 на одном порту — первый байт клиентского запроса определяет, какая половина обработает соединение.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
users | AuthUsers | [] | <AuthUsers> | Допущенные пользователи (общие для HTTP- и SOCKS-половин). |
udp | bool | false | true | false | Включить SOCKS5 UDP-associate на SOCKS-половине. |
certificate | string | (unset) | <PEM file path> | Необязательный TLS-сертификат. |
private-key | string | (unset) | <key file path> | Закрытый TLS-ключ. |
client-auth-type | string | (none) | <see HTTP> | Как у входящего HTTP. |
client-auth-cert | string | (unset) | <PEM file path> | Как у входящего HTTP. |
ech-key | string | (unset) | <ECH config> | Ключевой материал Encrypted Client Hello. |
reality-config | RealityConfig | (disabled) | RealityConfig | Серверная конфигурация REALITY. |
Исходный код: listener/inbound/mixed.go:15-25 · зафиксировано на v1.19.29 (e26714a)
Примеры
Исходящее HTTP:
proxies:
- name: http-upstream
type: http
server: upstream.example.com
port: 8080
username: alice
password: <password>
tls: true
sni: upstream.example.comИсходящее SOCKS5 с UDP:
proxies:
- name: socks-upstream
type: socks5
server: upstream.example.com
port: 1080
username: alice
password: <password>
udp: trueВходящее mixed для клиентских устройств:
listeners:
- name: client-mixed
type: mixed
listen: 127.0.0.1
port: 7890
users:
- alice:<password>
udp: trueВходящее HTTPS-прокси (HTTP поверх TLS):
listeners:
- name: https-proxy
type: http
listen: 0.0.0.0
port: 8443
users:
- alice:<password>
certificate: /etc/mihomo/server.crt
private-key: /etc/mihomo/server.keyПримечания
users:здесь — список строкuser:pass, а не массив структурированных объектов. Разделитель:обязателен. Пустой список отключает аутентификацию.- Слушатель
mixedпринимает и HTTP, и SOCKS5 на одном порту; выбор делается определением по первому байту в слушателе. - Верхнеуровневые сокращения (
port,socks-port,mixed-portв корневомRawConfig) — альтернативный способ объявить слушатели без аутентификации; они не проходят черезlisteners[]. Выбирайте один подход на каждое входящее. - Верхнеуровневый список
authenticationв mihomo (см. Основы) применяется к каждому легаси-порту (port,socks-port,mixed-port), но не к записямlisteners:— у тех есть собственное полеusers.
Сравнение с другими ядрами
- Xray-core держит HTTP и SOCKS в отдельных исходных файлах, использует
accounts[](каждый —{user, pass}) и не имеет встроенного входящего «mixed». См. HTTP & SOCKS — Xray-core. - sing-box тоже предлагает входящее
mixed, гдеusers[]несёт структурированные объекты{username, password}. Имена полей — в snake_case. См. HTTP & SOCKS — sing-box.
Исходный код: adapter/outbound/http.go:28-43 · v1.19.29 (e26714a)
