Skip to content

AnyTLS — sing-box ​

AnyTLS — это туннель в форме TLS, использующий приёмы паддинга, чтобы замаскировать профиль своего трафика. sing-box стал первой стабильной реализацией; поддерживаются и входящий, и исходящий с клиентским пулом сессий.

Входящий ​

type: "anytls":

ПолеТипПо умолчаниюДопустимые значенияОписание
users[]AnyTLSUser[][AnyTLSUser]Принимаемые пользователи.
padding_schemebadoption.Listable[string](server default)<scheme line> | [<scheme line>]Пользовательская схема паддинга, формирующая профиль трафика на проводе. Принимает одну строку или список строк; пустое / незаданное значение использует встроенную схему сервера по умолчанию.

Исходный код: option/anytls.go:5-10 · зафиксировано на v1.14.2 (af6e64c)

Структура встраивает ListenOptions и InboundTLSOptionsContainer. TLS обязателен — на проводе AnyTLS всегда обёрнут в TLS.

users[] ​

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(unset)<string>Отображаемое имя, используемое в статистике и журналах.
passwordstring(required)<string>Пароль пользователя.

Исходный код: option/anytls.go:12-15 · зафиксировано на v1.14.2 (af6e64c)

Исходящий ​

type: "anytls":

ПолеТипПо умолчаниюДопустимые значенияОписание
passwordstring(required)<string>Пароль сервера.
idle_session_check_intervalbadoption.Duration30s<duration>Как часто клиент просматривает пул в поисках простаивающих сессий для утилизации.
idle_session_timeoutbadoption.Duration30s<duration>Сессии, простаивающие дольше этого времени, закрываются при следующем проходе проверки.
min_idle_sessionint0<int>Держать «тёплыми» не меньше этого числа простаивающих сессий для повторного использования с низкой задержкой.
client_metadatastring(empty)<string>Заменяет запись client= в кадре настроек AnyTLS. По умолчанию пусто, поэтому имя и версия клиента не отправляются.

Исходный код: option/anytls.go:17-26 · зафиксировано на v1.14.2 (af6e64c)

Встраивает DialerOptions, ServerOptions и OutboundTLSOptionsContainer. TLS обязателен.

Примеры ​

Входящий:

json
{
  "inbounds": [
    {
      "type": "anytls",
      "tag": "anytls-in",
      "listen": "::",
      "listen_port": 443,
      "users": [{ "name": "alice", "password": "<password>" }],
      "tls": {
        "enabled": true,
        "certificate_path": "/etc/ssl/cert.pem",
        "key_path": "/etc/ssl/key.pem"
      }
    }
  ]
}

Исходящий с прогретым пулом сессий:

json
{
  "outbounds": [
    {
      "type": "anytls",
      "tag": "anytls-out",
      "server": "example.com",
      "server_port": 443,
      "password": "<password>",
      "min_idle_session": 4,
      "idle_session_check_interval": "30s",
      "idle_session_timeout": "60s",
      "tls": { "enabled": true, "server_name": "example.com" }
    }
  ]
}

Примечания ​

  • padding_scheme принимает либо одну строку (по одному правилу на строку внутри), либо список строк. Формат следует спецификации апстрима AnyTLS — большинству пользователей стоит оставить его незаданным и использовать серверную схему по умолчанию.
  • Поля пула сессий (idle_session_check_interval, idle_session_timeout, min_idle_session) есть только у исходящего. Пул держит TLS-сессии «тёплыми», чтобы новые запросы прикладного уровня стоили один цикл обмена, а не полное TLS-рукопожатие.
  • min_idle_session: 0 (по умолчанию) создаёт сессии лениво по запросу и закрывает их после idle_session_timeout. Увеличьте значение, если нагрузка приходит всплесками новых запросов.
  • client_metadata определяет, какое имя/версию клиента кадр настроек AnyTLS сообщает серверу. По умолчанию значение пустое, так как было замечено, что серверы используют его для распознавания и блокировки клиентов. Задавайте его, только если сервер требует конкретное значение.

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

  • Xray-core не поддерживает AnyTLS. См. AnyTLS — Xray-core.
  • mihomo полностью поддерживает AnyTLS с обеих сторон, с именами полей в kebab-case (idle-session-check-interval, …) и дополнительными параметрами отпечатка uTLS и ECH. См. AnyTLS — mihomo.

Исходный код: option/anytls.go:5-26 · v1.14.2 (af6e64c)

Core Tutorial от Argsment