AnyTLS — mihomo
mihomo поддерживает AnyTLS с обеих сторон, следуя стандартным конвенциям mihomo (без cipher; исходящее несёт настройки TLS / ECH / uTLS на верхнем уровне).
Исходящий
Запись в proxies: с type: anytls. Встраивает BasicOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. |
server | string | (required) | <host> | Имя хоста или IP вышестоящего сервера. |
port | int | (required) | <port> | Порт вышестоящего сервера. |
password | string | (required) | <string> | Пароль сервера. |
alpn | []string | [] | h2 | http/1.1 | Список ALPN, предлагаемый при TLS-рукопожатии. |
sni | string | (server) | <SNI> | TLS Server Name Indication (SNI). |
ech-opts | ECHOptions | (disabled) | ECHOptions | Конфигурация Encrypted Client Hello. |
shadow-tls-opts | ShadowTLSOptions | (disabled) | ShadowTLSOptions | Блок камуфляжа Shadow-TLS (`{ password, version }`). На один прокси может быть включён только один блок TLS-камуфляжа. |
restls-opts | RestlsOptions | (disabled) | RestlsOptions | Блок камуфляжа Restls (`{ password, version-hint, restls-script }`). На один прокси может быть включён только один блок TLS-камуфляжа. |
jls-opts | JLSOptions | (disabled) | JLSOptions | Блок камуфляжа JLS (`{ username, password }`). На один прокси может быть включён только один блок TLS-камуфляжа. |
client-fingerprint | string | (global) | chrome | firefox | safari | ios | edge | random | randomized | Отпечаток client hello uTLS. |
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`. |
udp | bool | false | true | false | Разрешить ретрансляцию UDP-пакетов через это исходящее. |
idle-session-check-interval | int | 0 | <seconds> | Интервал сканирования пула сессий. 0 оставляет значение по умолчанию. |
idle-session-timeout | int | 0 | <seconds> | Сессии, простаивающие дольше этого числа секунд, утилизируются. 0 оставляет значение по умолчанию. |
min-idle-session | int | 0 | <int> | Минимум «тёплых» сессий, удерживаемых в пуле. |
disable-reuse | bool | false | true | false | Не пулить простаивающие сессии — открывать новую сессию AnyTLS для каждого потока и закрывать её после. |
Исходный код: adapter/outbound/anytls.go:27-50 · зафиксировано на v1.19.29 (e26714a)
Входящий
Запись в listeners: с type: anytls. Встраивает BaseOption.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
users | map[string]string | {} | {<username>: <password>} | Таблица пользователей — имя пользователя → пароль. |
certificate | string | (required) | <PEM file path> | TLS-сертификат сервера. |
private-key | string | (required) | <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. |
shadow-tls | ShadowTLS | (disabled) | ShadowTLS | Серверный блок камуфляжа Shadow-TLS (`{ enable, version, password, users, handshake, ... }`). |
res-tls | ResTLS | (disabled) | ResTLS | Серверный блок камуфляжа Restls (`{ enable, dest, password, ... }`); неаутентифицированные клиенты ретранслируются на `dest`. |
jls-config | JLSConfig | (disabled) | JLSConfig | Серверный блок камуфляжа JLS (`{ enable, users, sni, dest, ... }`); неаутентифицированные клиенты ретранслируются на `dest`. |
allow-insecure | bool | false | true | false | Пропустить проверку клиентского TLS-сертификата на слушателе (только для тестов). |
padding-scheme | string | (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)
