Skip to content

TUIC — mihomo

mihomo поддерживает и TUIC v4 (на токенах), и TUIC v5 (UUID+пароль) с обеих сторон. Входящее можно объявить двумя способами: стандартной записью в listeners: или верхнеуровневым блоком tuic-server.

Исходящий

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

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси.
serverstring(required)<host>Имя хоста или IP вышестоящего сервера.
portint(required)<port>Порт вышестоящего сервера.
tokenstring(unset)<string>Устаревший токен TUIC v4. Взаимоисключим с `uuid`+`password` (v5).
uuidstring(required for v5)<UUID>UUID пользователя (TUIC v5).
passwordstring(required for v5)<string>Пароль пользователя (TUIC v5).
ipstring(unset)<host>Переопределить IP назначения после разрешения имени. Используется, когда SNI / сертификат относятся к имени, не совпадающему с фактическим IP сервера.
heartbeat-intervalint10000<milliseconds>Интервал heartbeat QUIC. **Миллисекунды**, не секунды.
alpn[]string[h3]h3Список ALPN. TUIC требует ALPN HTTP/3.
reduce-rttboolfalsetrue | falseИспользовать рукопожатие 0-RTT при переподключении.
request-timeoutint8000<milliseconds>Тайм-аут ответа сервера на кадр connect. В миллисекундах.
udp-relay-modestringnativenative | quicСпособ туннелирования UDP-пакетов. `native` (датаграммы) быстрее; `quic` (поток на каждый пакет) проходит через промежуточные узлы, блокирующие датаграммы.
congestion-controllerstringcubiccubic | new_reno | bbr | bbr_meta_v1 | bbr_meta_v2Контроллер перегрузки QUIC. `bbr` — BBR v2 в mihomo. `bbr_meta_v1`/`bbr_meta_v2` сохраняют старые варианты для взаимной совместимости.
disable-sniboolfalsetrue | falseПолностью убрать расширение SNI из TLS Client Hello.
max-udp-relay-packet-sizeint1252<bytes>Максимальный размер UDP-полезной нагрузки до фрагментации.
fast-openboolfalsetrue | falseОтправлять кадр прокси-запроса в одном флайте с QUIC-рукопожатием.
max-open-streamsint100<int>Максимум одновременных потоков на QUIC-соединение.
cwndint32<int>Начальное окно перегрузки в пакетах. По умолчанию 32 (`transport/tuic/common/congestion.go:17-19`).
bbr-profilestring(unset)default | aggressiveПрофиль настройки BBR при `congestion-controller: bbr`.
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`.
recv-window-connint0<bytes>Начальное окно приёма на соединение. 0 оставляет значение quic-go по умолчанию.
recv-windowint0<bytes>Начальное окно приёма на поток. 0 оставляет значение quic-go по умолчанию.
disable-mtu-discoveryboolfalsetrue | falseПропустить обнаружение MTU пути; полезно в сетях, отбрасывающих зонды.
max-datagram-frame-sizeint1252<bytes>Максимальный размер кадра QUIC-датаграммы.
snistring(server)<SNI>TLS Server Name Indication (SNI).
ech-optsECHOptions(disabled)ECHOptionsКонфигурация Encrypted Client Hello.
udp-over-streamboolfalsetrue | falseИспользовать кадрирование UDP-over-stream вместо QUIC-датаграмм.
udp-over-stream-versionint11Версия кадрирования. Сейчас определена только 1.

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

Входящий (в listeners)

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

ПолеТипПо умолчаниюДопустимые значенияОписание
token[]string[][<string>]Список устаревших токенов TUIC v4. Пустой список отключает v4.
usersmap[string]string{}{<uuid>: <password>}Таблица пользователей TUIC v5. Ключи — UUID, значения — пароли.
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.
congestion-controllerstringcubiccubic | new_reno | bbr | bbr_meta_v1 | bbr_meta_v2Контроллер перегрузки QUIC на стороне сервера.
max-idle-timeint0<milliseconds>Тайм-аут простоя QUIC-соединения. 0 оставляет значение QUIC по умолчанию.
authentication-timeoutint1000<milliseconds>Максимальное ожидание кадра аутентификации от клиента, в миллисекундах.
alpn[]string[h3]h3Список ALPN, предлагаемый при TLS-рукопожатии.
max-udp-relay-packet-sizeint1252<bytes>Максимальный размер UDP-полезной нагрузки, принимаемой от клиентов.
cwndint32<int>Начальное окно перегрузки в пакетах.
bbr-profilestring(unset)default | aggressiveПрофиль настройки BBR.
mux-optionMuxOption(disabled)MuxOptionНастройки мультиплексирования в стиле sing.

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

Входящий (верхнеуровневый tuic-server)

Верхнеуровневый блок tuic-server — альтернатива объявлению входящего TUIC в listeners. Он существует по историческим причинам; для новых конфигураций предпочитайте форму слушателя (она естественно сочетается с остальной моделью входящих).

ПолеТипПо умолчаниюДопустимые значенияОписание
enableboolfalsetrue | falseГлавный переключатель верхнеуровневого входящего TUIC. При false остальная часть блока игнорируется.
listenstring127.0.0.1:0<host:port>Адрес прослушивания. Тот же синтаксис, что и в остальных местах mihomo.
token[]string[][<string>]Список токенов TUIC v4.
usersmap[string]string{}{<uuid>: <password>}Таблица пользователей TUIC v5.
certificatestring(required)<PEM file path>TLS-сертификат сервера.
private-keystring(required)<key file path>Закрытый TLS-ключ.
congestion-controllerstringcubiccubic | new_reno | bbr | bbr_meta_v1 | bbr_meta_v2Контроллер перегрузки QUIC на стороне сервера.
max-idle-timeint0<milliseconds>Тайм-аут простоя QUIC.
authentication-timeoutint1000<milliseconds>Тайм-аут кадра аутентификации клиента.
alpn[]string[h3]h3Список ALPN.
max-udp-relay-packet-sizeint1252<bytes>Максимальный размер UDP-полезной нагрузки.
cwndint32<int>Начальное окно перегрузки.

Исходный код: config/config.go:329-342 · зафиксировано на v1.19.29 (e26714a)

Примеры

Исходящее — TUIC v5:

yaml
proxies:
  - name: tuic-v5
    type: tuic
    server: example.com
    port: 443
    uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
    password: <password>
    udp-relay-mode: native
    congestion-controller: bbr
    sni: example.com
    alpn: [h3]
    heartbeat-interval: 10000
    reduce-rtt: true

Исходящее — TUIC v4 (устаревший):

yaml
proxies:
  - name: tuic-v4
    type: tuic
    server: example.com
    port: 443
    token: <token>
    udp-relay-mode: native
    sni: example.com
    alpn: [h3]

Входящее в listeners:

yaml
listeners:
  - name: tuic-in
    type: tuic
    listen: 0.0.0.0
    port: 443
    users:
      a3482e88-686a-4a58-8126-99c9df64b7bf: <alice password>
      6f4e6c2c-8b1d-4b4f-8e2e-1f2b5c9e0a3b: <bob password>
    certificate: /etc/mihomo/server.crt
    private-key: /etc/mihomo/server.key
    congestion-controller: bbr
    alpn: [h3]

Верхнеуровневый tuic-server (историческая форма):

yaml
tuic-server:
  enable: true
  listen: 0.0.0.0:443
  users:
    a3482e88-686a-4a58-8126-99c9df64b7bf: <password>
  certificate: /etc/mihomo/server.crt
  private-key: /etc/mihomo/server.key
  congestion-controller: bbr
  alpn: [h3]

Примечания

  • Исходящий TUIC в mihomo выражает тайм-ауты и интервалы в миллисекундах, а не секундах — heartbeat-interval: 10000 это десять секунд. request-timeout и authentication-timeout входящего следуют той же конвенции.
  • Пять контроллеров перегрузки подключаются в transport/tuic/common/congestion.go:20-53. bbr — современная реализация v2; bbr_meta_v1/bbr_meta_v2 существуют исключительно для совместимости со старыми клиентами.
  • cwnd: 0 во время выполнения трактуется как 32 пакета (transport/tuic/common/congestion.go:17-19).
  • Верхнеуровневый блок tuic-server может объявить только одно входящее TUIC. Для нескольких входящих TUIC на разных портах используйте форму listeners:.

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

  • Xray-core не поддерживает TUIC. См. TUIC — Xray-core.
  • sing-box поддерживает только TUIC v5 (без формы с токеном), использует имена полей в snake_case (congestion_control, udp_relay_mode), принимает строки длительности в стиле Go ("3s") для тайм-аутов и предлагает меньший набор контроллеров перегрузки (cubic, new_reno, bbr). См. TUIC — sing-box.

Исходный код: adapter/outbound/tuic.go:34-70 · v1.19.29 (e26714a)

Core Tutorial от Argsment