Skip to content

AnyTLS — mihomo

mihomo поддерживает AnyTLS с обеих сторон, следуя стандартным конвенциям mihomo (без cipher; исходящее несёт настройки TLS / ECH / uTLS на верхнем уровне).

Исходящий

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

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Имя хоста или IP вышестоящего сервера.
portint(required)<port>Порт вышестоящего сервера.
passwordstring(required)<string>Пароль сервера.
alpn[]string[]h2 | http/1.1Список ALPN, предлагаемый при TLS-рукопожатии.
snistring(server)<SNI>TLS Server Name Indication (SNI).
ech-optsECHOptions(disabled)ECHOptionsКонфигурация Encrypted Client Hello.
shadow-tls-optsShadowTLSOptions(disabled)ShadowTLSOptionsБлок камуфляжа Shadow-TLS (`{ password, version }`). На один прокси может быть включён только один блок TLS-камуфляжа.
restls-optsRestlsOptions(disabled)RestlsOptionsБлок камуфляжа Restls (`{ password, version-hint, restls-script }`). На один прокси может быть включён только один блок TLS-камуфляжа.
jls-optsJLSOptions(disabled)JLSOptionsБлок камуфляжа JLS (`{ username, password }`). На один прокси может быть включён только один блок TLS-камуфляжа.
client-fingerprintstring(global)chrome | firefox | safari | ios | edge | random | randomizedОтпечаток client hello uTLS.
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`.
udpboolfalsetrue | falseРазрешить ретрансляцию UDP-пакетов через это исходящее.
idle-session-check-intervalint0<seconds>Интервал сканирования пула сессий. 0 оставляет значение по умолчанию.
idle-session-timeoutint0<seconds>Сессии, простаивающие дольше этого числа секунд, утилизируются. 0 оставляет значение по умолчанию.
min-idle-sessionint0<int>Минимум «тёплых» сессий, удерживаемых в пуле.
disable-reuseboolfalsetrue | falseНе пулить простаивающие сессии — открывать новую сессию AnyTLS для каждого потока и закрывать её после.

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

Входящий

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

ПолеТипПо умолчаниюДопустимые значенияОписание
usersmap[string]string{}{<username>: <password>}Таблица пользователей — имя пользователя → пароль.
certificatestring(required)<PEM file path>TLS-сертификат сервера.
private-keystring(required)<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.
shadow-tlsShadowTLS(disabled)ShadowTLSСерверный блок камуфляжа Shadow-TLS (`{ enable, version, password, users, handshake, ... }`).
res-tlsResTLS(disabled)ResTLSСерверный блок камуфляжа Restls (`{ enable, dest, password, ... }`); неаутентифицированные клиенты ретранслируются на `dest`.
jls-configJLSConfig(disabled)JLSConfigСерверный блок камуфляжа JLS (`{ enable, users, sni, dest, ... }`); неаутентифицированные клиенты ретранслируются на `dest`.
allow-insecureboolfalsetrue | falseПропустить проверку клиентского TLS-сертификата на слушателе (только для тестов).
padding-schemestring(server default)<scheme>Пользовательская схема дополнения. Одна строка; формат — по спецификации протокола в апстриме.

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

Примеры

Исходящее:

yaml
proxies:
  - name: anytls
    type: anytls
    server: example.com
    port: 443
    password: <password>
    sni: example.com
    alpn: [h2, http/1.1]
    udp: true
    client-fingerprint: chrome
    idle-session-check-interval: 30
    idle-session-timeout: 60
    min-idle-session: 4

Входящее:

yaml
listeners:
  - name: anytls-in
    type: anytls
    listen: 0.0.0.0
    port: 443
    users:
      alice: <alice-password>
      bob: <bob-password>
    certificate: /etc/mihomo/server.crt
    private-key: /etc/mihomo/server.key

Примечания

  • mihomo использует секунды для трёх тайм-аутов пула сессий; sing-box для тех же полей использует строки длительности ("30s"). Написание имён полей тоже различается — здесь kebab-case, там snake_case.
  • users: — YAML-отображение «имя пользователя → пароль», по образцу входящих TUIC и Hysteria2 в mihomo.
  • Исходящее mihomo несёт настройки TLS, ECH и uTLS-отпечатка инлайн. sing-box помещает их во встроенный блок tls:.
  • shadow-tls-opts, restls-opts и jls-opts — взаимоисключающие режимы TLS-камуфляжа; включайте не более одного. Входящие аналоги shadow-tls, res-tls и jls-config так же взаимоисключающие.
  • disable-reuse полностью отключает пул простаивающих сессий; три настройки idle-session-* / min-idle-session тогда не действуют.

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

  • Xray-core не поддерживает AnyTLS. См. AnyTLS — Xray-core.
  • sing-box использует имена полей в snake_case, принимает строки длительности в стиле Go для тайм-аутов пула сессий и перечисляет пользователей массивом [{name, password}]. См. AnyTLS — sing-box.

Исходный код: adapter/outbound/anytls.go:27-50 · v1.19.29 (e26714a)

Core Tutorial от Argsment