Skip to content

HTTP & SOCKS — mihomo

mihomo делит входящую сторону на три типа слушателей — http, socks и mixed (HTTP+SOCKS на одном порту) — каждый со своей Go-структурой. Исходящие остаются раздельными: type: http и type: socks5. TLS поддерживается в каждом варианте через поля сертификатов слушателя.

Исходящий HTTP

Запись в proxies: с type: http. Встраивает BasicOption.

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Хост вышестоящего HTTP-прокси.
portint(required)<port>Порт вышестоящего сервера.
usernamestring(unset)<string>Имя пользователя HTTP Basic-аутентификации.
passwordstring(unset)<string>Пароль HTTP Basic-аутентификации.
tlsboolfalsetrue | falseОбернуть соединение с вышестоящим сервером в TLS (HTTPS-прокси).
snistring(server)<SNI>TLS Server Name Indication (SNI).
skip-cert-verifyboolfalsetrue | falseОтключить проверку TLS (только для тестов).
name-cert-verifystring(unset)<hostname>Проверять сертификат сервера по этому имени хоста вместо SNI.
fingerprintstring(unset)<SHA256 hex>Зафиксировать отпечаток TLS-сертификата сервера.
certificatestring(unset)<PEM file path>Клиентский сертификат (mTLS).
private-keystring(unset)<key file path>Закрытый ключ для `certificate`.
headersmap[string]string{}{<header>: <value>}Дополнительные HTTP-заголовки, добавляемые к каждому запросу.

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

Исходящий SOCKS5

Запись в proxies: с type: socks5. Встраивает BasicOption.

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Хост вышестоящего SOCKS-сервера.
portint(required)<port>Порт вышестоящего сервера.
usernamestring(unset)<string>Имя пользователя SOCKS5.
passwordstring(unset)<string>Пароль SOCKS5.
tlsboolfalsetrue | falseОбернуть SOCKS-соединение в TLS.
udpboolfalsetrue | falseВключить SOCKS5 UDP-associate.
skip-cert-verifyboolfalsetrue | falseОтключить проверку TLS (только для тестов).
name-cert-verifystring(unset)<hostname>Проверять сертификат сервера по этому имени хоста вместо SNI.
fingerprintstring(unset)<SHA256 hex>Зафиксировать отпечаток TLS-сертификата сервера.
certificatestring(unset)<PEM file path>Клиентский сертификат (mTLS).
private-keystring(unset)<key file path>Закрытый ключ для `certificate`.

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

Входящий HTTP

Запись в listeners: с type: http. Встраивает BaseOption.

ПолеТипПо умолчаниюДопустимые значенияОписание
usersAuthUsers[]<AuthUsers>Допущенные пользователи. Каждая запись — строка `user:pass`.
certificatestring(unset)<PEM file path>Необязательный TLS-сертификат (HTTPS-прокси). Используется в паре с `private-key`.
private-keystring(unset)<key file path>Закрытый TLS-ключ.
client-auth-typestring(none)no-client-cert | request-client-cert | require-any-client-cert | verify-client-cert-if-given | require-and-verify-client-certРежим клиентской аутентификации mTLS.
client-auth-certstring(unset)<PEM file path>Набор CA-сертификатов, принимаемых как корневые для клиентов.
ech-keystring(unset)<ECH config>Ключевой материал Encrypted Client Hello.
reality-configRealityConfig(disabled)RealityConfigСерверная конфигурация REALITY.

Исходный код: listener/inbound/http.go:14-23 · зафиксировано на v1.19.29 (e26714a)

Входящий SOCKS

Запись в listeners: с type: socks. Встраивает BaseOption.

ПолеТипПо умолчаниюДопустимые значенияОписание
usersAuthUsers[]<AuthUsers>Допущенные пользователи.
udpboolfalsetrue | falseВключить SOCKS5 UDP-associate.
certificatestring(unset)<PEM file path>Необязательный TLS-сертификат.
private-keystring(unset)<key file path>Закрытый TLS-ключ.
client-auth-typestring(none)<see HTTP>Как у входящего HTTP.
client-auth-certstring(unset)<PEM file path>Как у входящего HTTP.
ech-keystring(unset)<ECH config>Ключевой материал Encrypted Client Hello.
reality-configRealityConfig(disabled)RealityConfigСерверная конфигурация REALITY.

Исходный код: listener/inbound/socks.go:14-24 · зафиксировано на v1.19.29 (e26714a)

Входящий Mixed (HTTP + SOCKS)

Запись в listeners: с type: mixed. Мультиплексирует HTTP и SOCKS5 на одном порту — первый байт клиентского запроса определяет, какая половина обработает соединение.

ПолеТипПо умолчаниюДопустимые значенияОписание
usersAuthUsers[]<AuthUsers>Допущенные пользователи (общие для HTTP- и SOCKS-половин).
udpboolfalsetrue | falseВключить SOCKS5 UDP-associate на SOCKS-половине.
certificatestring(unset)<PEM file path>Необязательный TLS-сертификат.
private-keystring(unset)<key file path>Закрытый TLS-ключ.
client-auth-typestring(none)<see HTTP>Как у входящего HTTP.
client-auth-certstring(unset)<PEM file path>Как у входящего HTTP.
ech-keystring(unset)<ECH config>Ключевой материал Encrypted Client Hello.
reality-configRealityConfig(disabled)RealityConfigСерверная конфигурация REALITY.

Исходный код: listener/inbound/mixed.go:15-25 · зафиксировано на v1.19.29 (e26714a)

Примеры

Исходящее HTTP:

yaml
proxies:
  - name: http-upstream
    type: http
    server: upstream.example.com
    port: 8080
    username: alice
    password: <password>
    tls: true
    sni: upstream.example.com

Исходящее SOCKS5 с UDP:

yaml
proxies:
  - name: socks-upstream
    type: socks5
    server: upstream.example.com
    port: 1080
    username: alice
    password: <password>
    udp: true

Входящее mixed для клиентских устройств:

yaml
listeners:
  - name: client-mixed
    type: mixed
    listen: 127.0.0.1
    port: 7890
    users:
      - alice:<password>
    udp: true

Входящее HTTPS-прокси (HTTP поверх TLS):

yaml
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)

Core Tutorial от Argsment