diff --git a/README.md b/README.md index 5cfc277..20b0699 100644 --- a/README.md +++ b/README.md @@ -2,189 +2,60 @@ ***Löst Probleme, bevor andere überhaupt wissen, dass sie existieren*** / ***It solves problems before others even realize they exist*** -### [**Telemt Chat in Telegram**](https://t.me/telemtrs) -#### Fixed TLS ClientHello is now available in Telegram Desktop starting from version 6.7.2: to work with EE-MTProxy, please update your client; -#### Fixed TLS ClientHello for Telegram Android Client is available in [our chat](https://t.me/telemtrs/30234/36441); official releases for Android and iOS are "work in progress"; +> [!NOTE] +> +> Fixed TLS ClientHello is now available in **Telegram Desktop** starting from version **6.7.2**: to work with EE-MTProxy, please update your client. +> +> Fixed TLS ClientHello is now available in **Telegram Android Client** starting from version **12.6.4**; **official release for iOS is "work in progress"**. +

+ + Join us in Telegram + +

**Telemt** is a fast, secure, and feature-rich server written in Rust: it fully implements the official Telegram proxy algo and adds many production-ready improvements such as: -- [ME Pool + Reader/Writer + Registry + Refill + Adaptive Floor + Trio-State + Generation Lifecycle](https://github.com/telemt/telemt/blob/main/docs/model/MODEL.en.md) -- [Full-covered API w/ management](https://github.com/telemt/telemt/blob/main/docs/API.md) -- Anti-Replay on Sliding Window -- Prometheus-format Metrics -- TLS-Fronting and TCP-Splicing for masking from "prying" eyes +- [ME Pool + Reader/Writer + Registry + Refill + Adaptive Floor + Trio-State + Generation Lifecycle](https://github.com/telemt/telemt/blob/main/docs/model/MODEL.en.md); +- [Full-covered API w/ management](https://github.com/telemt/telemt/blob/main/docs/API.md); +- Anti-Replay on Sliding Window; +- Prometheus-format Metrics; +- TLS-Fronting and TCP-Splicing for masking from "prying" eyes. + +![telemt_scheme](docs/assets/telemt.png) ⚓ Our implementation of **TLS-fronting** is one of the most deeply debugged, focused, advanced and *almost* **"behaviorally consistent to real"**: we are confident we have it right - [see evidence on our validation and traces](#recognizability-for-dpi-and-crawler) ⚓ Our ***Middle-End Pool*** is fastest by design in standard scenarios, compared to other implementations of connecting to the Middle-End Proxy: non dramatically, but usual - Full support for all official MTProto proxy modes: - - Classic - - Secure - with `dd` prefix - - Fake TLS - with `ee` prefix + SNI fronting -- Replay attack protection -- Optional traffic masking: forward unrecognized connections to a real web server, e.g. GitHub 🤪 -- Configurable keepalives + timeouts + IPv6 and "Fast Mode" -- Graceful shutdown on Ctrl+C -- Extensive logging via `trace` and `debug` with `RUST_LOG` method + - Classic; + - Secure - with `dd` prefix; + - Fake TLS - with `ee` prefix + SNI fronting; +- Replay attack protection; +- Optional traffic masking: forward unrecognized connections to a real web server, e.g. GitHub 🤪; +- Configurable keepalives + timeouts + IPv6 and "Fast Mode"; +- Graceful shutdown on Ctrl+C; +- Extensive logging via `trace` and `debug` with `RUST_LOG` method. # GOTO -- [Quick Start Guide](#quick-start-guide) - [FAQ](#faq) - - [Recognizability for DPI and crawler](#recognizability-for-dpi-and-crawler) - - [Client WITH secret-key accesses the MTProxy resource:](#client-with-secret-key-accesses-the-mtproxy-resource) - - [Client WITHOUT secret-key gets transparent access to the specified resource:](#client-without-secret-key-gets-transparent-access-to-the-specified-resource) - - [Telegram Calls via MTProxy](#telegram-calls-via-mtproxy) - - [How does DPI see MTProxy TLS?](#how-does-dpi-see-mtproxy-tls) - - [Whitelist on IP](#whitelist-on-ip) - - [Too many open files](#too-many-open-files) +- [Architecture](docs/Architecture) +- [Quick Start Guide](#quick-start-guide) +- [Config parameters](docs/Config_params) - [Build](#build) - [Why Rust?](#why-rust) - [Issues](#issues) - [Roadmap](#roadmap) - ## Quick Start Guide -- [Quick Start Guide RU](docs/QUICK_START_GUIDE.ru.md) -- [Quick Start Guide EN](docs/QUICK_START_GUIDE.en.md) +- [Quick Start Guide RU](docs/Quick_start/QUICK_START_GUIDE.ru.md) +- [Quick Start Guide EN](docs/Quick_start/QUICK_START_GUIDE.en.md) ## FAQ - [FAQ RU](docs/FAQ.ru.md) - [FAQ EN](docs/FAQ.en.md) -### Recognizability for DPI and crawler - -On April 1, 2026, we became aware of a method for detecting MTProxy Fake-TLS, -based on the ECH extension and the ordering of cipher suites, -as well as an overall unique JA3/JA4 fingerprint -that does not occur in modern browsers: -we have already submitted initial changes to the Telegram Desktop developers and are working on updates for other clients. - -- We consider this a breakthrough aspect, which has no stable analogues today -- Based on this: if `telemt` configured correctly, **TLS mode is completely identical to real-life handshake + communication** with a specified host -- Here is our evidence: - - 212.220.88.77 - "dummy" host, running `telemt` - - `petrovich.ru` - `tls` + `masking` host, in HEX: `706574726f766963682e7275` - - **No MITM + No Fake Certificates/Crypto** = pure transparent *TCP Splice* to "best" upstream: MTProxy or tls/mask-host: - - DPI see legitimate HTTPS to `tls_host`, including *valid chain-of-trust* and entropy - - Crawlers completely satisfied receiving responses from `mask_host` - #### Client WITH secret-key accesses the MTProxy resource: - - telemt - - #### Client WITHOUT secret-key gets transparent access to the specified resource: - - with trusted certificate - - with original handshake - - with full request-response way - - with low-latency overhead -```bash -root@debian:~/telemt# curl -v -I --resolve petrovich.ru:443:212.220.88.77 https://petrovich.ru/ -* Added petrovich.ru:443:212.220.88.77 to DNS cache -* Hostname petrovich.ru was found in DNS cache -* Trying 212.220.88.77:443... -* Connected to petrovich.ru (212.220.88.77) port 443 (#0) -* ALPN: offers h2,http/1.1 -* TLSv1.3 (OUT), TLS handshake, Client hello (1): -* CAfile: /etc/ssl/certs/ca-certificates.crt -* CApath: /etc/ssl/certs -* TLSv1.3 (IN), TLS handshake, Server hello (2): -* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): -* TLSv1.3 (IN), TLS handshake, Certificate (11): -* TLSv1.3 (IN), TLS handshake, CERT verify (15): -* TLSv1.3 (IN), TLS handshake, Finished (20): -* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): -* TLSv1.3 (OUT), TLS handshake, Finished (20): -* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 -* ALPN: server did not agree on a protocol. Uses default. -* Server certificate: -* subject: C=RU; ST=Saint Petersburg; L=Saint Petersburg; O=STD Petrovich; CN=*.petrovich.ru -* start date: Jan 28 11:21:01 2025 GMT -* expire date: Mar 1 11:21:00 2026 GMT -* subjectAltName: host "petrovich.ru" matched cert's "petrovich.ru" -* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018 -* SSL certificate verify ok. -* using HTTP/1.x -> HEAD / HTTP/1.1 -> Host: petrovich.ru -> User-Agent: curl/7.88.1 -> Accept: */* -> -* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): -* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): -* old SSL session ID is stale, removing -< HTTP/1.1 200 OK -HTTP/1.1 200 OK -< Server: Variti/0.9.3a -Server: Variti/0.9.3a -< Date: Thu, 01 Jan 2026 00:0000 GMT -Date: Thu, 01 Jan 2026 00:0000 GMT -< Access-Control-Allow-Origin: * -Access-Control-Allow-Origin: * -< Content-Type: text/html -Content-Type: text/html -< Cache-Control: no-store -Cache-Control: no-store -< Expires: Thu, 01 Jan 2026 00:0000 GMT -Expires: Thu, 01 Jan 2026 00:0000 GMT -< Pragma: no-cache -Pragma: no-cache -< Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/ -Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/ -< Content-Type: text/html -Content-Type: text/html -< Content-Length: 31253 -Content-Length: 31253 -< Connection: keep-alive -Connection: keep-alive -< Keep-Alive: timeout=60 -Keep-Alive: timeout=60 - -< -* Connection #0 to host petrovich.ru left intact - -``` -- We challenged ourselves, we kept trying and we didn't only *beat the air*: now, we have something to show you - - Do not just take our word for it? - This is great and we respect that: you can build your own `telemt` or download a build and check it right now -### Telegram Calls via MTProxy -- Telegram architecture **does NOT allow calls via MTProxy**, but only via SOCKS5, which cannot be obfuscated -### How does DPI see MTProxy TLS? -- DPI sees MTProxy in Fake TLS (ee) mode as TLS 1.3 -- the SNI you specify sends both the client and the server; -- ALPN is similar to HTTP 1.1/2; -- high entropy, which is normal for AES-encrypted traffic; -### Whitelist on IP -- MTProxy cannot work when there is: - - no IP connectivity to the target host: Russian Whitelist on Mobile Networks - "Белый список" - - OR all TCP traffic is blocked - - OR high entropy/encrypted traffic is blocked: content filters at universities and critical infrastructure - - OR all TLS traffic is blocked - - OR specified port is blocked: use 443 to make it "like real" - - OR provided SNI is blocked: use "officially approved"/innocuous name -- like most protocols on the Internet; -- these situations are observed: - - in China behind the Great Firewall - - in Russia on mobile networks, less in wired networks - - in Iran during "activity" -### Too many open files -- On a fresh Linux install the default open file limit is low; under load `telemt` may fail with `Accept error: Too many open files` -- **Systemd**: add `LimitNOFILE=65536` to the `[Service]` section (already included in the example above) -- **Docker**: add `--ulimit nofile=65536:65536` to your `docker run` command, or in `docker-compose.yml`: -```yaml -ulimits: - nofile: - soft: 65536 - hard: 65536 -``` -- **System-wide** (optional): add to `/etc/security/limits.conf`: -``` -* soft nofile 1048576 -* hard nofile 1048576 -root soft nofile 1048576 -root hard nofile 1048576 -``` - - ## Build ```bash # Cloning repo @@ -207,7 +78,7 @@ telemt config.toml ``` ### OpenBSD -- Build and service setup guide: [OpenBSD Guide (EN)](docs/OPENBSD.en.md) +- Build and service setup guide: [OpenBSD Guide (EN)](docs/Quick_start/OPENBSD_QUICK_START_GUIDE.en.md) - Example rc.d script: [contrib/openbsd/telemt.rcd](contrib/openbsd/telemt.rcd) - Status: OpenBSD sandbox hardening with `pledge(2)` and `unveil(2)` is not implemented yet. diff --git a/README.ru.md b/README.ru.md new file mode 100644 index 0000000..aaf4aee --- /dev/null +++ b/README.ru.md @@ -0,0 +1,123 @@ +# Telemt — MTProxy на Rust + Tokio + +***Решает проблемы раньше, чем другие узнают об их существовании*** + +> [!Примечание] +> +> Исправленный TLS ClientHello доступен в **Telegram Desktop** начиная с версии **6.7.2**: для работы с EE-MTProxy обновите клиент. +> +> Исправленный TLS ClientHello доступен в **Telegram Android** начиная с версии **12.6.4**; **официальный релиз для iOS находится в процессе разработки**. + +

+ + Мы в Telegram + +

+ +**Telemt** — это быстрый, безопасный и функциональный сервер, написанный на Rust. Он полностью реализует официальный алгоритм прокси Telegram и добавляет множество улучшений для продакшена: + +- [ME Pool + Reader/Writer + Registry + Refill + Adaptive Floor + Trio-State + жизненный цикл генераций](https://github.com/telemt/telemt/blob/main/docs/model/MODEL.en.md); +- [Полноценный API с управлением](https://github.com/telemt/telemt/blob/main/docs/API.md); +- Защита от повторных атак (Anti-Replay on Sliding Window); +- Метрики в формате Prometheus; +- TLS-fronting и TCP-splicing для маскировки от DPI. + +![telemt_scheme](docs/assets/telemt.png) + +## Особенности + +⚓ Реализация **TLS-fronting** максимально приближена к поведению реального HTTPS-трафика. + +⚓ ***Middle-End Pool*** оптимизирован для высокой производительности. + +- Поддержка всех режимов MTProto proxy: + - Classic; + - Secure (префикс `dd`); + - Fake TLS (префикс `ee` + SNI fronting); +- Защита от replay-атак; +- Маскировка трафика (перенаправление неизвестных подключений на реальные сайты); +- Настраиваемые keepalive, таймауты, IPv6 и «быстрый режим»; +- Корректное завершение работы (Ctrl+C); +- Подробное логирование через `trace` и `debug`. + +# Навигация +- [FAQ](#faq) +- [Архитектура](docs/Architecture) +- [Быстрый старт](#quick-start-guide) +- [Параметры конфигурационного файла](docs/Config_params) +- [Сборка](#build) +- [Почему Rust?](#why-rust) +- [Известные проблемы](#issues) +- [Планы](#roadmap) + +## Быстрый старт +- [Quick Start Guide RU](docs/Quick_start/QUICK_START_GUIDE.ru.md) +- [Quick Start Guide EN](docs/Quick_start/QUICK_START_GUIDE.en.md) + +## FAQ + +- [FAQ RU](docs/FAQ.ru.md) +- [FAQ EN](docs/FAQ.en.md) + +## Сборка + +```bash +# Клонируйте репозиторий +git clone https://github.com/telemt/telemt +# Смените каталог на telemt +cd telemt +# Начните процесс сборки +cargo build --release + +# Устройства с небольшим объёмом оперативной памяти (1 ГБ, например NanoPi Neo3 / Raspberry Pi Zero 2): +# используется параметр lto = «thin» для уменьшения пикового потребления памяти. +# Если ваш пользовательский набор инструментов переопределяет профили, не используйте Fat LTO. + +# Перейдите в каталог /bin +mv ./target/release/telemt /bin +# Сделайте файл исполняемым +chmod +x /bin/telemt +# Запустите! +telemt config.toml +``` + +### Устройства с малым объемом RAM +Для устройств с ~1 ГБ RAM (например Raspberry Pi): +- используется облегчённая оптимизация линковщика (thin LTO); +- не рекомендуется включать fat LTO. + +## OpenBSD + +- Руководство по сборке и настройке на английском языке [OpenBSD Guide (EN)](docs/Quick_start/OPENBSD_QUICK_START_GUIDE.en.md); +- Пример rc.d скрипта: [contrib/openbsd/telemt.rcd](contrib/openbsd/telemt.rcd); +- Поддержка sandbox с `pledge(2)` и `unveil(2)` пока не реализована. + +## Почему Rust? + +- Надёжность для долгоживущих процессов; +- Детерминированное управление ресурсами (RAII); +- Отсутствие сборщика мусора; +- Безопасность памяти; +- Асинхронная архитектура Tokio. + +## Известные проблемы + +- ✅ [Поддержка SOCKS5 как upstream](https://github.com/telemt/telemt/issues/1) -> добавлен Upstream Management; +- ✅ [Проблема зависания загрузки медиа на iOS](https://github.com/telemt/telemt/issues/2). + +## Планы + +- Публичный IP в ссылках; +- Перезагрузка конфигурации на лету; +- Привязка к устройству или IP для входящих и исходящих соединений; +- Поддержка рекламных тегов по SNI / секретному ключу; +- Улучшенная обработка ошибок; +- Zero-copy оптимизации; +- Проверка состояния дата-центров; +- Отсутствие глобального изменяемого состояния; +- Изоляция клиентов и справедливое распределение трафика; +- «Политика секретов» — маршрутизация по SNI / секрету; +- Балансировщик с несколькими источниками и отработка отказов; +- Строгие FSM для handshake; +- Улучшенная защита от replay-атак; +- Веб-интерфейс: статистика, состояние работоспособности, задержка, пользовательский опыт... diff --git a/docs/TUNING.de.md b/docs/Advanced_settings/TUNING.de.md similarity index 100% rename from docs/TUNING.de.md rename to docs/Advanced_settings/TUNING.de.md diff --git a/docs/TUNING.en.md b/docs/Advanced_settings/TUNING.en.md similarity index 100% rename from docs/TUNING.en.md rename to docs/Advanced_settings/TUNING.en.md diff --git a/docs/TUNING.ru.md b/docs/Advanced_settings/TUNING.ru.md similarity index 100% rename from docs/TUNING.ru.md rename to docs/Advanced_settings/TUNING.ru.md diff --git a/docs/API.md b/docs/Architecture/API/API.md similarity index 100% rename from docs/API.md rename to docs/Architecture/API/API.md diff --git a/docs/fronting-splitting/TLS-F-TCP-S.ru.md b/docs/Architecture/Fronting-splitting/TLS-F-TCP-S.ru.md similarity index 100% rename from docs/fronting-splitting/TLS-F-TCP-S.ru.md rename to docs/Architecture/Fronting-splitting/TLS-F-TCP-S.ru.md diff --git a/docs/middle-end/KDF-internals/MIDDLE-END-KDF.de.md b/docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.de.md similarity index 100% rename from docs/middle-end/KDF-internals/MIDDLE-END-KDF.de.md rename to docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.de.md diff --git a/docs/middle-end/KDF-internals/MIDDLE-END-KDF.en.md b/docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.en.md similarity index 100% rename from docs/middle-end/KDF-internals/MIDDLE-END-KDF.en.md rename to docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.en.md diff --git a/docs/middle-end/KDF-internals/MIDDLE-END-KDF.ru.md b/docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.ru.md similarity index 100% rename from docs/middle-end/KDF-internals/MIDDLE-END-KDF.ru.md rename to docs/Architecture/Middle-end/KDF-internals/MIDDLE-END-KDF.ru.md diff --git a/docs/model/FakeTLS.png b/docs/Architecture/Model/FakeTLS.png similarity index 100% rename from docs/model/FakeTLS.png rename to docs/Architecture/Model/FakeTLS.png diff --git a/docs/model/MODEL.en.md b/docs/Architecture/Model/MODEL.en.md similarity index 100% rename from docs/model/MODEL.en.md rename to docs/Architecture/Model/MODEL.en.md diff --git a/docs/model/MODEL.ru.md b/docs/Architecture/Model/MODEL.ru.md similarity index 100% rename from docs/model/MODEL.ru.md rename to docs/Architecture/Model/MODEL.ru.md diff --git a/docs/model/architecture.png b/docs/Architecture/Model/architecture.png similarity index 100% rename from docs/model/architecture.png rename to docs/Architecture/Model/architecture.png diff --git a/docs/CONFIG_PARAMS.en.md b/docs/Config_params/CONFIG_PARAMS.en.md similarity index 100% rename from docs/CONFIG_PARAMS.en.md rename to docs/Config_params/CONFIG_PARAMS.en.md diff --git a/docs/Config_params/CONFIG_PARAMS.ru.md b/docs/Config_params/CONFIG_PARAMS.ru.md new file mode 100644 index 0000000..7dc15c4 --- /dev/null +++ b/docs/Config_params/CONFIG_PARAMS.ru.md @@ -0,0 +1,3300 @@ +# Справочник параметров конфигурации Telemt + +В этом документе перечислены все ключи конфигурации, принимаемые `config.toml`. + +> [!ПРИМЕЧАНИЕ] +> +> Этот справочник был составлен с помощью искусственного интеллекта и сверен с базой кода (схема конфигурации, значения по умолчанию и логика проверки). + +> [!ПРЕДУПРЕЖДЕНИЕ] +> +> Параметры конфигурации, подробно описанные в этом документе, предназначены для опытных пользователей и для целей тонкой настройки. Изменение этих параметров без четкого понимания их функции может привести к нестабильности приложения или другому неожиданному поведению. Пожалуйста, действуйте осторожно и на свой страх и риск. + +## Ключи верхнего уровня + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`include`](#cfg-top-include) | `String` (special directive) | — | +| [`show_link`](#cfg-top-show_link) | `"*"` or `String[]` | `[]` (`ShowLink::None`) | +| [`dc_overrides`](#cfg-top-dc_overrides) | `Map` | `{}` | +| [`default_dc`](#cfg-top-default_dc) | `u8` | — (effective fallback: `2` in ME routing) | + + +- `include` + - **Ограничения / валидация**: Должна быть однострочной директивой в форме `include = "path/to/file.toml"`. Включения расширяются перед анализом TOML. Максимальная глубина включения — 10. + - **Описание**: Включает еще один файл TOML с помощью `include = "relative/or/absolute/path.toml"`; включения обрабатываются рекурсивно перед анализом. + - **Пример**: + + ```toml + include = "secrets.toml" + ``` + +- `show_link` + - **Ограничения / валидация**: Принимает `"*"` или массив имен пользователей. Пустой массив означает «не показывать ничего». + - **Описание**: Устаревший селектор видимости ссылок верхнего уровня («*»` для всех пользователей или списка явных имен пользователей). + - **Пример**: + + ```toml + # show links for all configured users + show_link = "*" + + # or: show links only for selected users + # show_link = ["alice", "bob"] + ``` + +- `dc_overrides` + - **Ограничения / валидация**: Ключ должен быть положительным целочисленным индексом DC, закодированным как строка (например, `"203"`). Значения должны анализироваться как `SocketAddr` (`ip:port`). Пустые строки игнорируются. + - **Описание**: Переопределяет конечные точки контроллера домена для нестандартных контроллеров домена; ключ — индексная строка контроллера домена, значение — один или несколько адресов `ip:port`. + - **Пример**: + + ```toml + [dc_overrides] + "201" = "149.154.175.50:443" + "203" = ["149.154.175.100:443", "91.105.192.100:443"] + ``` + +- `default_dc` + - **Ограничения / валидация**: Предполагаемый диапазон: «1..=5». Если этот параметр выходит за пределы диапазона, время выполнения возвращается к поведению DC1 в прямом реле; Маршрутизация среднего уровня возвращается к значению «2», если она не установлена. + - **Описание**: Индекс контроллера домена по умолчанию, используемый для несопоставленных нестандартных контроллеров домена. + - **Пример**: + + ```toml + # When a client requests an unknown/non-standard DC with no override, + # route it to this default cluster (1..=5). + default_dc = 2 + ``` + +## [general] + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`data_path`](#cfg-general-data_path) | `String` | — | +| [`prefer_ipv6`](#cfg-general-prefer_ipv6) | `bool` | `false` | +| [`fast_mode`](#cfg-general-fast_mode) | `bool` | `true` | +| [`use_middle_proxy`](#cfg-general-use_middle_proxy) | `bool` | `true` | +| [`proxy_secret_path`](#cfg-general-proxy_secret_path) | `String` | `"proxy-secret"` | +| [`proxy_config_v4_cache_path`](#cfg-general-proxy_config_v4_cache_path) | `String` | `"cache/proxy-config-v4.txt"` | +| [`proxy_config_v6_cache_path`](#cfg-general-proxy_config_v6_cache_path) | `String` | `"cache/proxy-config-v6.txt"` | +| [`ad_tag`](#cfg-general-ad_tag) | `String` | — | +| [`middle_proxy_nat_ip`](#cfg-general-middle_proxy_nat_ip) | `IpAddr` | — | +| [`middle_proxy_nat_probe`](#cfg-general-middle_proxy_nat_probe) | `bool` | `true` | +| [`middle_proxy_nat_stun`](#cfg-general-middle_proxy_nat_stun) | `String` | — | +| [`middle_proxy_nat_stun_servers`](#cfg-general-middle_proxy_nat_stun_servers) | `String[]` | `[]` | +| [`stun_nat_probe_concurrency`](#cfg-general-stun_nat_probe_concurrency) | `usize` | `8` | +| [`middle_proxy_pool_size`](#cfg-general-middle_proxy_pool_size) | `usize` | `8` | +| [`middle_proxy_warm_standby`](#cfg-general-middle_proxy_warm_standby) | `usize` | `16` | +| [`me_init_retry_attempts`](#cfg-general-me_init_retry_attempts) | `u32` | `0` | +| [`me2dc_fallback`](#cfg-general-me2dc_fallback) | `bool` | `true` | +| [`me2dc_fast`](#cfg-general-me2dc_fast) | `bool` | `false` | +| [`me_keepalive_enabled`](#cfg-general-me_keepalive_enabled) | `bool` | `true` | +| [`me_keepalive_interval_secs`](#cfg-general-me_keepalive_interval_secs) | `u64` | `8` | +| [`me_keepalive_jitter_secs`](#cfg-general-me_keepalive_jitter_secs) | `u64` | `2` | +| [`me_keepalive_payload_random`](#cfg-general-me_keepalive_payload_random) | `bool` | `true` | +| [`rpc_proxy_req_every`](#cfg-general-rpc_proxy_req_every) | `u64` | `0` | +| [`me_writer_cmd_channel_capacity`](#cfg-general-me_writer_cmd_channel_capacity) | `usize` | `4096` | +| [`me_route_channel_capacity`](#cfg-general-me_route_channel_capacity) | `usize` | `768` | +| [`me_c2me_channel_capacity`](#cfg-general-me_c2me_channel_capacity) | `usize` | `1024` | +| [`me_c2me_send_timeout_ms`](#cfg-general-me_c2me_send_timeout_ms) | `u64` | `4000` | +| [`me_reader_route_data_wait_ms`](#cfg-general-me_reader_route_data_wait_ms) | `u64` | `2` | +| [`me_d2c_flush_batch_max_frames`](#cfg-general-me_d2c_flush_batch_max_frames) | `usize` | `32` | +| [`me_d2c_flush_batch_max_bytes`](#cfg-general-me_d2c_flush_batch_max_bytes) | `usize` | `131072` | +| [`me_d2c_flush_batch_max_delay_us`](#cfg-general-me_d2c_flush_batch_max_delay_us) | `u64` | `500` | +| [`me_d2c_ack_flush_immediate`](#cfg-general-me_d2c_ack_flush_immediate) | `bool` | `true` | +| [`me_quota_soft_overshoot_bytes`](#cfg-general-me_quota_soft_overshoot_bytes) | `u64` | `65536` | +| [`me_d2c_frame_buf_shrink_threshold_bytes`](#cfg-general-me_d2c_frame_buf_shrink_threshold_bytes) | `usize` | `262144` | +| [`direct_relay_copy_buf_c2s_bytes`](#cfg-general-direct_relay_copy_buf_c2s_bytes) | `usize` | `65536` | +| [`direct_relay_copy_buf_s2c_bytes`](#cfg-general-direct_relay_copy_buf_s2c_bytes) | `usize` | `262144` | +| [`crypto_pending_buffer`](#cfg-general-crypto_pending_buffer) | `usize` | `262144` | +| [`max_client_frame`](#cfg-general-max_client_frame) | `usize` | `16777216` | +| [`desync_all_full`](#cfg-general-desync_all_full) | `bool` | `false` | +| [`beobachten`](#cfg-general-beobachten) | `bool` | `true` | +| [`beobachten_minutes`](#cfg-general-beobachten_minutes) | `u64` | `10` | +| [`beobachten_flush_secs`](#cfg-general-beobachten_flush_secs) | `u64` | `15` | +| [`beobachten_file`](#cfg-general-beobachten_file) | `String` | `"cache/beobachten.txt"` | +| [`hardswap`](#cfg-general-hardswap) | `bool` | `true` | +| [`me_warmup_stagger_enabled`](#cfg-general-me_warmup_stagger_enabled) | `bool` | `true` | +| [`me_warmup_step_delay_ms`](#cfg-general-me_warmup_step_delay_ms) | `u64` | `500` | +| [`me_warmup_step_jitter_ms`](#cfg-general-me_warmup_step_jitter_ms) | `u64` | `300` | +| [`me_reconnect_max_concurrent_per_dc`](#cfg-general-me_reconnect_max_concurrent_per_dc) | `u32` | `8` | +| [`me_reconnect_backoff_base_ms`](#cfg-general-me_reconnect_backoff_base_ms) | `u64` | `500` | +| [`me_reconnect_backoff_cap_ms`](#cfg-general-me_reconnect_backoff_cap_ms) | `u64` | `30000` | +| [`me_reconnect_fast_retry_count`](#cfg-general-me_reconnect_fast_retry_count) | `u32` | `16` | +| [`me_single_endpoint_shadow_writers`](#cfg-general-me_single_endpoint_shadow_writers) | `u8` | `2` | +| [`me_single_endpoint_outage_mode_enabled`](#cfg-general-me_single_endpoint_outage_mode_enabled) | `bool` | `true` | +| [`me_single_endpoint_outage_disable_quarantine`](#cfg-general-me_single_endpoint_outage_disable_quarantine) | `bool` | `true` | +| [`me_single_endpoint_outage_backoff_min_ms`](#cfg-general-me_single_endpoint_outage_backoff_min_ms) | `u64` | `250` | +| [`me_single_endpoint_outage_backoff_max_ms`](#cfg-general-me_single_endpoint_outage_backoff_max_ms) | `u64` | `3000` | +| [`me_single_endpoint_shadow_rotate_every_secs`](#cfg-general-me_single_endpoint_shadow_rotate_every_secs) | `u64` | `900` | +| [`me_floor_mode`](#cfg-general-me_floor_mode) | `"static"` or `"adaptive"` | `"adaptive"` | +| [`me_adaptive_floor_idle_secs`](#cfg-general-me_adaptive_floor_idle_secs) | `u64` | `90` | +| [`me_adaptive_floor_min_writers_single_endpoint`](#cfg-general-me_adaptive_floor_min_writers_single_endpoint) | `u8` | `1` | +| [`me_adaptive_floor_min_writers_multi_endpoint`](#cfg-general-me_adaptive_floor_min_writers_multi_endpoint) | `u8` | `1` | +| [`me_adaptive_floor_recover_grace_secs`](#cfg-general-me_adaptive_floor_recover_grace_secs) | `u64` | `180` | +| [`me_adaptive_floor_writers_per_core_total`](#cfg-general-me_adaptive_floor_writers_per_core_total) | `u16` | `48` | +| [`me_adaptive_floor_cpu_cores_override`](#cfg-general-me_adaptive_floor_cpu_cores_override) | `u16` | `0` | +| [`me_adaptive_floor_max_extra_writers_single_per_core`](#cfg-general-me_adaptive_floor_max_extra_writers_single_per_core) | `u16` | `1` | +| [`me_adaptive_floor_max_extra_writers_multi_per_core`](#cfg-general-me_adaptive_floor_max_extra_writers_multi_per_core) | `u16` | `2` | +| [`me_adaptive_floor_max_active_writers_per_core`](#cfg-general-me_adaptive_floor_max_active_writers_per_core) | `u16` | `64` | +| [`me_adaptive_floor_max_warm_writers_per_core`](#cfg-general-me_adaptive_floor_max_warm_writers_per_core) | `u16` | `64` | +| [`me_adaptive_floor_max_active_writers_global`](#cfg-general-me_adaptive_floor_max_active_writers_global) | `u32` | `256` | +| [`me_adaptive_floor_max_warm_writers_global`](#cfg-general-me_adaptive_floor_max_warm_writers_global) | `u32` | `256` | +| [`upstream_connect_retry_attempts`](#cfg-general-upstream_connect_retry_attempts) | `u32` | `2` | +| [`upstream_connect_retry_backoff_ms`](#cfg-general-upstream_connect_retry_backoff_ms) | `u64` | `100` | +| [`upstream_connect_budget_ms`](#cfg-general-upstream_connect_budget_ms) | `u64` | `3000` | +| [`upstream_unhealthy_fail_threshold`](#cfg-general-upstream_unhealthy_fail_threshold) | `u32` | `5` | +| [`upstream_connect_failfast_hard_errors`](#cfg-general-upstream_connect_failfast_hard_errors) | `bool` | `false` | +| [`stun_iface_mismatch_ignore`](#cfg-general-stun_iface_mismatch_ignore) | `bool` | `false` | +| [`unknown_dc_log_path`](#cfg-general-unknown_dc_log_path) | `String` | `"unknown-dc.txt"` | +| [`unknown_dc_file_log_enabled`](#cfg-general-unknown_dc_file_log_enabled) | `bool` | `false` | +| [`log_level`](#cfg-general-log_level) | `"debug"`, `"verbose"`, `"normal"`, or `"silent"` | `"normal"` | +| [`disable_colors`](#cfg-general-disable_colors) | `bool` | `false` | +| [`me_socks_kdf_policy`](#cfg-general-me_socks_kdf_policy) | `"strict"` or `"compat"` | `"strict"` | +| [`me_route_backpressure_base_timeout_ms`](#cfg-general-me_route_backpressure_base_timeout_ms) | `u64` | `25` | +| [`me_route_backpressure_high_timeout_ms`](#cfg-general-me_route_backpressure_high_timeout_ms) | `u64` | `120` | +| [`me_route_backpressure_high_watermark_pct`](#cfg-general-me_route_backpressure_high_watermark_pct) | `u8` | `80` | +| [`me_health_interval_ms_unhealthy`](#cfg-general-me_health_interval_ms_unhealthy) | `u64` | `1000` | +| [`me_health_interval_ms_healthy`](#cfg-general-me_health_interval_ms_healthy) | `u64` | `3000` | +| [`me_admission_poll_ms`](#cfg-general-me_admission_poll_ms) | `u64` | `1000` | +| [`me_warn_rate_limit_ms`](#cfg-general-me_warn_rate_limit_ms) | `u64` | `5000` | +| [`me_route_no_writer_mode`](#cfg-general-me_route_no_writer_mode) | `"async_recovery_failfast"`, `"inline_recovery_legacy"`, or `"hybrid_async_persistent"` | `"hybrid_async_persistent"` | +| [`me_route_no_writer_wait_ms`](#cfg-general-me_route_no_writer_wait_ms) | `u64` | `250` | +| [`me_route_hybrid_max_wait_ms`](#cfg-general-me_route_hybrid_max_wait_ms) | `u64` | `3000` | +| [`me_route_blocking_send_timeout_ms`](#cfg-general-me_route_blocking_send_timeout_ms) | `u64` | `250` | +| [`me_route_inline_recovery_attempts`](#cfg-general-me_route_inline_recovery_attempts) | `u32` | `3` | +| [`me_route_inline_recovery_wait_ms`](#cfg-general-me_route_inline_recovery_wait_ms) | `u64` | `3000` | +| [`fast_mode_min_tls_record`](#cfg-general-fast_mode_min_tls_record) | `usize` | `0` | +| [`update_every`](#cfg-general-update_every) | `u64` | `300` | +| [`me_reinit_every_secs`](#cfg-general-me_reinit_every_secs) | `u64` | `900` | +| [`me_hardswap_warmup_delay_min_ms`](#cfg-general-me_hardswap_warmup_delay_min_ms) | `u64` | `1000` | +| [`me_hardswap_warmup_delay_max_ms`](#cfg-general-me_hardswap_warmup_delay_max_ms) | `u64` | `2000` | +| [`me_hardswap_warmup_extra_passes`](#cfg-general-me_hardswap_warmup_extra_passes) | `u8` | `3` | +| [`me_hardswap_warmup_pass_backoff_base_ms`](#cfg-general-me_hardswap_warmup_pass_backoff_base_ms) | `u64` | `500` | +| [`me_config_stable_snapshots`](#cfg-general-me_config_stable_snapshots) | `u8` | `2` | +| [`me_config_apply_cooldown_secs`](#cfg-general-me_config_apply_cooldown_secs) | `u64` | `300` | +| [`me_snapshot_require_http_2xx`](#cfg-general-me_snapshot_require_http_2xx) | `bool` | `true` | +| [`me_snapshot_reject_empty_map`](#cfg-general-me_snapshot_reject_empty_map) | `bool` | `true` | +| [`me_snapshot_min_proxy_for_lines`](#cfg-general-me_snapshot_min_proxy_for_lines) | `u32` | `1` | +| [`proxy_secret_stable_snapshots`](#cfg-general-proxy_secret_stable_snapshots) | `u8` | `2` | +| [`proxy_secret_rotate_runtime`](#cfg-general-proxy_secret_rotate_runtime) | `bool` | `true` | +| [`me_secret_atomic_snapshot`](#cfg-general-me_secret_atomic_snapshot) | `bool` | `true` | +| [`proxy_secret_len_max`](#cfg-general-proxy_secret_len_max) | `usize` | `256` | +| [`me_pool_drain_ttl_secs`](#cfg-general-me_pool_drain_ttl_secs) | `u64` | `90` | +| [`me_instadrain`](#cfg-general-me_instadrain) | `bool` | `false` | +| [`me_pool_drain_threshold`](#cfg-general-me_pool_drain_threshold) | `u64` | `32` | +| [`me_pool_drain_soft_evict_enabled`](#cfg-general-me_pool_drain_soft_evict_enabled) | `bool` | `true` | +| [`me_pool_drain_soft_evict_grace_secs`](#cfg-general-me_pool_drain_soft_evict_grace_secs) | `u64` | `10` | +| [`me_pool_drain_soft_evict_per_writer`](#cfg-general-me_pool_drain_soft_evict_per_writer) | `u8` | `2` | +| [`me_pool_drain_soft_evict_budget_per_core`](#cfg-general-me_pool_drain_soft_evict_budget_per_core) | `u16` | `16` | +| [`me_pool_drain_soft_evict_cooldown_ms`](#cfg-general-me_pool_drain_soft_evict_cooldown_ms) | `u64` | `1000` | +| [`me_bind_stale_mode`](#cfg-general-me_bind_stale_mode) | `"never"`, `"ttl"`, or `"always"` | `"ttl"` | +| [`me_bind_stale_ttl_secs`](#cfg-general-me_bind_stale_ttl_secs) | `u64` | `90` | +| [`me_pool_min_fresh_ratio`](#cfg-general-me_pool_min_fresh_ratio) | `f32` | `0.8` | +| [`me_reinit_drain_timeout_secs`](#cfg-general-me_reinit_drain_timeout_secs) | `u64` | `90` | +| [`proxy_secret_auto_reload_secs`](#cfg-general-proxy_secret_auto_reload_secs) | `u64` | `3600` | +| [`proxy_config_auto_reload_secs`](#cfg-general-proxy_config_auto_reload_secs) | `u64` | `3600` | +| [`me_reinit_singleflight`](#cfg-general-me_reinit_singleflight) | `bool` | `true` | +| [`me_reinit_trigger_channel`](#cfg-general-me_reinit_trigger_channel) | `usize` | `64` | +| [`me_reinit_coalesce_window_ms`](#cfg-general-me_reinit_coalesce_window_ms) | `u64` | `200` | +| [`me_deterministic_writer_sort`](#cfg-general-me_deterministic_writer_sort) | `bool` | `true` | +| [`me_writer_pick_mode`](#cfg-general-me_writer_pick_mode) | `"sorted_rr"` or `"p2c"` | `"p2c"` | +| [`me_writer_pick_sample_size`](#cfg-general-me_writer_pick_sample_size) | `u8` | `3` | +| [`ntp_check`](#cfg-general-ntp_check) | `bool` | `true` | +| [`ntp_servers`](#cfg-general-ntp_servers) | `String[]` | `["pool.ntp.org"]` | +| [`auto_degradation_enabled`](#cfg-general-auto_degradation_enabled) | `bool` | `true` | +| [`degradation_min_unavailable_dc_groups`](#cfg-general-degradation_min_unavailable_dc_groups) | `u8` | `2` | + + +- `data_path` + - **Ограничения / валидация**: `Строка` (необязательно). + - **Описание**: Необязательный путь к каталогу данных времени выполнения. + - **Пример**: + + ```toml + [general] + data_path = "/var/lib/telemt" + ``` + +- `prefer_ipv6` + - **Ограничения / валидация**: Устарело. Используйте `network.prefer`. + - **Описание**: Устаревший устаревший флаг предпочтения IPv6 перенесен в network.prefer. + - **Пример**: + + ```toml + [network] + prefer = 6 + ``` + +- `fast_mode` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает оптимизацию быстрого пути для обработки трафика. + - **Пример**: + + ```toml + [general] + fast_mode = true + ``` + +- `use_middle_proxy` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает транспортный режим ME; если значение false, среда выполнения возвращается к прямой маршрутизации постоянного тока. + - **Пример**: + + ```toml + [general] + use_middle_proxy = true + ``` + +- `proxy_secret_path` + - **Ограничения / валидация**: `Строка`. Если этот параметр опущен, путь по умолчанию — «proxy-secret». Пустые значения принимаются TOML/serde, но, скорее всего, во время выполнения произойдет ошибка (неверный путь к файлу). + - **Описание**: Путь к файлу кэша `proxy-secret` инфраструктуры Telegram, используемому ME-рукопожатием/аутентификацией RPC. Telemt всегда сначала пытается выполнить новую загрузку с https://core.telegram.org/getProxySecret, в случае успеха кэширует ее по этому пути и возвращается к чтению кэшированного файла (любого возраста) в случае сбоя загрузки. + - **Пример**: + + ```toml + [general] + proxy_secret_path = "proxy-secret" + ``` + +- `proxy_config_v4_cache_path` + - **Ограничения / валидация**: `Строка`. Если установлено, оно не должно быть пустым или содержать только пробелы. + - **Описание**: Необязательный путь к дисковому кэшу для необработанного снимка getProxyConfig (IPv4). При запуске Telemt сначала пытается получить свежий снимок; в случае сбоя выборки или пустого снимка он возвращается к этому файлу кэша, если он присутствует и не пуст. + - **Пример**: + + ```toml + [general] + proxy_config_v4_cache_path = "cache/proxy-config-v4.txt" + ``` + +- `proxy_config_v6_cache_path` + - **Ограничения / валидация**: `Строка`. Если установлено, оно не должно быть пустым или содержать только пробелы. + - **Описание**: Необязательный путь к дисковому кэшу для необработанного снимка getProxyConfigV6 (IPv6). При запуске Telemt сначала пытается получить свежий снимок; в случае сбоя выборки или пустого снимка он возвращается к этому файлу кэша, если он присутствует и не пуст. + - **Пример**: + + ```toml + [general] + proxy_config_v6_cache_path = "cache/proxy-config-v6.txt" + ``` + +- `ad_tag` + - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, должно быть ровно 32 шестнадцатеричных символа; недопустимые значения отключаются во время загрузки конфигурации. + - **Описание**: Глобальный резервный спонсируемый канал `ad_tag` (используется, когда у пользователя нет переопределения в `access.user_ad_tags`). Тег со всеми нулями принимается, но не имеет никакого эффекта (и о нем предупреждается), пока не будет заменен реальным тегом от `@MTProxybot`. + - **Пример**: + + ```toml + [general] + ad_tag = "00112233445566778899aabbccddeeff" + ``` + +- `middle_proxy_nat_ip` + - **Ограничения / валидация**: `IpAddr` (необязательно). + - **Описание**: Ручное переопределение общедоступного IP-адреса NAT используется в качестве материала ME-адреса, если оно установлено. + - **Пример**: + + ```toml + [general] + middle_proxy_nat_ip = "203.0.113.10" + ``` + +- `middle_proxy_nat_probe` + - **Ограничения / валидация**: `бул`. Эффективное зондирование ограничивается `network.stun_use` (когда `network.stun_use = false`, STUN-зондирование отключается, даже если этот флаг имеет значение `true`). + - **Описание**: Позволяет зондировать NAT на основе STUN для обнаружения общедоступного IP-порта, используемого при получении ключа ME в средах NAT. + - **Пример**: + + ```toml + [general] + middle_proxy_nat_probe = true + ``` + +- `middle_proxy_nat_stun` + - **Ограничения / валидация**: Устарело. Используйте `network.stun_servers`. + - **Описание**: Устаревший устаревший одиночный сервер STUN для проверки NAT. Во время загрузки конфигурации он объединяется с `network.stun_servers`, если `network.stun_servers` не задан явно. + - **Пример**: + + ```toml + [network] + stun_servers = ["stun.l.google.com:19302"] + ``` + +- `middle_proxy_nat_stun_servers` + - **Ограничения / валидация**: Устарело. Используйте `network.stun_servers`. + - **Описание**: Устаревший устаревший список STUN для резервного копирования NAT. Во время загрузки конфигурации он объединяется с `network.stun_servers`, если `network.stun_servers` не задан явно. + - **Пример**: + + ```toml + [network] + stun_servers = ["stun.l.google.com:19302"] + ``` + +- `stun_nat_probe_concurrency` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Максимальное количество параллельных тестов STUN во время обнаружения NAT/публичной конечной точки. + - **Пример**: + + ```toml + [general] + stun_nat_probe_concurrency = 8 + ``` + +- `middle_proxy_pool_size` + - **Ограничения / валидация**: `использовать`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»). + - **Описание**: Целевой размер активного пула устройств записи ME. + - **Пример**: + + ```toml + [general] + middle_proxy_pool_size = 8 + ``` + +- `middle_proxy_warm_standby` + - **Ограничения / валидация**: `использовать`. + - **Описание**: Количество подключений ME в теплом резерве, предварительно инициализированных. + - **Пример**: + + ```toml + [general] + middle_proxy_warm_standby = 16 + ``` + +- `me_init_retry_attempts` + - **Ограничения / валидация**: `0..=1_000_000` (`0` означает неограниченное количество повторов). + - **Описание**: Повторные попытки инициализации пула ME. + - **Пример**: + + ```toml + [general] + me_init_retry_attempts = 0 + ``` + +- `me2dc_fallback` + - **Ограничения / валидация**: `бул`. + - **Описание**: Позволяет перейти из режима ME в режим прямого постоянного тока в случае сбоя запуска ME. + - **Пример**: + + ```toml + [general] + me2dc_fallback = true + ``` + +- `me2dc_fast` + - **Ограничения / валидация**: `бул`. Активен только тогда, когда `use_middle_proxy = true` и `me2dc_fallback = true`. + - **Описание**: Fast ME->Режим прямого возврата для новых сеансов. + - **Пример**: + + ```toml + [general] + use_middle_proxy = true + me2dc_fallback = true + me2dc_fast = false + ``` + +- `me_keepalive_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает периодические дополнительные кадры поддержки активности ME. + - **Пример**: + + ```toml + [general] + me_keepalive_enabled = true + ``` + +- `me_keepalive_interval_secs` + - **Ограничения / валидация**: `u64` (секунды). + - **Описание**: Базовый интервал поддержки активности ME в секундах. + - **Пример**: + + ```toml + [general] + me_keepalive_interval_secs = 8 + ``` + +- `me_keepalive_jitter_secs` + - **Ограничения / валидация**: `u64` (секунды). + - **Описание**: Джиттер Keepalive за считанные секунды для уменьшения синхронизированных пакетов. + - **Пример**: + + ```toml + [general] + me_keepalive_jitter_secs = 2 + ``` + +- `me_keepalive_payload_random` + - **Ограничения / валидация**: `бул`. + - **Описание**: Случайным образом изменяет байты полезной нагрузки поддержки активности вместо фиксированной нулевой полезной нагрузки. + - **Пример**: + + ```toml + [general] + me_keepalive_payload_random = true + ``` + +- `rpc_proxy_req_every` + - **Ограничения / валидация**: `0` или в пределах `10..=300` (секунд). + - **Описание**: Интервал для сигналов активности службы `RPC_PROXY_REQ` для ME (`0` отключает). + - **Пример**: + + ```toml + [general] + rpc_proxy_req_every = 0 + ``` + +- `me_writer_cmd_channel_capacity` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Пропускная способность командного канала для каждого записывающего устройства. + - **Пример**: + + ```toml + [general] + me_writer_cmd_channel_capacity = 4096 + ``` + +- `me_route_channel_capacity` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Пропускная способность канала маршрута ответа ME для каждого соединения. + - **Пример**: + + ```toml + [general] + me_route_channel_capacity = 768 + ``` + +- `me_c2me_channel_capacity` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Емкость очереди команд для каждого клиента (читатель клиента -> отправитель ME). + - **Пример**: + + ```toml + [general] + me_c2me_channel_capacity = 1024 + ``` + +- `me_c2me_send_timeout_ms` + - **Ограничения / валидация**: `0..=60000` (миллисекунды). + - **Описание**: Максимальное ожидание постановки в очередь команд клиент->ME, когда очередь для каждого клиента заполнена (`0` сохраняет устаревшее неограниченное ожидание). + - **Пример**: + + ```toml + [general] + me_c2me_send_timeout_ms = 4000 + ``` + +- `me_reader_route_data_wait_ms` + - **Ограничения / валидация**: `0..=20` (миллисекунды). + - **Описание**: Ограниченное ожидание маршрутизации ME DATA в очередь для каждого соединения (`0` = нет ожидания). + - **Пример**: + + ```toml + [general] + me_reader_route_data_wait_ms = 2 + ``` + +- `me_d2c_flush_batch_max_frames` + - **Ограничения / валидация**: Должно быть в пределах `1..=512`. + - **Описание**: Макс. ME->клиентские кадры объединяются перед очисткой. + - **Пример**: + + ```toml + [general] + me_d2c_flush_batch_max_frames = 32 + ``` + +- `me_d2c_flush_batch_max_bytes` + - **Ограничения / валидация**: Должно быть в пределах `4096..=2097152` (байт). + - **Описание**: Максимальное количество байтов полезной нагрузки ME->клиента, объединенных перед сбросом. + - **Пример**: + + ```toml + [general] + me_d2c_flush_batch_max_bytes = 131072 + ``` + +- `me_d2c_flush_batch_max_delay_us` + - **Ограничения / валидация**: `0..=5000` (микросекунды). + - **Описание**: Максимальное время ожидания в микросекундах для объединения большего количества кадров ME->клиента (`0` отключает объединение по времени). + - **Пример**: + + ```toml + [general] + me_d2c_flush_batch_max_delay_us = 500 + ``` + +- `me_d2c_ack_flush_immediate` + - **Ограничения / валидация**: `бул`. + - **Описание**: Сбрасывает запись клиента сразу после записи быстрого подтверждения. + - **Пример**: + + ```toml + [general] + me_d2c_ack_flush_immediate = true + ``` + +- `me_quota_soft_overshoot_bytes` + - **Ограничения / валидация**: `0..=16777216` (байты). + - **Описание**: Дополнительные квоты для каждого маршрута (в байтах) допускаются до того, как принудительное применение квот на стороне записи отбрасывает данные маршрута. + - **Пример**: + + ```toml + [general] + me_quota_soft_overshoot_bytes = 65536 + ``` + +- `me_d2c_frame_buf_shrink_threshold_bytes` + - **Ограничения / валидация**: Должно быть в пределах `4096..=16777216` (байт). + - **Описание**: Пороговое значение для сжатия слишком больших буферов агрегации кадров ME->клиента после очистки. + - **Пример**: + + ```toml + [general] + me_d2c_frame_buf_shrink_threshold_bytes = 262144 + ``` + +- `direct_relay_copy_buf_c2s_bytes` + - **Ограничения / валидация**: Должно быть в пределах `4096..=1048576` (байт). + - **Описание**: Размер буфера копирования для направления клиент->DC в прямой ретрансляции. + - **Пример**: + + ```toml + [general] + direct_relay_copy_buf_c2s_bytes = 65536 + ``` + +- `direct_relay_copy_buf_s2c_bytes` + - **Ограничения / валидация**: Должно быть в пределах `8192..=2097152` (байт). + - **Описание**: Размер буфера копирования для направления DC->клиент при прямой ретрансляции. + - **Пример**: + + ```toml + [general] + direct_relay_copy_buf_s2c_bytes = 262144 + ``` + +- `crypto_pending_buffer` + - **Ограничения / валидация**: `использовать` (байты). + - **Описание**: Максимальный буфер ожидающего зашифрованного текста на каждого клиента-писателя (в байтах). + - **Пример**: + + ```toml + [general] + crypto_pending_buffer = 262144 + ``` + +- `max_client_frame` + - **Ограничения / валидация**: `использовать` (байты). + - **Описание**: Максимально допустимый размер кадра MTProto клиента (в байтах). + - **Пример**: + + ```toml + [general] + max_client_frame = 16777216 + ``` + +- `desync_all_full` + - **Ограничения / валидация**: `бул`. + - **Описание**: Создает полные журналы крипто-рассинхронизации для каждого события. + - **Пример**: + + ```toml + [general] + desync_all_full = false + ``` + +- `beobachten` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает сегменты криминалистического наблюдения для каждого IP-адреса. + - **Пример**: + + ```toml + [general] + beobachten = true + ``` + +- `beobachten_minutes` + - **Ограничения / валидация**: Должно быть `> 0` (минуты). + - **Описание**: Окно хранения (минуты) для сегментов наблюдения по каждому IP-адресу. + - **Пример**: + + ```toml + [general] + beobachten_minutes = 10 + ``` + +- `beobachten_flush_secs` + - **Ограничения / валидация**: Должно быть `> 0` (секунды). + - **Описание**: Интервал сброса моментального снимка (в секундах) для выходного файла наблюдения. + - **Пример**: + + ```toml + [general] + beobachten_flush_secs = 15 + ``` + +- `beobachten_file` + - **Ограничения / валидация**: Не должно быть пустым или содержать только пробелы. + - **Описание**: Путь к выходному файлу снимка наблюдения. + - **Пример**: + + ```toml + [general] + beobachten_file = "cache/beobachten.txt" + ``` + +- `hardswap` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает стратегию жесткой замены ME на основе генерации. + - **Пример**: + + ```toml + [general] + hardswap = true + ``` + +- `me_warmup_stagger_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Перемещает дополнительные шкалы прогрева ME, чтобы избежать всплесков соединения. + - **Пример**: + + ```toml + [general] + me_warmup_stagger_enabled = true + ``` + +- `me_warmup_step_delay_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). + - **Описание**: Базовая задержка в миллисекундах между этапами набора прогрева. + - **Пример**: + + ```toml + [general] + me_warmup_step_delay_ms = 500 + ``` + +- `me_warmup_step_jitter_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). + - **Описание**: Дополнительная случайная задержка в миллисекундах для шагов разминки. + - **Пример**: + + ```toml + [general] + me_warmup_step_jitter_ms = 300 + ``` + +- `me_reconnect_max_concurrent_per_dc` + - **Ограничения / валидация**: `u32`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»). + - **Описание**: Ограничивает число одновременных рабочих повторных подключений на каждый контроллер домена во время восстановления работоспособности. + - **Пример**: + + ```toml + [general] + me_reconnect_max_concurrent_per_dc = 8 + ``` + +- `me_reconnect_backoff_base_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). + - **Описание**: Начальная задержка повторного подключения в миллисекундах. + - **Пример**: + + ```toml + [general] + me_reconnect_backoff_base_ms = 500 + ``` + +- `me_reconnect_backoff_cap_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). + - **Описание**: Максимальное ограничение задержки повторного подключения в миллисекундах. + - **Пример**: + + ```toml + [general] + me_reconnect_backoff_cap_ms = 30000 + ``` + +- `me_reconnect_fast_retry_count` + - **Ограничения / валидация**: `u32`. Эффективное значение — «max(value, 1)» во время выполнения (поэтому «0» ведет себя как «1»). + - **Описание**: Немедленный бюджет повторных попыток, прежде чем применяется поведение длительной отсрочки. + - **Пример**: + + ```toml + [general] + me_reconnect_fast_retry_count = 16 + ``` + +- `me_single_endpoint_shadow_writers` + - **Ограничения / валидация**: Должно быть в пределах `0..=32`. + - **Описание**: Дополнительные резервные модули записи для групп DC только с одной конечной точкой. + - **Пример**: + + ```toml + [general] + me_single_endpoint_shadow_writers = 2 + ``` + +- `me_single_endpoint_outage_mode_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает агрессивный режим восстановления после сбоя для групп DC только с одной конечной точкой. + - **Пример**: + + ```toml + [general] + me_single_endpoint_outage_mode_enabled = true + ``` + +- `me_single_endpoint_outage_disable_quarantine` + - **Ограничения / валидация**: `бул`. + - **Описание**: Игнорирует карантин конечной точки в режиме отключения одной конечной точки. + - **Пример**: + + ```toml + [general] + me_single_endpoint_outage_disable_quarantine = true + ``` + +- `me_single_endpoint_outage_backoff_min_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды) и `<= me_single_endpoint_outage_backoff_max_ms`. + - **Описание**: Минимальная задержка повторного подключения в режиме отключения одной конечной точки. + - **Пример**: + + ```toml + [general] + me_single_endpoint_outage_backoff_min_ms = 250 + ``` + +- `me_single_endpoint_outage_backoff_max_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды) и `>= me_single_endpoint_outage_backoff_min_ms`. + - **Описание**: Максимальная задержка повторного подключения в режиме отключения одной конечной точки. + - **Пример**: + + ```toml + [general] + me_single_endpoint_outage_backoff_max_ms = 3000 + ``` + +- `me_single_endpoint_shadow_rotate_every_secs` + - **Ограничения / валидация**: `u64` (секунды). `0` отключает периодическое вращение тени. + - **Описание**: Периодический интервал ротации теневого записывающего устройства для групп DC с одной конечной точкой. + - **Пример**: + + ```toml + [general] + me_single_endpoint_shadow_rotate_every_secs = 900 + ``` + +- `me_floor_mode` + - **Ограничения / валидация**: «статический» или «адаптивный». + - **Описание**: Режим политики пола для целей записи ME. + - **Пример**: + + ```toml + [general] + me_floor_mode = "adaptive" + ``` + +- `me_adaptive_floor_idle_secs` + - **Ограничения / валидация**: `u64` (секунды). + - **Описание**: Время простоя перед адаптивным ограничением может уменьшить целевую задачу записи с одной конечной точкой. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_idle_secs = 90 + ``` + +- `me_adaptive_floor_min_writers_single_endpoint` + - **Ограничения / валидация**: Должно быть в пределах `1..=32`. + - **Описание**: Минимальная цель записи для групп DC с одной конечной точкой в ​​адаптивном режиме пола. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_min_writers_single_endpoint = 1 + ``` + +- `me_adaptive_floor_min_writers_multi_endpoint` + - **Ограничения / валидация**: Должно быть в пределах `1..=32`. + - **Описание**: Минимальная цель записи для групп DC с несколькими конечными точками в адаптивном режиме пола. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_min_writers_multi_endpoint = 1 + ``` + +- `me_adaptive_floor_recover_grace_secs` + - **Ограничения / валидация**: `u64` (секунды). + - **Описание**: Льготный период для сохранения статического минимума после активности в адаптивном режиме. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_recover_grace_secs = 180 + ``` + +- `me_adaptive_floor_writers_per_core_total` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Глобальный бюджет записи ME на логическое ядро ​​ЦП в адаптивном режиме. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_writers_per_core_total = 48 + ``` + +- `me_adaptive_floor_cpu_cores_override` + - **Ограничения / валидация**: `u16`. `0` использует автоматическое обнаружение во время выполнения. + - **Описание**: Переопределить количество логических ядер ЦП, используемое для адаптивных вычислений минимального уровня. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_cpu_cores_override = 0 + ``` + +- `me_adaptive_floor_max_extra_writers_single_per_core` + - **Ограничения / валидация**: `u16`. + - **Описание**: Максимальное количество дополнительных устройств записи на ядро ​​выше базового требуемого уровня для групп DC с одной конечной точкой. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_extra_writers_single_per_core = 1 + ``` + +- `me_adaptive_floor_max_extra_writers_multi_per_core` + - **Ограничения / валидация**: `u16`. + - **Описание**: Максимальное количество дополнительных устройств записи на ядро ​​выше базового требуемого уровня для групп DC с несколькими конечными точками. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_extra_writers_multi_per_core = 2 + ``` + +- `me_adaptive_floor_max_active_writers_per_core` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Жесткое ограничение для активных устройств записи ME на логическое ядро ​​ЦП. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_active_writers_per_core = 64 + ``` + +- `me_adaptive_floor_max_warm_writers_per_core` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Жесткое ограничение для теплых авторов ME на логическое ядро ​​ЦП. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_warm_writers_per_core = 64 + ``` + +- `me_adaptive_floor_max_active_writers_global` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Жесткий глобальный лимит для активных авторов ME. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_active_writers_global = 256 + ``` + +- `me_adaptive_floor_max_warm_writers_global` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Жесткий глобальный лимит для теплых писателей ME. + - **Пример**: + + ```toml + [general] + me_adaptive_floor_max_warm_writers_global = 256 + ``` + +- `upstream_connect_retry_attempts` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Попытки подключения для выбранного восходящего потока перед возвратом ошибки/резервного варианта. + - **Пример**: + + ```toml + [general] + upstream_connect_retry_attempts = 2 + ``` + +- `upstream_connect_retry_backoff_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). `0` отключает задержку отсрочки (повторные попытки становятся немедленными). + - **Описание**: Задержка в миллисекундах между попытками восходящего соединения. + - **Пример**: + + ```toml + [general] + upstream_connect_retry_backoff_ms = 100 + ``` + +- `upstream_connect_budget_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Общий бюджет настенных часов в миллисекундах для одного запроса восходящего соединения при повторных попытках. + - **Пример**: + + ```toml + [general] + upstream_connect_budget_ms = 3000 + ``` + +- `upstream_unhealthy_fail_threshold` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Последовательные неудачные запросы до того, как восходящий поток будет помечен как неработоспособный. + - **Пример**: + + ```toml + [general] + upstream_unhealthy_fail_threshold = 5 + ``` + +- `upstream_connect_failfast_hard_errors` + - **Ограничения / валидация**: `бул`. + - **Описание**: Если установлено значение true, дополнительные попытки пропускаются при серьезных непереходных ошибках восходящего соединения. + - **Пример**: + + ```toml + [general] + upstream_connect_failfast_hard_errors = false + ``` + +- `stun_iface_mismatch_ignore` + - **Ограничения / валидация**: `бул`. + - **Описание**: Флаг совместимости зарезервирован для использования в будущем. В настоящее время этот ключ анализируется, но не используется средой выполнения. + - **Пример**: + + ```toml + [general] + stun_iface_mismatch_ignore = false + ``` + +- `unknown_dc_log_path` + - **Ограничения / валидация**: `Строка` (необязательно). Должен быть безопасный путь (никаких компонентов `..`, родительский каталог должен существовать); небезопасные пути отклоняются во время выполнения. + - **Описание**: Путь к файлу журнала для неизвестных (нестандартных) запросов DC, когда `unknown_dc_file_log_enabled = true`. Опустите этот ключ, чтобы отключить ведение журнала файлов. + - **Пример**: + + ```toml + [general] + unknown_dc_log_path = "unknown-dc.txt" + ``` + +- `unknown_dc_file_log_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает ведение журнала файла неизвестного DC (записывает строки `dc_idx=`). Требуется установить `unknown_dc_log_path` и на платформах, отличных от Unix, может не поддерживаться. Ведение журналов дедуплицировано и ограничено (записываются только первые ~ 1024 различных неизвестных индекса DC). + - **Пример**: + + ```toml + [general] + unknown_dc_file_log_enabled = false + ``` + +- `log_level` + - **Ограничения / валидация**: «отладка», «многословный», «нормальный» или «тихий». + - **Описание**: Уровень детализации журналирования во время выполнения (используется, если RUST_LOG не установлен). Если в среде установлен RUST_LOG, он имеет приоритет над этим параметром. + - **Пример**: + + ```toml + [general] + log_level = "normal" + ``` + +- `disable_colors` + - **Ограничения / валидация**: `бул`. + - **Описание**: Отключает цвета ANSI в журналах (полезно для файлов/systemd). Это влияет только на форматирование журнала и не меняет уровень/фильтрацию журнала. + - **Пример**: + + ```toml + [general] + disable_colors = false + ``` + +- `me_socks_kdf_policy` + - **Ограничения / валидация**: «строгий» или «совместимый». + - **Описание**: Резервная политика KDF, связанная с SOCKS, для рукопожатия среднего уровня. + - **Пример**: + + ```toml + [general] + me_socks_kdf_policy = "strict" + ``` + +- `me_route_backpressure_base_timeout_ms` + - **Ограничения / валидация**: Должно быть в пределах `1..=5000` (миллисекунд). + - **Описание**: Тайм-аут базового противодавления в миллисекундах для отправки по каналу маршрута ME. + - **Пример**: + + ```toml + [general] + me_route_backpressure_base_timeout_ms = 25 + ``` + +- `me_route_backpressure_high_timeout_ms` + - **Ограничения / валидация**: Должно быть в пределах `1..=5000` (миллисекунды) и `>= me_route_backpressure_base_timeout_ms`. + - **Описание**: Тайм-аут высокого противодавления в миллисекундах, когда занятость очереди превышает водяной знак. + - **Пример**: + + ```toml + [general] + me_route_backpressure_high_timeout_ms = 120 + ``` + +- `me_route_backpressure_high_watermark_pct` + - **Ограничения / валидация**: Должно быть в пределах `1..=100` (процентов). + - **Описание**: Пороговое значение процента занятости очереди для переключения на тайм-аут высокого противодавления. + - **Пример**: + + ```toml + [general] + me_route_backpressure_high_watermark_pct = 80 + ``` + +- `me_health_interval_ms_unhealthy` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Интервал мониторинга работоспособности, когда покрытие записи ME ухудшается. + - **Пример**: + + ```toml + [general] + me_health_interval_ms_unhealthy = 1000 + ``` + +- `me_health_interval_ms_healthy` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Интервал мониторинга работоспособности, пока покрытие записи ME стабильно/работоспособно. + - **Пример**: + + ```toml + [general] + me_health_interval_ms_healthy = 3000 + ``` + +- `me_admission_poll_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Интервал опроса для проверок состояния условного приема. + - **Пример**: + + ```toml + [general] + me_admission_poll_ms = 1000 + ``` + +- `me_warn_rate_limit_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Время восстановления повторяющихся журналов предупреждений ME. + - **Пример**: + + ```toml + [general] + me_warn_rate_limit_ms = 5000 + ``` + +- `me_route_no_writer_mode` + - **Ограничения / валидация**: `"async_recovery_failfast"`, `"inline_recovery_legacy"` или `"hybrid_async_persistent"`. + - **Описание**: Поведение маршрута ME, когда ни один писатель не доступен немедленно. + - **Пример**: + + ```toml + [general] + me_route_no_writer_mode = "hybrid_async_persistent" + ``` + +- `me_route_no_writer_wait_ms` + - **Ограничения / валидация**: Должно быть в пределах `10..=5000` (миллисекунд). + - **Описание**: Максимальное время ожидания, используемое в быстром режиме асинхронного восстановления перед откатом. + - **Пример**: + + ```toml + [general] + me_route_no_writer_wait_ms = 250 + ``` + +- `me_route_hybrid_max_wait_ms` + - **Ограничения / валидация**: Должно быть в пределах `50..=60000` (миллисекунд). + - **Описание**: Максимальное совокупное время ожидания в гибридном режиме без записи перед отказоустойчивым переходом. + - **Пример**: + + ```toml + [general] + me_route_hybrid_max_wait_ms = 3000 + ``` + +- `me_route_blocking_send_timeout_ms` + - **Ограничения / валидация**: Должно быть в пределах `0..=5000` (миллисекунд). `0` сохраняет устаревшее неограниченное поведение ожидания. + - **Описание**: Максимальное ожидание блокировки резервной отправки маршрутного канала. + - **Пример**: + + ```toml + [general] + me_route_blocking_send_timeout_ms = 250 + ``` + +- `me_route_inline_recovery_attempts` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Количество попыток оперативного восстановления в устаревшем режиме. + - **Пример**: + + ```toml + [general] + me_route_inline_recovery_attempts = 3 + ``` + +- `me_route_inline_recovery_wait_ms` + - **Ограничения / валидация**: Должно быть в пределах `10..=30000` (миллисекунд). + - **Описание**: Максимальное время ожидания встроенного восстановления в устаревшем режиме. + - **Пример**: + + ```toml + [general] + me_route_inline_recovery_wait_ms = 3000 + ``` + +- `fast_mode_min_tls_record` + - **Ограничения / валидация**: `использовать` (байты). `0` отключает ограничение. + - **Описание**: Минимальный размер записи TLS при включенном объединении в быстром режиме. + - **Пример**: + + ```toml + [general] + fast_mode_min_tls_record = 0 + ``` + +- `update_every` + - **Ограничения / валидация**: `u64` (секунды). Если установлено, должно быть `> 0`. Если этот ключ не установлен явно, можно использовать устаревшие `proxy_secret_auto_reload_secs` и `proxy_config_auto_reload_secs` (их эффективный минимум должен быть `> 0`). + - **Описание**: Единый интервал обновления для задач обновления ME (getProxyConfig, getProxyConfigV6, getProxySecret). Если этот параметр установлен, он переопределяет устаревшие интервалы перезагрузки прокси-сервера. + - **Пример**: + + ```toml + [general] + update_every = 300 + ``` + +- `me_reinit_every_secs` + - **Ограничения / валидация**: Должно быть `> 0` (секунды). + - **Описание**: Периодический интервал для цикла повторной инициализации ME с нулевым временем простоя. + - **Пример**: + + ```toml + [general] + me_reinit_every_secs = 900 + ``` + +- `me_hardswap_warmup_delay_min_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `<= me_hardswap_warmup_delay_max_ms`. + - **Описание**: Нижняя граница интервала прогрева жесткой замены. + - **Пример**: + + ```toml + [general] + me_hardswap_warmup_delay_min_ms = 1000 + ``` + +- `me_hardswap_warmup_delay_max_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Верхняя граница интервала прогрева жесткой замены. + - **Пример**: + + ```toml + [general] + me_hardswap_warmup_delay_max_ms = 2000 + ``` + +- `me_hardswap_warmup_extra_passes` + - **Ограничения / валидация**: Должно быть в пределах `[0, 10]`. + - **Описание**: Дополнительные прогрева проходят после базового прохода за один цикл жесткой замены. + - **Пример**: + + ```toml + [general] + # default: 3 (allowed range: 0..=10) + me_hardswap_warmup_extra_passes = 3 + ``` + +- `me_hardswap_warmup_pass_backoff_base_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `> 0`. + - **Описание**: Базовая задержка между дополнительными проходами по замене жесткого диска, когда пол еще не завершен. + - **Пример**: + + ```toml + [general] + # default: 500 + me_hardswap_warmup_pass_backoff_base_ms = 500 + ``` + +- `me_config_stable_snapshots` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Количество идентичных снимков конфигурации ME, необходимое для применения. + - **Пример**: + + ```toml + [general] + # require 3 identical snapshots before applying ME endpoint map updates + me_config_stable_snapshots = 3 + ``` + +- `me_config_apply_cooldown_secs` + - **Ограничения / валидация**: `u64`. + - **Описание**: Время восстановления между примененными обновлениями карты конечных точек ME. `0` отключает время восстановления. + - **Пример**: + + ```toml + [general] + # allow applying stable snapshots immediately (no cooldown) + me_config_apply_cooldown_secs = 0 + ``` + +- `me_snapshot_require_http_2xx` + - **Ограничения / валидация**: `бул`. + - **Описание**: Для применения снимков конфигурации ME требуется 2xx HTTP-ответа. Если установлено значение «false», ответы, отличные от 2xx, все равно могут быть проанализированы/учтены программой обновления. + - **Пример**: + + ```toml + [general] + # allow applying snapshots even when the HTTP status is non-2xx + me_snapshot_require_http_2xx = false + ``` + +- `me_snapshot_reject_empty_map` + - **Ограничения / валидация**: `бул`. + - **Описание**: Отклоняет пустые снимки конфигурации ME (без конечных точек). Если установлено значение «false», может быть применен пустой снимок (с учетом других ворот), что может временно уменьшить/очистить карту ME. + - **Пример**: + + ```toml + [general] + # allow applying empty snapshots (use with care) + me_snapshot_reject_empty_map = false + ``` + +- `me_snapshot_min_proxy_for_lines` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Минимальное количество проанализированных строк `proxy_for`, необходимое для принятия снимка. + - **Пример**: + + ```toml + [general] + # require at least 10 proxy_for rows before accepting a snapshot + me_snapshot_min_proxy_for_lines = 10 + ``` + +- `proxy_secret_stable_snapshots` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Количество идентичных снимков с секретом прокси-сервера, необходимых перед ротацией. + - **Пример**: + + ```toml + [general] + # require 2 identical getProxySecret snapshots before rotating at runtime + proxy_secret_stable_snapshots = 2 + ``` + +- `proxy_secret_rotate_runtime` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает ротацию секретов прокси-сервера во время выполнения из снимков средства обновления. + - **Пример**: + + ```toml + [general] + # disable runtime proxy-secret rotation (startup still uses proxy_secret_path/proxy_secret_len_max) + proxy_secret_rotate_runtime = false + ``` + +- `me_secret_atomic_snapshot` + - **Ограничения / валидация**: `бул`. + - **Описание**: Сохраняет селекторные и секретные байты из одного и того же снимка атомарно. Если `general.use_middle_proxy = true`, это автоматически включается во время загрузки конфигурации, чтобы обеспечить согласованность материала ME KDF. + - **Пример**: + + ```toml + [general] + # NOTE: when use_middle_proxy=true, Telemt will auto-enable this during load + me_secret_atomic_snapshot = false + ``` + +- `proxy_secret_len_max` + - **Ограничения / валидация**: Должно быть в пределах `[32, 4096]`. + - **Описание**: Верхний предел длины (в байтах) принимаемого прокси-секрета во время запуска и обновления среды выполнения. + - **Пример**: + + ```toml + [general] + # default: 256 (bytes) + proxy_secret_len_max = 256 + ``` + +- `me_pool_drain_ttl_secs` + - **Ограничения / валидация**: `u64` (секунды). `0` отключает окно дренажного TTL (и подавляет предупреждения дренажного TTL для непустых записывающих устройств дренажа). + - **Описание**: Временной интервал Drain-TTL для устаревших модулей записи ME после изменения карты конечных точек. Во время TTL устаревшие средства записи можно использовать только в качестве резерва для новых привязок (в зависимости от политики привязки). + - **Пример**: + + ```toml + [general] + # disable drain TTL (draining writers won't emit "past drain TTL" warnings) + me_pool_drain_ttl_secs = 0 + ``` + +- `me_instadrain` + - **Ограничения / валидация**: `бул`. + - **Описание**: Принудительно удаляет устаревшие записи записи при следующем такте очистки, минуя ожидание TTL/крайнего срока. + - **Пример**: + + ```toml + [general] + # default: false + me_instadrain = false + ``` + +- `me_pool_drain_threshold` + - **Ограничения / валидация**: `u64`. Установите значение «0», чтобы отключить очистку на основе пороговых значений. + - **Описание**: Максимальное количество устаревших источников записи, прежде чем самые старые из них будут принудительно закрыты в пакетном режиме. + - **Пример**: + + ```toml + [general] + # default: 32 + me_pool_drain_threshold = 32 + ``` + +- `me_pool_drain_soft_evict_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает постепенное мягкое удаление устаревших средств записи во время очистки/повторной инициализации вместо немедленного жесткого закрытия. + - **Пример**: + + ```toml + [general] + # default: true + me_pool_drain_soft_evict_enabled = true + ``` + +- `me_pool_drain_soft_evict_grace_secs` + - **Ограничения / валидация**: `u64` (секунды). Должно быть в пределах `[0, 3600]`. + - **Описание**: Дополнительная льгота (после слива TTL) перед началом этапа мягкого вытеснения. + - **Пример**: + + ```toml + [general] + # default: 10 + me_pool_drain_soft_evict_grace_secs = 10 + ``` + +- `me_pool_drain_soft_evict_per_writer` + - **Ограничения / валидация**: `1..=16`. + - **Описание**: Максимальное количество устаревших маршрутов, мягко вытесняемых на одного автора за один проход выселения. + - **Пример**: + + ```toml + [general] + # default: 2 + me_pool_drain_soft_evict_per_writer = 2 + ``` + +- `me_pool_drain_soft_evict_budget_per_core` + - **Ограничения / валидация**: `1..=64`. + - **Описание**: Бюджет на ядро ​​ограничивает совокупную работу по мягкому вытеснению за проход. + - **Пример**: + + ```toml + [general] + # default: 16 + me_pool_drain_soft_evict_budget_per_core = 16 + ``` + +- `me_pool_drain_soft_evict_cooldown_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть `> 0`. + - **Описание**: Время восстановления между повторяющимися мягкими выселениями одного и того же автора. + - **Пример**: + + ```toml + [general] + # default: 1000 + me_pool_drain_soft_evict_cooldown_ms = 1000 + ``` + +- `me_bind_stale_mode` + - **Ограничения / валидация**: «никогда», «ttl» или «всегда». + - **Описание**: Политика в отношении новых ограничений для устаревших истощающих авторов. + - **Пример**: + + ```toml + [general] + # allow stale binds only for a limited time window + me_bind_stale_mode = "ttl" + ``` + +- `me_bind_stale_ttl_secs` + - **Ограничения / валидация**: `u64`. + - **Описание**: TTL для допуска устаревшей привязки, когда устаревший режим — «ttl». + - **Пример**: + + ```toml + [general] + me_bind_stale_mode = "ttl" + me_bind_stale_ttl_secs = 90 + ``` + +- `me_pool_min_fresh_ratio` + - **Ограничения / валидация**: Должно быть в пределах `[0.0, 1.0]`. + - **Описание**: Минимальный коэффициент покрытия свежих желаемых DC, прежде чем устаревшие авторы будут истощены. + - **Пример**: + + ```toml + [general] + # require >=90% desired-DC coverage before draining stale writers + me_pool_min_fresh_ratio = 0.9 + ``` + +- `me_reinit_drain_timeout_secs` + - **Ограничения / валидация**: `u64`. `0` использует тайм-аут принудительного закрытия для обеспечения безопасности во время выполнения. Если `> 0` и `< me_pool_drain_ttl_secs`, среда выполнения увеличивает значение TTL. + - **Описание**: Тайм-аут принудительного закрытия для слива устаревших авторов. Если установлено значение «0», эффективный тайм-аут представляет собой резервный режим безопасности во время выполнения (300 секунд). + - **Пример**: + + ```toml + [general] + # use runtime safety fallback force-close timeout (300s) + me_reinit_drain_timeout_secs = 0 + ``` + +- `proxy_secret_auto_reload_secs` + - **Ограничения / валидация**: Устарело. Используйте `general.update_every`. Если `general.update_every` не задан явно, эффективный устаревший интервал обновления равен `min(proxy_secret_auto_reload_secs, proxy_config_auto_reload_secs)` и должен быть `> 0`. + - **Описание**: Устаревший устаревший интервал обновления секрета прокси-сервера. Используется только в том случае, если `general.update_every` не установлен. + - **Пример**: + + ```toml + [general] + # legacy mode: omit update_every to use proxy_*_auto_reload_secs + proxy_secret_auto_reload_secs = 600 + proxy_config_auto_reload_secs = 120 + # effective updater interval = min(600, 120) = 120 seconds + ``` + +- `proxy_config_auto_reload_secs` + - **Ограничения / валидация**: Устарело. Используйте `general.update_every`. Если `general.update_every` не задан явно, эффективный устаревший интервал обновления равен `min(proxy_secret_auto_reload_secs, proxy_config_auto_reload_secs)` и должен быть `> 0`. + - **Описание**: Устаревший интервал обновления устаревшей конфигурации ME. Используется только в том случае, если `general.update_every` не установлен. + - **Пример**: + + ```toml + [general] + # legacy mode: omit update_every to use proxy_*_auto_reload_secs + proxy_secret_auto_reload_secs = 600 + proxy_config_auto_reload_secs = 120 + # effective updater interval = min(600, 120) = 120 seconds + ``` + +- `me_reinit_singleflight` + - **Ограничения / валидация**: `бул`. + - **Описание**: Сериализует циклы повторной инициализации ME по источникам триггера. + - **Пример**: + + ```toml + [general] + me_reinit_singleflight = true + ``` + +- `me_reinit_trigger_channel` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Емкость очереди триггеров для планировщика повторной инициализации. + - **Пример**: + + ```toml + [general] + me_reinit_trigger_channel = 64 + ``` + +- `me_reinit_coalesce_window_ms` + - **Ограничения / валидация**: `u64`. + - **Описание**: Запустить окно объединения триггеров перед началом повторной инициализации (мс). + - **Пример**: + + ```toml + [general] + me_reinit_coalesce_window_ms = 200 + ``` + +- `me_deterministic_writer_sort` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает детерминированную сортировку кандидатов для пути привязки записи. + - **Пример**: + + ```toml + [general] + me_deterministic_writer_sort = true + ``` + +- `me_writer_pick_mode` + - **Ограничения / валидация**: `"sorted_rr"` или `"p2c"`. + - **Описание**: Режим выбора записывающего устройства для пути привязки маршрута. + - **Пример**: + + ```toml + [general] + me_writer_pick_mode = "p2c" + ``` + +- `me_writer_pick_sample_size` + - **Ограничения / валидация**: `2..=4`. + - **Описание**: Количество кандидатов, отобранных сборщиком в режиме p2c. + - **Пример**: + + ```toml + [general] + me_writer_pick_mode = "p2c" + me_writer_pick_sample_size = 3 + ``` + +- `ntp_check` + - **Ограничения / валидация**: `бул`. + - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения. + - **Пример**: + + ```toml + [general] + ntp_check = true + ``` + +- `ntp_servers` + - **Ограничения / валидация**: `Строка[]`. + - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения. + - **Пример**: + + ```toml + [general] + ntp_servers = ["pool.ntp.org"] + ``` + +- `auto_degradation_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения. + - **Пример**: + + ```toml + [general] + auto_degradation_enabled = true + ``` + +- `degradation_min_unavailable_dc_groups` + - **Ограничения / валидация**: `u8`. + - **Описание**: Зарезервировано для будущего использования. В настоящее время этот ключ анализируется, но не используется средой выполнения. + - **Пример**: + + ```toml + [general] + degradation_min_unavailable_dc_groups = 2 + ``` + + +## [general.modes] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`classic`](#cfg-general-modes-classic) | `bool` | `false` | +| [`secure`](#cfg-general-modes-secure) | `bool` | `false` | +| [`tls`](#cfg-general-modes-tls) | `bool` | `true` | + + +- `classic` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает классический режим MTProxy. + - **Пример**: + + ```toml + [general.modes] + classic = true + ``` + +- `secure` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает безопасный режим. + - **Пример**: + + ```toml + [general.modes] + secure = true + ``` + +- `tls` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает режим TLS. + - **Пример**: + + ```toml + [general.modes] + tls = true + ``` + + +## [general.links] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`show`](#cfg-general-links-show) | `"*"` or `String[]` | `"*"` | +| [`public_host`](#cfg-general-links-public_host) | `String` | — | +| [`public_port`](#cfg-general-links-public_port) | `u16` | — | + + +- `show` + - **Ограничения / валидация**: `"*"` или `String[]`. Пустой массив означает «не показывать ничего». + - **Описание**: Выбирает пользователей, чьи прокси-ссылки `tg://` отображаются при запуске. + - **Пример**: + + ```toml + [general.links] + show = "*" + # or: + # show = ["alice", "bob"] + ``` + +- `public_host` + - **Ограничения / валидация**: `Строка` (необязательно). + - **Описание**: Переопределение общедоступного имени хоста/IP-адреса, используемое для сгенерированных ссылок `tg://` (переопределяет обнаруженный IP-адрес). + - **Пример**: + + ```toml + [general.links] + public_host = "proxy.example.com" + ``` + +- `public_port` + - **Ограничения / валидация**: `u16` (необязательно). + - **Описание**: Переопределение общедоступного порта, используемое для сгенерированных ссылок `tg://` (переопределяет `server.port`). + - **Пример**: + + ```toml + [general.links] + public_port = 443 + ``` + + +## [general.telemetry] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`core_enabled`](#cfg-general-telemetry-core_enabled) | `bool` | `true` | +| [`user_enabled`](#cfg-general-telemetry-user_enabled) | `bool` | `true` | +| [`me_level`](#cfg-general-telemetry-me_level) | `"silent"`, `"normal"`, or `"debug"` | `"normal"` | + + +- `core_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает основные счетчики телеметрии горячего пути. + - **Пример**: + + ```toml + [general.telemetry] + core_enabled = true + ``` + +- `user_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает счетчики телеметрии для каждого пользователя. + - **Пример**: + + ```toml + [general.telemetry] + user_enabled = true + ``` + +- `me_level` + - **Ограничения / валидация**: «тихий», «нормальный» или «отладка». + - **Описание**: Средний уровень детализации телеметрии. + - **Пример**: + + ```toml + [general.telemetry] + me_level = "normal" + ``` + + +## [network] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`ipv4`](#cfg-network-ipv4) | `bool` | `true` | +| [`ipv6`](#cfg-network-ipv6) | `bool` | `false` | +| [`prefer`](#cfg-network-prefer) | `u8` | `4` | +| [`multipath`](#cfg-network-multipath) | `bool` | `false` | +| [`stun_use`](#cfg-network-stun_use) | `bool` | `true` | +| [`stun_servers`](#cfg-network-stun_servers) | `String[]` | Built-in STUN list (13 hosts) | +| [`stun_tcp_fallback`](#cfg-network-stun_tcp_fallback) | `bool` | `true` | +| [`http_ip_detect_urls`](#cfg-network-http_ip_detect_urls) | `String[]` | `["https://ifconfig.me/ip", "https://api.ipify.org"]` | +| [`cache_public_ip_path`](#cfg-network-cache_public_ip_path) | `String` | `"cache/public_ip.txt"` | +| [`dns_overrides`](#cfg-network-dns_overrides) | `String[]` | `[]` | + + +- `ipv4` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает сеть IPv4. + - **Пример**: + + ```toml + [network] + ipv4 = true + ``` + +- `ipv6` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает/выключает сеть IPv6. Если этот параметр опущен, по умолчанию используется значение «false». + - **Пример**: + + ```toml + [network] + # enable IPv6 explicitly + ipv6 = true + + # or: disable IPv6 explicitly + # ipv6 = false + ``` + +- `prefer` + - **Ограничения / валидация**: Должно быть `4` или `6`. Если `prefer = 4`, а `ipv4 = false`, Telemt принудительно использует `prefer = 6`. Если `prefer = 6`, а `ipv6 = false`, Telemt принудительно использует `prefer = 4`. + - **Описание**: Предпочтительное семейство IP для выбора, если доступны оба семейства. + - **Пример**: + + ```toml + [network] + prefer = 6 + ``` + +- `multipath` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает многопутевое поведение, если это поддерживается платформой и средой выполнения. + - **Пример**: + + ```toml + [network] + multipath = true + ``` + +- `stun_use` + - **Ограничения / валидация**: `бул`. + - **Описание**: Глобальный переключатель STUN; если установлено значение «false», проверка STUN отключается и остается только обнаружение без STUN. + - **Пример**: + + ```toml + [network] + stun_use = false + ``` + +- `stun_servers` + - **Ограничения / валидация**: `Строка[]`. Значения обрезаются; пустые значения удаляются; список дедуплицируется. Если этот ключ **не** установлен явно, Telemt сохраняет встроенный список STUN по умолчанию. + - **Описание**: Список серверов STUN для обнаружения общедоступных IP-адресов. + - **Пример**: + + ```toml + [network] + stun_servers = [ + "stun.l.google.com:19302", + "stun.stunprotocol.org:3478", + ] + ``` + +- `stun_tcp_fallback` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает резервный TCP для STUN, когда путь UDP заблокирован/недоступен. + - **Пример**: + + ```toml + [network] + stun_tcp_fallback = true + ``` + +- `http_ip_detect_urls` + - **Ограничения / валидация**: `Строка[]`. + - **Описание**: Конечные точки HTTP, используемые для обнаружения общедоступных IP-адресов (резервный вариант после STUN). + - **Пример**: + + ```toml + [network] + http_ip_detect_urls = ["https://ifconfig.me/ip", "https://api.ipify.org"] + ``` + +- `cache_public_ip_path` + - **Ограничения / валидация**: `Строка`. + - **Описание**: Путь к файлу, используемый для кэширования обнаруженного общедоступного IP-адреса. + - **Пример**: + + ```toml + [network] + cache_public_ip_path = "cache/public_ip.txt" + ``` + +- `dns_overrides` + - **Ограничения / валидация**: `Строка[]`. Каждая запись должна использовать формат «хост:порт:ip». +- `host`: имя домена (должно быть непустым и не должно содержать `:`) +- `порт`: `u16` +- `ip`: IPv4 (`1.2.3.4`) или IPv6 в квадратных скобках (`[2001:db8::1]`). **IPv6 без скобок отклонен**. + - **Описание**: Переопределения DNS во время выполнения для целей `host:port`. Полезно для принудительного использования определенных IP-адресов для определенных вышестоящих доменов, не затрагивая системный DNS. + - **Пример**: + + ```toml + [network] + dns_overrides = [ + "example.com:443:127.0.0.1", + "example.net:8443:[2001:db8::10]", + ] + ``` + + +## [server] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`port`](#cfg-server-port) | `u16` | `443` | +| [`listen_addr_ipv4`](#cfg-server-listen_addr_ipv4) | `String` | `"0.0.0.0"` | +| [`listen_addr_ipv6`](#cfg-server-listen_addr_ipv6) | `String` | `"::"` | +| [`listen_unix_sock`](#cfg-server-listen_unix_sock) | `String` | — | +| [`listen_unix_sock_perm`](#cfg-server-listen_unix_sock_perm) | `String` | — | +| [`listen_tcp`](#cfg-server-listen_tcp) | `bool` | — (auto) | +| [`proxy_protocol`](#cfg-server-proxy_protocol) | `bool` | `false` | +| [`proxy_protocol_header_timeout_ms`](#cfg-server-proxy_protocol_header_timeout_ms) | `u64` | `500` | +| [`proxy_protocol_trusted_cidrs`](#cfg-server-proxy_protocol_trusted_cidrs) | `IpNetwork[]` | `[]` | +| [`metrics_port`](#cfg-server-metrics_port) | `u16` | — | +| [`metrics_listen`](#cfg-server-metrics_listen) | `String` | — | +| [`metrics_whitelist`](#cfg-server-metrics_whitelist) | `IpNetwork[]` | `["127.0.0.1/32", "::1/128"]` | +| [`max_connections`](#cfg-server-max_connections) | `u32` | `10000` | +| [`accept_permit_timeout_ms`](#cfg-server-accept_permit_timeout_ms) | `u64` | `250` | + + +- `port` + - **Ограничения / валидация**: `u16`. + - **Описание**: Порт прослушивания основного прокси (TCP). + - **Пример**: + + ```toml + [server] + port = 443 + ``` + +- `listen_addr_ipv4` + - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть действительная строка адреса IPv4. + - **Описание**: Адрес привязки IPv4 для прослушивателя TCP (опустите этот ключ, чтобы отключить привязку IPv4). + - **Пример**: + + ```toml + [server] + listen_addr_ipv4 = "0.0.0.0" + ``` + +- `listen_addr_ipv6` + - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть действительная строка адреса IPv6. + - **Описание**: Адрес привязки IPv6 для прослушивателя TCP (опустите этот ключ, чтобы отключить привязку IPv6). + - **Пример**: + + ```toml + [server] + listen_addr_ipv6 = "::" + ``` + +- `listen_unix_sock` + - **Ограничения / валидация**: `Строка` (необязательно). Не должно быть пустым, если установлено. Только Юникс. + - **Описание**: Путь сокета Unix для прослушивателя. Если установлено, `server.listen_tcp` по умолчанию имеет значение `false` (если не указано иное явно). + - **Пример**: + + ```toml + [server] + listen_unix_sock = "/run/telemt.sock" + ``` + +- `listen_unix_sock_perm` + - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, это должна быть восьмеричная строка разрешения, например `"0666"` или `"0777"`. + - **Описание**: Дополнительные разрешения для файлов сокетов Unix, применяемые после привязки (chmod). Если этот параметр опущен, разрешения не изменяются (наследует umask). + - **Пример**: + + ```toml + [server] + listen_unix_sock = "/run/telemt.sock" + listen_unix_sock_perm = "0666" + ``` + +- `listen_tcp` + - **Ограничения / валидация**: `bool` (необязательно). Если этот параметр опущен, Telemt автоматически обнаруживает: +- `true`, если `listen_unix_sock` не установлен +- «false», если установлен «listen_unix_sock». + - **Описание**: Явный прослушиватель TCP включает/отключает переопределение. + - **Пример**: + + ```toml + [server] + # force-enable TCP even when also binding a unix socket + listen_unix_sock = "/run/telemt.sock" + listen_tcp = true + ``` + +- `proxy_protocol` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает анализ протокола HAProxy PROXY при входящих соединениях (PROXY v1/v2). Если этот параметр включен, исходный адрес клиента берется из заголовка PROXY. + - **Пример**: + + ```toml + [server] + proxy_protocol = true + ``` + +- `proxy_protocol_header_timeout_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Таймаут чтения и анализа заголовков протокола PROXY (мс). + - **Пример**: + + ```toml + [server] + proxy_protocol = true + proxy_protocol_header_timeout_ms = 500 + ``` + +- `proxy_protocol_trusted_cidrs` + - **Ограничения / валидация**: `IpNetwork[]`. +- Если этот параметр опущен, по умолчанию используются доверительные все CIDR (`0.0.0.0/0` и `::/0`). +- Если явно задан пустой массив, все заголовки PROXY отклоняются. + - **Описание**: CIDR доверенного источника позволяют предоставлять заголовки протокола PROXY (контроль безопасности). + - **Пример**: + + ```toml + [server] + proxy_protocol = true + proxy_protocol_trusted_cidrs = ["127.0.0.1/32", "10.0.0.0/8"] + ``` + +- `metrics_port` + - **Ограничения / валидация**: `u16` (необязательно). + - **Описание**: Порт конечной точки метрик, совместимый с Prometheus. Если установлено, включает прослушиватель метрик (поведение привязки можно переопределить с помощью `metrics_listen`). + - **Пример**: + + ```toml + [server] + metrics_port = 9090 + ``` + +- `metrics_listen` + - **Ограничения / валидация**: `Строка` (необязательно). Если установлено, оно должно быть в формате IP:PORT. + - **Описание**: Полный адрес привязки метрик (`IP:PORT`) переопределяет `metrics_port` и привязывается только к указанному адресу. + - **Пример**: + + ```toml + [server] + metrics_listen = "127.0.0.1:9090" + ``` + +- `metrics_whitelist` + - **Ограничения / валидация**: `IpNetwork[]`. + - **Описание**: Белый список CIDR для доступа к конечной точке метрик. + - **Пример**: + + ```toml + [server] + metrics_port = 9090 + metrics_whitelist = ["127.0.0.1/32", "::1/128"] + ``` + +- `max_connections` + - **Ограничения / валидация**: `u32`. `0` означает неограниченный. + - **Описание**: Максимальное количество одновременных клиентских подключений. + - **Пример**: + + ```toml + [server] + max_connections = 10000 + ``` + +- `accept_permit_timeout_ms` + - **Ограничения / валидация**: `0..=60000` (миллисекунды). `0` сохраняет устаревшее неограниченное поведение ожидания. + - **Описание**: Максимальное время ожидания получения разрешения на слот подключения, прежде чем принятое соединение будет разорвано. + - **Пример**: + + ```toml + [server] + accept_permit_timeout_ms = 250 + ``` + + +Примечание. Когда `server.proxy_protocol` включен, входящие заголовки протокола PROXY анализируются с первых байтов соединения, а исходный адрес клиента заменяется на `src_addr` из заголовка. В целях безопасности IP-адрес однорангового источника (адрес прямого соединения) проверяется по `server.proxy_protocol_trusted_cidrs`; если этот список пуст, заголовки PROXY отклоняются и соединение считается ненадежным. + +## [server.conntrack_control] + +Примечание. Рабочий процесс conntrack-control работает **только в Linux**. В других операционных системах не запускается; если inline_conntrack_control имеет значение true, записывается предупреждение. Для эффективной работы также требуется **CAP_NET_ADMIN** и пригодный к использованию бэкенд (nft или iptables/ip6tables в PATH). Утилита `conntrack` используется для удаления необязательных записей таблицы под давлением. + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`inline_conntrack_control`](#cfg-server-conntrack_control-inline_conntrack_control) | `bool` | `true` | +| [`mode`](#cfg-server-conntrack_control-mode) | `String` | `"tracked"` | +| [`backend`](#cfg-server-conntrack_control-backend) | `String` | `"auto"` | +| [`profile`](#cfg-server-conntrack_control-profile) | `String` | `"balanced"` | +| [`hybrid_listener_ips`](#cfg-server-conntrack_control-hybrid_listener_ips) | `IpAddr[]` | `[]` | +| [`pressure_high_watermark_pct`](#cfg-server-conntrack_control-pressure_high_watermark_pct) | `u8` | `85` | +| [`pressure_low_watermark_pct`](#cfg-server-conntrack_control-pressure_low_watermark_pct) | `u8` | `70` | +| [`delete_budget_per_sec`](#cfg-server-conntrack_control-delete_budget_per_sec) | `u64` | `4096` | + + +- `inline_conntrack_control` + - **Ограничения / валидация**: `бул`. + - **Описание**: Главный переключатель для задачи conntrack-control во время выполнения: согласовывает правила сетевого фильтра **raw/notrack** для входа прослушивателя (см. `mode`), образцы загружаются каждую секунду и может запускать **`conntrack -D`** удаления для квалификации событий закрытия, пока **pressure mode** активен (см. `delete_budget_per_sec`). Если установлено значение false, правила отслеживания очищаются, а принудительное удаление отключается. + - **Пример**: + + ```toml + [server.conntrack_control] + inline_conntrack_control = true + ``` + +- `mode` + - **Ограничения / валидация**: Один из вариантов: «отслеживаемый», «без отслеживания», «гибридный» (регистронезависимый; сериализованный нижний регистр). + - **Описание**: **`tracked`**: не устанавливать правила telemt notrack (соединения остаются в состоянии conntrack). **`notrack`**: пометить совпадение входящего TCP с `server.port` как notrack — целевые объекты получаются из `[[server.listeners]]`, если таковые имеются, в противном случае из `server.listen_addr_ipv4` / `server.listen_addr_ipv6` (неуказанные адреса означают «любой» для этого семейства). **`hybrid`**: не отслеживать только адреса, перечисленные в `hybrid_listener_ips` (должно быть непустым; проверяется при загрузке). + - **Пример**: + + ```toml + [server.conntrack_control] + mode = "notrack" + ``` + +- `backend` + - **Ограничения / валидация**: Один из `auto`, `nftables`, `iptables` (без учета регистра; сериализованный нижний регистр). + - **Описание**: Какой набор команд применяет правила отслеживания. **`auto`**: используйте `nft`, если он присутствует в `PATH`, иначе `iptables`/`ip6tables`, если он присутствует. **`nftables`** / **`iptables`**: принудительно использовать этот бэкэнд; отсутствие двоичного кода означает, что правила невозможно применить. Путь nft использует таблицу `inet telemt_conntrack` и необработанный перехват предварительной маршрутизации; iptables использует цепочку TELEMT_NOTRACK в таблице raw. + - **Пример**: + + ```toml + [server.conntrack_control] + backend = "auto" + ``` + +- `profile` + - **Ограничения / валидация**: Один из «консервативных», «сбалансированных», «агрессивных» (без учета регистра; сериализованный нижний регистр). + - **Описание**: Когда **режим давления conntrack** активен (водяные знаки `pressure_*`), ограничиваются тайм-ауты простоя и активности, чтобы уменьшить отток коннтреков: например. **первый байт простоя клиента** (`client.rs`), **тайм-аут активности прямой ретрансляции** (`direct_relay.rs`) и **политика простоя среднего реле** (`middle_relay.rs` через `ConntrackPressureProfile::*_cap_secs` / `direct_activity_timeout_secs`). В более агрессивных профилях используются более короткие заглушки. + - **Пример**: + + ```toml + [server.conntrack_control] + profile = "balanced" + ``` + +- `hybrid_listener_ips` + - **Ограничения / валидация**: `IpAddr[]`. Должно быть **непустым**, когда `mode = "hybrid"`. Игнорируется для отслеживаемых/безотслеживаемых сообщений. + - **Описание**: Явные адреса прослушивателя, которые получают правила nottrack в гибридном режиме (разделенные на правила IPv4 и IPv6 в зависимости от реализации). + - **Пример**: + + ```toml + [server.conntrack_control] + mode = "hybrid" + hybrid_listener_ips = ["203.0.113.10", "2001:db8::1"] + ``` + +- `pressure_high_watermark_pct` + - **Ограничения / валидация**: Должно быть в пределах `[1, 100]`. + - **Описание**: Режим давления **входит** при любом из следующих событий: заполнение соединения или `server.max_connections` (в процентах, если `max_connections > 0`), **использование файлового дескриптора** и программное обеспечение процесса `RLIMIT_NOFILE`, **ненулевое** событие `accept_permit_timeout` в последнем окне примера или дельта счетчика **ME c2me send-full**. Ввод сравнивает соответствующие проценты с этой верхней отметкой (см. update_pressure_state в conntrack_control.rs). + - **Пример**: + + ```toml + [server.conntrack_control] + pressure_high_watermark_pct = 85 + ``` + +- `pressure_low_watermark_pct` + - **Ограничения / валидация**: Должно быть **строго меньше** `pressure_high_watermark_pct`. + - **Описание**: Режим давления **сбрасывается** только после **трех** последовательных односекундных выборок, когда все сигналы находятся на уровне этой нижней границы или ниже, а дельты времени ожидания приема/ME-очереди равны нулю (гистерезис). + - **Пример**: + + ```toml + [server.conntrack_control] + pressure_low_watermark_pct = 70 + ``` + +- `delete_budget_per_sec` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Максимальное количество попыток **`conntrack -D`** **в секунду** при активном режиме давления (корзина токенов пополняется каждую секунду). Удаление выполняется только для событий закрытия по причинам **тайм-аут**, **давление** или **сброс**; каждая попытка потребляет токен независимо от результата. + - **Пример**: + + ```toml + [server.conntrack_control] + delete_budget_per_sec = 4096 + ``` + + +## [server.api] + +Примечание. В этом разделе также принимается устаревший псевдоним `[server.admin_api]` (та же схема, что и `[server.api]`). + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`enabled`](#cfg-server-api-enabled) | `bool` | `true` | +| [`listen`](#cfg-server-api-listen) | `String` | `"0.0.0.0:9091"` | +| [`whitelist`](#cfg-server-api-whitelist) | `IpNetwork[]` | `["127.0.0.0/8"]` | +| [`auth_header`](#cfg-server-api-auth_header) | `String` | `""` | +| [`request_body_limit_bytes`](#cfg-server-api-request_body_limit_bytes) | `usize` | `65536` | +| [`minimal_runtime_enabled`](#cfg-server-api-minimal_runtime_enabled) | `bool` | `true` | +| [`minimal_runtime_cache_ttl_ms`](#cfg-server-api-minimal_runtime_cache_ttl_ms) | `u64` | `1000` | +| [`runtime_edge_enabled`](#cfg-server-api-runtime_edge_enabled) | `bool` | `false` | +| [`runtime_edge_cache_ttl_ms`](#cfg-server-api-runtime_edge_cache_ttl_ms) | `u64` | `1000` | +| [`runtime_edge_top_n`](#cfg-server-api-runtime_edge_top_n) | `usize` | `10` | +| [`runtime_edge_events_capacity`](#cfg-server-api-runtime_edge_events_capacity) | `usize` | `256` | +| [`read_only`](#cfg-server-api-read_only) | `bool` | `false` | + + +- `enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает REST API плоскости управления. + - **Пример**: + + ```toml + [server.api] + enabled = true + ``` + +- `listen` + - **Ограничения / валидация**: `Строка`. Должен быть в формате IP:PORT. + - **Описание**: Адрес привязки API в формате IP:PORT. + - **Пример**: + + ```toml + [server.api] + listen = "0.0.0.0:9091" + ``` + +- `whitelist` + - **Ограничения / валидация**: `IpNetwork[]`. + - **Описание**: Белый список CIDR разрешил доступ к API. + - **Пример**: + + ```toml + [server.api] + whitelist = ["127.0.0.0/8"] + ``` + +- `auth_header` + - **Ограничения / валидация**: `Строка`. Пустая строка отключает проверку заголовка аутентификации. + - **Описание**: Точное ожидаемое значение заголовка `Authorization` (статический общий секрет). + - **Пример**: + + ```toml + [server.api] + auth_header = "Bearer MY_TOKEN" + ``` + +- `request_body_limit_bytes` + - **Ограничения / валидация**: Должно быть `> 0` (байты). + - **Описание**: Максимальный принимаемый размер тела HTTP-запроса (в байтах). + - **Пример**: + + ```toml + [server.api] + request_body_limit_bytes = 65536 + ``` + +- `minimal_runtime_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает минимальную логику конечной точки снимков времени выполнения. + - **Пример**: + + ```toml + [server.api] + minimal_runtime_enabled = true + ``` + +- `minimal_runtime_cache_ttl_ms` + - **Ограничения / валидация**: `0..=60000` (миллисекунды). `0` отключает кеш. + - **Описание**: Срок жизни кэша для минимальных снимков времени выполнения (мс). + - **Пример**: + + ```toml + [server.api] + minimal_runtime_cache_ttl_ms = 1000 + ``` + +- `runtime_edge_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает конечные точки границ среды выполнения. + - **Пример**: + + ```toml + [server.api] + runtime_edge_enabled = false + ``` + +- `runtime_edge_cache_ttl_ms` + - **Ограничения / валидация**: `0..=60000` (миллисекунды). + - **Описание**: Срок жизни кэша для полезных данных агрегации границ во время выполнения (мс). + - **Пример**: + + ```toml + [server.api] + runtime_edge_cache_ttl_ms = 1000 + ``` + +- `runtime_edge_top_n` + - **Ограничения / валидация**: `1..=1000`. + - **Описание**: Размер Top-N для таблицы лидеров краевых соединений. + - **Пример**: + + ```toml + [server.api] + runtime_edge_top_n = 10 + ``` + +- `runtime_edge_events_capacity` + - **Ограничения / валидация**: `16..=4096`. + - **Описание**: Емкость кольцевого буфера для пограничных событий во время выполнения. + - **Пример**: + + ```toml + [server.api] + runtime_edge_events_capacity = 256 + ``` + +- `read_only` + - **Ограничения / валидация**: `бул`. + - **Описание**: Отклоняет изменение конечных точек API, если оно включено. + - **Пример**: + + ```toml + [server.api] + read_only = false + ``` + + +## [[server.listeners]] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`ip`](#cfg-server-listeners-ip) | `IpAddr` | — | +| [`announce`](#cfg-server-listeners-announce) | `String` | — | +| [`announce_ip`](#cfg-server-listeners-announce_ip) | `IpAddr` | — | +| [`proxy_protocol`](#cfg-server-listeners-proxy_protocol) | `bool` | — | +| [`reuse_allow`](#cfg-server-listeners-reuse_allow) | `bool` | `false` | + + +- `ip` + - **Ограничения / валидация**: Обязательное поле. Должен быть IPAddr. + - **Описание**: IP-адрес привязки прослушивателя. + - **Пример**: + + ```toml + [[server.listeners]] + ip = "0.0.0.0" + ``` + +- `announce` + - **Ограничения / валидация**: `Строка` (необязательно). Не должно быть пустым, если установлено. + - **Описание**: Публичный IP-адрес/домен, объявленный в прокси-ссылках для этого прослушивателя. Имеет приоритет над announce_ip. + - **Пример**: + + ```toml + [[server.listeners]] + ip = "0.0.0.0" + announce = "proxy.example.com" + ``` + +- `announce_ip` + - **Ограничения / валидация**: `IpAddr` (необязательно). Устарело. Используйте «объявить». + - **Описание**: Устаревший устаревший IP-адрес объявления. Во время загрузки конфигурации он переводится в «announce», если «announce» не установлен. + - **Пример**: + + ```toml + [[server.listeners]] + ip = "0.0.0.0" + announce_ip = "203.0.113.10" + ``` + +- `proxy_protocol` + - **Ограничения / валидация**: `bool` (необязательно). Если установлено, переопределяет `server.proxy_protocol` для этого прослушивателя. + - **Описание**: Переопределение протокола PROXY для каждого слушателя. + - **Пример**: + + ```toml + [server] + proxy_protocol = false + + [[server.listeners]] + ip = "0.0.0.0" + proxy_protocol = true + ``` + +- `reuse_allow` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает `SO_REUSEPORT` для совместного использования привязки нескольких экземпляров (позволяет нескольким экземплярам telemt прослушивать один и тот же `ip:port`). + - **Пример**: + + ```toml + [[server.listeners]] + ip = "0.0.0.0" + reuse_allow = false + ``` + + +## [timeouts] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`client_handshake`](#cfg-timeouts-client_handshake) | `u64` | `30` | +| [`relay_idle_policy_v2_enabled`](#cfg-timeouts-relay_idle_policy_v2_enabled) | `bool` | `true` | +| [`relay_client_idle_soft_secs`](#cfg-timeouts-relay_client_idle_soft_secs) | `u64` | `120` | +| [`relay_client_idle_hard_secs`](#cfg-timeouts-relay_client_idle_hard_secs) | `u64` | `360` | +| [`relay_idle_grace_after_downstream_activity_secs`](#cfg-timeouts-relay_idle_grace_after_downstream_activity_secs) | `u64` | `30` | +| [`tg_connect`](#cfg-timeouts-tg_connect) | `u64` | `10` | +| [`client_keepalive`](#cfg-timeouts-client_keepalive) | `u64` | `15` | +| [`client_ack`](#cfg-timeouts-client_ack) | `u64` | `90` | +| [`me_one_retry`](#cfg-timeouts-me_one_retry) | `u8` | `12` | +| [`me_one_timeout_ms`](#cfg-timeouts-me_one_timeout_ms) | `u64` | `1200` | + + +- `client_handshake` + - **Ограничения / валидация**: Должно быть `> 0`. Значение указано в секундах. Также используется в качестве верхней границы некоторых задержек эмуляции TLS (см. `censorship.server_hello_delay_max_ms`). + - **Описание**: Тайм-аут установления связи клиента (в секундах). + - **Пример**: + + ```toml + [timeouts] + client_handshake = 30 + ``` + +- `relay_idle_policy_v2_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает политику простоя клиента среднего/жесткого промежуточного реле. + - **Пример**: + + ```toml + [timeouts] + relay_idle_policy_v2_enabled = true + ``` + +- `relay_client_idle_soft_secs` + - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<=lay_client_idle_hard_secs`. + - **Описание**: Порог мягкого простоя (в секундах) для неактивности восходящей линии связи клиента среднего ретранслятора. Достижение этого порога отмечает сеанс как бездействующего кандидата (в зависимости от политики он может подлежать очистке). + - **Пример**: + + ```toml + [timeouts] + relay_client_idle_soft_secs = 120 + ``` + +- `relay_client_idle_hard_secs` + - **Ограничения / валидация**: Должно быть `> 0`; должно быть `>=lay_client_idle_soft_secs`. + - **Описание**: Порог жесткого простоя (в секундах) для неактивности восходящей линии связи клиента среднего ретранслятора. Достижение этого порога закрывает сессию. + - **Пример**: + + ```toml + [timeouts] + relay_client_idle_hard_secs = 360 + ``` + +- `relay_idle_grace_after_downstream_activity_secs` + - **Ограничения / валидация**: Должно быть `<=lay_client_idle_hard_secs`. + - **Описание**: Дополнительный льготный период жесткого простоя (в секундах), добавленный после недавней активности в нисходящем направлении. + - **Пример**: + + ```toml + [timeouts] + relay_idle_grace_after_downstream_activity_secs = 30 + ``` + +- `tg_connect` + - **Ограничения / валидация**: `u64`. Значение указано в секундах. + - **Описание**: Тайм-аут восходящего соединения Telegram (в секундах). + - **Пример**: + + ```toml + [timeouts] + tg_connect = 10 + ``` + +- `client_keepalive` + - **Ограничения / валидация**: `u64`. Значение указано в секундах. + - **Описание**: Тайм-аут поддержки активности клиента (в секундах). + - **Пример**: + + ```toml + [timeouts] + client_keepalive = 15 + ``` + +- `client_ack` + - **Ограничения / валидация**: `u64`. Значение указано в секундах. + - **Описание**: Таймаут подтверждения клиента (в секундах). + - **Пример**: + + ```toml + [timeouts] + client_ack = 90 + ``` + +- `me_one_retry` + - **Ограничения / валидация**: `u8`. + - **Описание**: Бюджет попыток быстрого повторного подключения для сценариев DC с одной конечной точкой. + - **Пример**: + + ```toml + [timeouts] + me_one_retry = 12 + ``` + +- `me_one_timeout_ms` + - **Ограничения / валидация**: `u64`. Значение указано в миллисекундах. + - **Описание**: Тайм-аут на быструю попытку (мс) для логики повторного подключения постоянного тока с одной конечной точкой. + - **Пример**: + + ```toml + [timeouts] + me_one_timeout_ms = 1200 + ``` + + +## [censorship] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`tls_domain`](#cfg-censorship-tls_domain) | `String` | `"petrovich.ru"` | +| [`tls_domains`](#cfg-censorship-tls_domains) | `String[]` | `[]` | +| [`unknown_sni_action`](#cfg-censorship-unknown_sni_action) | `"drop"` or `"mask"` | `"drop"` | +| [`tls_fetch_scope`](#cfg-censorship-tls_fetch_scope) | `String` | `""` | +| [`tls_fetch`](#cfg-censorship-tls_fetch) | `Table` | built-in defaults | +| [`mask`](#cfg-censorship-mask) | `bool` | `true` | +| [`mask_host`](#cfg-censorship-mask_host) | `String` | — | +| [`mask_port`](#cfg-censorship-mask_port) | `u16` | `443` | +| [`mask_unix_sock`](#cfg-censorship-mask_unix_sock) | `String` | — | +| [`fake_cert_len`](#cfg-censorship-fake_cert_len) | `usize` | `2048` | +| [`tls_emulation`](#cfg-censorship-tls_emulation) | `bool` | `true` | +| [`tls_front_dir`](#cfg-censorship-tls_front_dir) | `String` | `"tlsfront"` | +| [`server_hello_delay_min_ms`](#cfg-censorship-server_hello_delay_min_ms) | `u64` | `0` | +| [`server_hello_delay_max_ms`](#cfg-censorship-server_hello_delay_max_ms) | `u64` | `0` | +| [`tls_new_session_tickets`](#cfg-censorship-tls_new_session_tickets) | `u8` | `0` | +| [`tls_full_cert_ttl_secs`](#cfg-censorship-tls_full_cert_ttl_secs) | `u64` | `90` | +| [`alpn_enforce`](#cfg-censorship-alpn_enforce) | `bool` | `true` | +| [`mask_proxy_protocol`](#cfg-censorship-mask_proxy_protocol) | `u8` | `0` | +| [`mask_shape_hardening`](#cfg-censorship-mask_shape_hardening) | `bool` | `true` | +| [`mask_shape_hardening_aggressive_mode`](#cfg-censorship-mask_shape_hardening_aggressive_mode) | `bool` | `false` | +| [`mask_shape_bucket_floor_bytes`](#cfg-censorship-mask_shape_bucket_floor_bytes) | `usize` | `512` | +| [`mask_shape_bucket_cap_bytes`](#cfg-censorship-mask_shape_bucket_cap_bytes) | `usize` | `4096` | +| [`mask_shape_above_cap_blur`](#cfg-censorship-mask_shape_above_cap_blur) | `bool` | `false` | +| [`mask_shape_above_cap_blur_max_bytes`](#cfg-censorship-mask_shape_above_cap_blur_max_bytes) | `usize` | `512` | +| [`mask_relay_max_bytes`](#cfg-censorship-mask_relay_max_bytes) | `usize` | `5242880` | +| [`mask_classifier_prefetch_timeout_ms`](#cfg-censorship-mask_classifier_prefetch_timeout_ms) | `u64` | `5` | +| [`mask_timing_normalization_enabled`](#cfg-censorship-mask_timing_normalization_enabled) | `bool` | `false` | +| [`mask_timing_normalization_floor_ms`](#cfg-censorship-mask_timing_normalization_floor_ms) | `u64` | `0` | +| [`mask_timing_normalization_ceiling_ms`](#cfg-censorship-mask_timing_normalization_ceiling_ms) | `u64` | `0` | + + +- `tls_domain` + - **Ограничения / валидация**: Должно быть непустое доменное имя. Не должно содержать пробелов или `/`. + - **Описание**: Основной домен TLS, используемый в профиле подтверждения FakeTLS и в качестве домена SNI по умолчанию. + - **Пример**: + + ```toml + [censorship] + tls_domain = "example.com" + ``` + +- `tls_domains` + - **Ограничения / валидация**: `Строка[]`. Если установлено, значения объединяются с tls_domain и дедуплицируются (первичный tls_domain всегда остается первым). + - **Описание**: Дополнительные домены TLS для создания нескольких прокси-ссылок. + - **Пример**: + + ```toml + [censorship] + tls_domain = "example.com" + tls_domains = ["example.net", "example.org"] + ``` + +- `unknown_sni_action` + - **Ограничения / валидация**: «капля» или «маска». + - **Описание**: Действие для TLS ClientHello с неизвестным/ненастроенным SNI. + - **Пример**: + + ```toml + [censorship] + unknown_sni_action = "drop" + ``` + +- `tls_fetch_scope` + - **Ограничения / валидация**: `Строка`. Значение обрезается во время загрузки; whitespace-only становится пустым. + - **Описание**: Тег области восходящего потока, используемый для выборки метаданных TLS-фронт. Пустое значение сохраняет поведение восходящей маршрутизации по умолчанию. + - **Пример**: + + ```toml + [censorship] + tls_fetch_scope = "fetch" + ``` + +- `tls_fetch` + - **Ограничения / валидация**: Стол. См. раздел «[censorship.tls_fetch]» ниже. + - **Описание**: Настройки стратегии выборки метаданных TLS (начальная загрузка + поведение обновления для данных эмуляции TLS). + - **Пример**: + + ```toml + [censorship.tls_fetch] + strict_route = true + attempt_timeout_ms = 5000 + total_budget_ms = 15000 + ``` + +- `mask` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает режим маскировки/переднего реле. + - **Пример**: + + ```toml + [censorship] + mask = true + ``` + +- `mask_host` + - **Ограничения / валидация**: `Строка` (необязательно). +- Если установлена ​​маска_unix_sock, маска_хост должна быть опущена (взаимоисключающая). +- Если `mask_host` не установлен и `mask_unix_sock` не установлен, Telemt по умолчанию устанавливает для `mask_host` значение `tls_domain`. + - **Описание**: Хост восходящей маски для фронтального реле TLS. + - **Пример**: + + ```toml + [censorship] + mask_host = "www.cloudflare.com" + ``` + +- `mask_port` + - **Ограничения / валидация**: `u16`. + - **Описание**: Восходящий порт маски для фронтального реле TLS. + - **Пример**: + + ```toml + [censorship] + mask_port = 443 + ``` + +- `mask_unix_sock` + - **Ограничения / валидация**: `Строка` (необязательно). +- Не должно быть пустым, если установлено. +- Только Unix; отклонено на платформах, отличных от Unix. +- В Unix должно быть \(\le 107\) байт (ограничение длины пути). +- Взаимоисключающий с `mask_host`. + - **Описание**: Путь сокета Unix для серверной части маски вместо TCP `mask_host`/`mask_port`. + - **Пример**: + + ```toml + [censorship] + mask_unix_sock = "/run/telemt/mask.sock" + ``` + +- `fake_cert_len` + - **Ограничения / валидация**: `использовать`. Когда `tls_emulation = false` и используется значение по умолчанию, Telemt может рандомизировать его при запуске для обеспечения вариативности. + - **Описание**: Длина полезных данных синтетического сертификата, когда данные эмуляции недоступны. + - **Пример**: + + ```toml + [censorship] + fake_cert_len = 2048 + ``` + +- `tls_emulation` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает эмуляцию поведения сертификата/TLS из кэшированных реальных фронтов. + - **Пример**: + + ```toml + [censorship] + tls_emulation = true + ``` + +- `tls_front_dir` + - **Ограничения / валидация**: `Строка`. + - **Описание**: Путь к каталогу для хранения переднего кэша TLS. + - **Пример**: + + ```toml + [censorship] + tls_front_dir = "tlsfront" + ``` + +- `server_hello_delay_min_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). + - **Описание**: Минимальная задержка server_hello для защиты от отпечатков пальцев (мс). + - **Пример**: + + ```toml + [censorship] + server_hello_delay_min_ms = 0 + ``` + +- `server_hello_delay_max_ms` + - **Ограничения / валидация**: `u64` (миллисекунды). Должно быть \(<\) `timeouts.client_handshake * 1000`. + - **Описание**: Максимальная задержка `server_hello` для защиты от отпечатков пальцев (мс). + - **Пример**: + + ```toml + [timeouts] + client_handshake = 30 + + [censorship] + server_hello_delay_max_ms = 0 + ``` + +- `tls_new_session_tickets` + - **Ограничения / валидация**: `u8`. + - **Описание**: Количество сообщений NewSessionTicket, отправляемых после рукопожатия. + - **Пример**: + + ```toml + [censorship] + tls_new_session_tickets = 0 + ``` + +- `tls_full_cert_ttl_secs` + - **Ограничения / валидация**: `u64` (секунды). + - **Описание**: TTL для отправки полной полезной нагрузки сертификата для каждого кортежа (домен, IP-адрес клиента). + - **Пример**: + + ```toml + [censorship] + tls_full_cert_ttl_secs = 90 + ``` + +- `alpn_enforce` + - **Ограничения / валидация**: `бул`. + - **Описание**: Обеспечивает поведение эха ALPN в зависимости от предпочтений клиента. + - **Пример**: + + ```toml + [censorship] + alpn_enforce = true + ``` + +- `mask_proxy_protocol` + - **Ограничения / валидация**: `u8`. `0` = отключено, `1` = v1 (текст), `2` = v2 (двоичный). + - **Описание**: Отправляет заголовок протокола PROXY при подключении к серверной части маски, позволяя серверной части видеть реальный IP-адрес клиента. + - **Пример**: + + ```toml + [censorship] + mask_proxy_protocol = 0 + ``` + +- `mask_shape_hardening` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает усиление жесткости канала формы клиента->маски путем применения контролируемого заполнения хвоста к границам сегмента при отключении реле маски. + - **Пример**: + + ```toml + [censorship] + mask_shape_hardening = true + ``` + +- `mask_shape_hardening_aggressive_mode` + - **Ограничения / валидация**: Требуется «mask_shape_hardening = true». + - **Описание**: Включите агрессивный профиль формирования (более сильное антиклассификаторское поведение с различной семантикой формирования). + - **Пример**: + + ```toml + [censorship] + mask_shape_hardening = true + mask_shape_hardening_aggressive_mode = false + ``` + +- `mask_shape_bucket_floor_bytes` + - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<= Mask_shape_bucket_cap_bytes`. + - **Описание**: Минимальный размер ковша, используемый при закалке в форме канала. + - **Пример**: + + ```toml + [censorship] + mask_shape_bucket_floor_bytes = 512 + ``` + +- `mask_shape_bucket_cap_bytes` + - **Ограничения / валидация**: Должно быть `>= Mask_shape_bucket_floor_bytes`. + - **Описание**: Максимальный размер ковша, используемый при фасонно-канальной закалке; трафик, превышающий ограничение, не дополняется дальше. + - **Пример**: + + ```toml + [censorship] + mask_shape_bucket_cap_bytes = 4096 + ``` + +- `mask_shape_above_cap_blur` + - **Ограничения / валидация**: Требуется «mask_shape_hardening = true». + - **Описание**: Добавляет ограниченные рандомизированные хвостовые байты, даже если пересылаемый размер уже превышает ограничение. + - **Пример**: + + ```toml + [censorship] + mask_shape_hardening = true + mask_shape_above_cap_blur = false + ``` + +- `mask_shape_above_cap_blur_max_bytes` + - **Ограничения / валидация**: Должно быть `<= 1048576`. Должно быть `> 0`, когда `mask_shape_above_cap_blur = true`. + - **Описание**: Максимальное количество случайных дополнительных байтов, добавляемых выше ограничения, если включено размытие выше ограничения. + - **Пример**: + + ```toml + [censorship] + mask_shape_above_cap_blur = true + mask_shape_above_cap_blur_max_bytes = 64 + ``` + +- `mask_relay_max_bytes` + - **Ограничения / валидация**: Должно быть `> 0`; должно быть `<= 67108864`. + - **Описание**: Максимальное количество ретранслируемых байтов в каждом направлении по резервному пути маскировки без аутентификации. + - **Пример**: + + ```toml + [censorship] + mask_relay_max_bytes = 5242880 + ``` + +- `mask_classifier_prefetch_timeout_ms` + - **Ограничения / валидация**: Должно быть в пределах `[5, 50]` (миллисекунды). + - **Описание**: Бюджет тайм-аута (мс) для расширения фрагментированного начального окна классификатора при откате маскирования. + - **Пример**: + + ```toml + [censorship] + mask_classifier_prefetch_timeout_ms = 5 + ``` + +- `mask_timing_normalization_enabled` + - **Ограничения / валидация**: Если задано значение true, требуется маска_timing_normalization_floor_ms > 0 и маска_timing_normalization_ceiling_ms >= Mask_timing_normalization_floor_ms. Потолок должен быть `<= 60000`. + - **Описание**: Включает нормализацию временного конверта для результатов маскировки. + - **Пример**: + + ```toml + [censorship] + mask_timing_normalization_enabled = false + ``` + +- `mask_timing_normalization_floor_ms` + - **Ограничения / валидация**: Должно быть `> 0`, если нормализация времени включена; должно быть `<= Mask_timing_normalization_ceiling_ms`. + - **Описание**: Нижняя граница (мс) для маскировки цели нормализации результата. + - **Пример**: + + ```toml + [censorship] + mask_timing_normalization_floor_ms = 0 + ``` + +- `mask_timing_normalization_ceiling_ms` + - **Ограничения / валидация**: Должно быть `>= Mask_timing_normalization_floor_ms`; должно быть `<= 60000`. + - **Описание**: Верхняя граница (мс) для маскировки цели нормализации результата. + - **Пример**: + + ```toml + [censorship] + mask_timing_normalization_ceiling_ms = 0 + ``` + + +## [censorship.tls_fetch] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`profiles`](#cfg-censorship-tls_fetch-profiles) | `String[]` | `["modern_chrome_like", "modern_firefox_like", "compat_tls12", "legacy_minimal"]` | +| [`strict_route`](#cfg-censorship-tls_fetch-strict_route) | `bool` | `true` | +| [`attempt_timeout_ms`](#cfg-censorship-tls_fetch-attempt_timeout_ms) | `u64` | `5000` | +| [`total_budget_ms`](#cfg-censorship-tls_fetch-total_budget_ms) | `u64` | `15000` | +| [`grease_enabled`](#cfg-censorship-tls_fetch-grease_enabled) | `bool` | `false` | +| [`deterministic`](#cfg-censorship-tls_fetch-deterministic) | `bool` | `false` | +| [`profile_cache_ttl_secs`](#cfg-censorship-tls_fetch-profile_cache_ttl_secs) | `u64` | `600` | + + +- `profiles` + - **Ограничения / валидация**: `Строка[]`. Пустой список возвращает значения по умолчанию; значения дедуплицируются с сохранением порядка. + - **Описание**: Упорядоченная резервная цепочка профиля ClientHello для выборки метаданных TLS-фронт. + - **Пример**: + + ```toml + [censorship.tls_fetch] + profiles = ["modern_chrome_like", "compat_tls12"] + ``` + +- `strict_route` + - **Ограничения / валидация**: `бул`. + - **Описание**: Если true и восходящий маршрут настроен, выборка TLS не закрывается из-за ошибок восходящего соединения вместо возврата к прямому TCP. + - **Пример**: + + ```toml + [censorship.tls_fetch] + strict_route = true + ``` + +- `attempt_timeout_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Бюджет таймаута на одну попытку получения профиля TLS (мс). + - **Пример**: + + ```toml + [censorship.tls_fetch] + attempt_timeout_ms = 5000 + ``` + +- `total_budget_ms` + - **Ограничения / валидация**: Должно быть `> 0` (миллисекунды). + - **Описание**: Общий бюджет настенных часов для всех попыток TLS-выборки (мс). + - **Пример**: + + ```toml + [censorship.tls_fetch] + total_budget_ms = 15000 + ``` + +- `grease_enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает случайные значения в стиле GREASE в выбранных расширениях ClientHello для получения трафика. + - **Пример**: + + ```toml + [censorship.tls_fetch] + grease_enabled = false + ``` + +- `deterministic` + - **Ограничения / валидация**: `бул`. + - **Описание**: Включает детерминированную случайность ClientHello для отладки/тестирования. + - **Пример**: + + ```toml + [censorship.tls_fetch] + deterministic = false + ``` + +- `profile_cache_ttl_secs` + - **Ограничения / валидация**: `u64` (секунды). `0` отключает кеш. + - **Описание**: TTL для записей кэша профиля победителя, используемых путем выборки TLS. + - **Пример**: + + ```toml + [censorship.tls_fetch] + profile_cache_ttl_secs = 600 + ``` + + +### Shape-channel hardening notes (`[censorship]`) + +Эти параметры предназначены для уменьшения одного конкретного источника отпечатков пальцев во время маскировки: точного количества байтов, отправленных с прокси-сервера на «mask_host» для недействительного или пробного трафика. + +Без усиления цензор часто может очень точно сопоставить входную длину зонда с длиной, наблюдаемой серверной частью (например: `5 + body_sent` на ранних путях отклонения TLS). Это создает сигнал классификатора на основе длины. + +When `mask_shape_hardening = true`, Telemt pads the **client->mask** stream tail to a bucket boundary at relay shutdown: + +- Сначала измеряется общее количество байтов, отправленных в маску. +- Ведро выбирается с использованием степеней двойки, начиная с «mask_shape_bucket_floor_bytes». +— Заполнение добавляется только в том случае, если общее количество байтов меньше «mask_shape_bucket_cap_bytes». +- Если байты уже превышают ограничение, дополнительное дополнение не добавляется. + +Это означает, что несколько близлежащих размеров зондов объединяются в один и тот же класс размеров, наблюдаемый серверной частью, что усложняет активную классификацию. + +Что каждый параметр меняет на практике: + +- `mask_shape_hardening` +Включает или отключает весь этот этап формирования длины на резервном пути. +Если установлено значение «false», длина, наблюдаемая серверной частью, остается близкой к реальной длине пересылаемого зонда. +Если задано значение true, при чистом отключении реле могут добавляться случайные байты заполнения для перемещения итоговой суммы в корзину. +- `mask_shape_bucket_floor_bytes` +Устанавливает первую границу сегмента, используемую для небольших зондов. +Пример: с этажом «512» некорректный зонд, который в противном случае пересылал бы «37» байтов, может быть расширен до «512» байтов в чистом EOF. +Большие минимальные значения лучше скрывают очень маленькие зонды, но увеличивают стоимость выхода. +- `mask_shape_bucket_cap_bytes` +Устанавливает самый большой сегмент, который Telemt будет дополнять логикой сегмента. +Пример: с ограничением `4096` общее количество пересылаемых байтов `1800` может быть дополнено до `2048` или `4096` в зависимости от лестницы сегментов, но общее количество, уже превышающее `4096`, не будет дополняться дальше. +Большие значения ограничения увеличивают диапазон, в котором сворачиваются классы размеров, но также увеличивают накладные расходы в худшем случае. +- Чистый EOF имеет значение в консервативном режиме. +В профиле по умолчанию заполнение формы намеренно консервативно: оно применяется при чистом отключении реле, а не при каждом тайм-ауте или пути утечки. +Это позволяет избежать появления новых артефактов тайм-аута, которые некоторые серверные части или тесты интерпретируют как отдельные отпечатки пальцев. + +Практические компромиссы: + +- Улучшена защита от отпечатков пальцев на канале размера/формы. +- Немного выше выходные накладные расходы для небольших зондов из-за заполнения. +- Поведение намеренно консервативно и включено по умолчанию. + +Рекомендуемый стартовый профиль: + +- `mask_shape_hardening = true` (default) +- `mask_shape_bucket_floor_bytes = 512` +- `mask_shape_bucket_cap_bytes = 4096` + +### Aggressive mode notes (`[censorship]`) + +«mask_shape_hardening_aggressive_mode» — это дополнительный профиль для более высокого давления антиклассификатора. + +- По умолчанию установлено значение «false», чтобы сохранить консервативное поведение по тайм-ауту/без хвоста. +- Requires `mask_shape_hardening = true`. +- Если этот параметр включен, могут формироваться бесшумные пути маскировки без EOF. +- При включении вместе с размытием над верхним пределом случайный дополнительный хвост использует `[1, max]` вместо `[0, max]`. + +Что меняется при включении агрессивного режима: + +- Могут быть сформированы пути тайм-аута, не требующие бэкенда. +В режиме по умолчанию клиент, который держит сокет полуоткрытым и имеет тайм-аут, обычно не будет получать заполнение формы по этому пути. +В агрессивном режиме Telemt все равно может формировать этот сеанс без звука, если никакие байты серверной части не были возвращены. +Это специально предназначено для активных зондов, которые пытаются избежать EOF, чтобы сохранить точную наблюдаемую длину. +- Размытие над заглавной буквой всегда добавляет хотя бы один байт. +В режиме по умолчанию для размытия над пределом может быть выбрано значение «0», поэтому некоторые зонды слишком большого размера по-прежнему попадают на точную базовую длину пересылки. +В агрессивном режиме эта базовая выборка удаляется автоматически. +- Компромисс +Агрессивный режим повышает устойчивость к активным классификаторам длины, но он более упрям ​​и менее консервативен. +Если в вашем развертывании приоритетом является строгая совместимость с семантикой тайм-аута/без хвоста, оставьте ее отключенной. +Если ваша модель угроз включает в себя повторяющиеся активные проверки цензором, этот режим является более сильным профилем. + +Используйте этот режим только в том случае, если ваша модель угроз отдает приоритет устойчивости классификатора над строгой совместимостью с консервативной семантикой маскировки. + +### Above-cap blur notes (`[censorship]`) + +«mask_shape_above_cap_blur» добавляет размытие второго этапа для очень больших зондов, которые уже находятся выше «mask_shape_bucket_cap_bytes». + +- В режиме по умолчанию добавляется случайный хвост в `[0, Mask_shape_above_cap_blur_max_bytes]`. +— В агрессивном режиме случайный хвост становится строго положительным: `[1, Mask_shape_above_cap_blur_max_bytes]`. +- Это уменьшает утечку точного размера выше ограничения при ограниченных накладных расходах. +— Сохраняйте «mask_shape_above_cap_blur_max_bytes» консервативным, чтобы избежать ненужного роста выходного сигнала. + +Операционное значение: + +- Без размытия над шапкой +Зонд, который пересылает 5005 байтов, по-прежнему будет выглядеть как 5005 байт на серверную часть, если он уже превышает ограничение. +- С включенным размытием над шапкой +Тот же самый зонд может выглядеть как любое значение в ограниченном окне, превышающем его базовую длину. + Example with `mask_shape_above_cap_blur_max_bytes = 64`: +наблюдаемый на сервере размер становится «5005..5069» в режиме по умолчанию или «5006..5069» в агрессивном режиме. +- Выбор `mask_shape_above_cap_blur_max_bytes` +Небольшие значения снижают затраты, но сохраняют большую степень разделения между удаленными друг от друга негабаритными классами. +Большие значения размывают слишком большие классы более агрессивно, но добавляют больше исходящих издержек и большую дисперсию выходных данных. + +### Timing normalization envelope notes (`[censorship]`) + +`mask_timing_normalization_enabled` сглаживает разницу во времени между результатами маскировки, применяя целевой диапазон длительности. + +- Случайная цель выбирается в `[mask_timing_normalization_floor_ms, Mask_timing_normalization_ceiling_ms]`. +- Быстрые пути задерживаются до выбранной цели. +- Медленные пути не обязательно заканчиваются у потолка (огибающая формируется с максимальной эффективностью, а не усекается). + +Рекомендуемый стартовый профиль для формирования тайминга: + +- `mask_timing_normalization_enabled = true` +- `mask_timing_normalization_floor_ms = 180` +- `mask_timing_normalization_ceiling_ms = 320` + +Если ваша серверная часть или сеть сильно ограничена в пропускной способности, сначала уменьшите ограничение. Если датчики все еще слишком различимы в вашей среде, постепенно увеличивайте минимальное значение. + +## [access] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`users`](#cfg-access-users) | `Map` | `{"default": "000…000"}` | +| [`user_ad_tags`](#cfg-access-user_ad_tags) | `Map` | `{}` | +| [`user_max_tcp_conns`](#cfg-access-user_max_tcp_conns) | `Map` | `{}` | +| [`user_max_tcp_conns_global_each`](#cfg-access-user_max_tcp_conns_global_each) | `usize` | `0` | +| [`user_expirations`](#cfg-access-user_expirations) | `Map>` | `{}` | +| [`user_data_quota`](#cfg-access-user_data_quota) | `Map` | `{}` | +| [`user_max_unique_ips`](#cfg-access-user_max_unique_ips) | `Map` | `{}` | +| [`user_max_unique_ips_global_each`](#cfg-access-user_max_unique_ips_global_each) | `usize` | `0` | +| [`user_max_unique_ips_mode`](#cfg-access-user_max_unique_ips_mode) | `"active_window"`, `"time_window"`, or `"combined"` | `"active_window"` | +| [`user_max_unique_ips_window_secs`](#cfg-access-user_max_unique_ips_window_secs) | `u64` | `30` | +| [`replay_check_len`](#cfg-access-replay_check_len) | `usize` | `65536` | +| [`replay_window_secs`](#cfg-access-replay_window_secs) | `u64` | `120` | +| [`ignore_time_skew`](#cfg-access-ignore_time_skew) | `bool` | `false` | + + +- `users` + - **Ограничения / валидация**: Не должно быть пустым (должен существовать хотя бы один пользователь). Каждое значение должно состоять **ровно из 32 шестнадцатеричных символов**. + - **Описание**: Карта учетных данных пользователя, используемая для аутентификации клиента. Ключи — это имена пользователей; значения являются секретами MTProxy. + - **Пример**: + + ```toml + [access.users] + alice = "00112233445566778899aabbccddeeff" + bob = "0123456789abcdef0123456789abcdef" + ``` + +- `user_ad_tags` + - **Ограничения / валидация**: Каждое значение должно содержать **ровно 32 шестнадцатеричных символа** (тот же формат, что и `general.ad_tag`). Тег со всеми нулями разрешен, но регистрирует предупреждение. + - **Описание**: Переопределение рекламного тега спонсируемого канала для каждого пользователя. Когда у пользователя есть запись здесь, она имеет приоритет над `general.ad_tag`. + - **Пример**: + + ```toml + [general] + ad_tag = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + [access.user_ad_tags] + alice = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + ``` + +- `user_max_tcp_conns` + - **Ограничения / валидация**: `Карта`. + - **Описание**: Максимальное количество одновременных TCP-соединений для каждого пользователя. + - **Пример**: + + ```toml + [access.user_max_tcp_conns] + alice = 500 + ``` + +- `user_max_tcp_conns_global_each` + - **Ограничения / валидация**: `использовать`. `0` отключает унаследованный лимит. + - **Описание**: Глобальное максимальное количество одновременных TCP-соединений для каждого пользователя, применяется, когда у пользователя **нет положительной** записи в `[access.user_max_tcp_conns]` (отсутствующий ключ или значение `0` подпадают под этот параметр). Ограничения на пользователя, превышающие «0» в «user_max_tcp_conns», имеют приоритет. + - **Пример**: + + ```toml + [access] + user_max_tcp_conns_global_each = 200 + + [access.user_max_tcp_conns] + alice = 500 # uses 500, not the global cap + # bob has no entry → uses 200 + ``` + +- `user_expirations` + - **Ограничения / валидация**: `Карта>`. Каждое значение должно быть допустимой датой и временем RFC3339/ISO-8601. + - **Описание**: Временные метки истечения срока действия учетной записи пользователя (UTC). + - **Пример**: + + ```toml + [access.user_expirations] + alice = "2026-12-31T23:59:59Z" + ``` + +- `user_data_quota` + - **Ограничения / валидация**: `Карта`. + - **Описание**: Квота трафика на пользователя в байтах. + - **Пример**: + + ```toml + [access.user_data_quota] + alice = 1073741824 # 1 GiB + ``` + +- `user_max_unique_ips` + - **Ограничения / валидация**: `Карта`. + - **Описание**: Ограничения на уникальные исходные IP-адреса для каждого пользователя. + - **Пример**: + + ```toml + [access.user_max_unique_ips] + alice = 16 + ``` + +- `user_max_unique_ips_global_each` + - **Ограничения / валидация**: `использовать`. `0` отключает унаследованный лимит. + - **Описание**: Глобальный лимит уникального IP-адреса для каждого пользователя применяется, когда у пользователя нет индивидуального переопределения в `[access.user_max_unique_ips]`. + - **Пример**: + + ```toml + [access] + user_max_unique_ips_global_each = 8 + ``` + +- `user_max_unique_ips_mode` + - **Ограничения / валидация**: Должно быть одно из «active_window», «time_window», «combined». + - **Описание**: Режим учета лимита уникальных IP-адресов источника. + - **Пример**: + + ```toml + [access] + user_max_unique_ips_mode = "active_window" + ``` + +- `user_max_unique_ips_window_secs` + - **Ограничения / валидация**: Должно быть `> 0`. + - **Описание**: Размер окна (в секундах), используемый режимами учета уникальных IP-адресов, включающими временное окно («time_window» и «комбинированный»). + - **Пример**: + + ```toml + [access] + user_max_unique_ips_window_secs = 30 + ``` + +- `replay_check_len` + - **Ограничения / валидация**: `использовать`. + - **Описание**: Длина хранилища для защиты от повторения (количество записей, отслеживаемых на предмет обнаружения дубликатов). + - **Пример**: + + ```toml + [access] + replay_check_len = 65536 + ``` + +- `replay_window_secs` + - **Ограничения / валидация**: `u64`. + - **Описание**: Временное окно защиты от повтора в секундах. + - **Пример**: + + ```toml + [access] + replay_window_secs = 120 + ``` + +- `ignore_time_skew` + - **Ограничения / валидация**: `бул`. + - **Описание**: Отключает проверку перекоса временных меток клиента и сервера при проверке воспроизведения, если она включена. + - **Пример**: + + ```toml + [access] + ignore_time_skew = false + ``` + + +## [[upstreams]] + + +| Ключ | Тип | По умолчанию | +| --- | ---- | ------- | +| [`type`](#cfg-upstreams-type) | `"direct"`, `"socks4"`, `"socks5"`, or `"shadowsocks"` | — | +| [`weight`](#cfg-upstreams-weight) | `u16` | `1` | +| [`enabled`](#cfg-upstreams-enabled) | `bool` | `true` | +| [`scopes`](#cfg-upstreams-scopes) | `String` | `""` | +| [`interface`](#cfg-upstreams-interface) | `String` | — | +| [`bind_addresses`](#cfg-upstreams-bind_addresses) | `String[]` | — | +| [`url`](#cfg-upstreams-url) | `String` | — | +| [`address`](#cfg-upstreams-address) | `String` | — | +| [`user_id`](#cfg-upstreams-user_id) | `String` | — | +| [`username`](#cfg-upstreams-username) | `String` | — | +| [`password`](#cfg-upstreams-password) | `String` | — | + + +- `type` + - **Ограничения / валидация**: Обязательное поле. Должен быть одним из: `"direct"`, `"socks4"`, `"socks5"`, `"shadowsocks"`. + - **Описание**: Выбирает реализацию восходящего транспорта для этой записи `[[upstreams]]`. + - **Пример**: + + ```toml + [[upstreams]] + type = "direct" + + [[upstreams]] + type = "socks5" + address = "127.0.0.1:9050" + + [[upstreams]] + type = "shadowsocks" + url = "ss://2022-blake3-aes-256-gcm:BASE64PASSWORD@127.0.0.1:8388" + ``` + +- `weight` + - **Ограничения / валидация**: `u16` (0..=65535). + - **Описание**: Базовый вес, используемый взвешенно-случайным выбором в восходящем направлении (выше = выбирается чаще). + - **Пример**: + + ```toml + [[upstreams]] + type = "direct" + weight = 10 + ``` + +- `enabled` + - **Ограничения / валидация**: `бул`. + - **Описание**: Если установлено значение false, эта запись игнорируется и не используется для выбора в восходящем направлении. + - **Пример**: + + ```toml + [[upstreams]] + type = "socks5" + address = "127.0.0.1:9050" + enabled = false + ``` + +- `scopes` + - **Ограничения / валидация**: `Строка`. Список, разделенный запятыми; пробелы обрезаются во время сопоставления. + - **Описание**: Теги области, используемые для восходящей фильтрации на уровне запроса. Если в запросе указана область, могут быть выбраны только восходящие потоки, чьи `области` содержат этот тег. Если в запросе не указана область, допускаются только восходящие потоки с пустыми «областями». + - **Пример**: + + ```toml + [[upstreams]] + type = "socks4" + address = "10.0.0.10:1080" + scopes = "me, fetch, dc2" + ``` + +- `interface` + - **Ограничения / валидация**: `Строка` (необязательно). +- Для «прямого»: может быть IP-адрес (используемый как явная локальная привязка) или имя интерфейса ОС (преобразующееся в IP-адрес во время выполнения; только для Unix). +- Для `"socks4"`/`"socks5"`: поддерживается только тогда, когда `address` является литералом`IP:port`; когда `address` является именем хоста, привязка интерфейса игнорируется. +- Для `"shadowsocks"`: передается в коннектор Shadowsocks как необязательная подсказка для исходящей привязки. + - **Описание**: Необязательный исходящий интерфейс/подсказка локальной привязки для восходящего сокета подключения. + - **Пример**: + + ```toml + [[upstreams]] + type = "direct" + interface = "eth0" + + [[upstreams]] + type = "socks5" + address = "203.0.113.10:1080" + interface = "192.0.2.10" # explicit local bind IP + ``` + +- `bind_addresses` + - **Ограничения / валидация**: `String[]` (необязательно). Применяется только к `type = "direct"`. +- Каждая запись должна представлять собой строку IP-адреса. +- Во время выполнения Telemt выбирает адрес, соответствующий целевому семейству (IPv4 или IPv6). Если установлен параметр «bind_addresses», и ни один из них не соответствует целевому семейству, попытка подключения не удалась. + - **Описание**: Явные локальные адреса источника для исходящих прямых TCP-подключений. Если указано несколько адресов, выбор осуществляется по кругу. + - **Пример**: + + ```toml + [[upstreams]] + type = "direct" + bind_addresses = ["192.0.2.10", "192.0.2.11"] + ``` + +- `url` + - **Ограничения / валидация**: Применяется только к `type = "shadowsocks"`. +- Должен быть действительный URL-адрес Shadowsocks, принятый ящиком Shadowsocks. +- Плагины Shadowsocks не поддерживаются. + - Requires `general.use_middle_proxy = false` (shadowsocks upstreams are rejected in ME mode). + - **Описание**: URL-адрес сервера Shadowsocks, используемый для подключения к Telegram через ретранслятор Shadowsocks. + - **Пример**: + + ```toml + [general] + use_middle_proxy = false + + [[upstreams]] + type = "shadowsocks" + url = "ss://2022-blake3-aes-256-gcm:BASE64PASSWORD@127.0.0.1:8388" + ``` + +- `address` + - **Ограничения / валидация**: Требуется для `type = "socks4"` и `type = "socks5"`. Должно быть `host:port` или `ip:port`. + - **Описание**: Конечная точка прокси-сервера SOCKS, используемая для восходящих подключений. + - **Пример**: + + ```toml + [[upstreams]] + type = "socks5" + address = "127.0.0.1:9050" + ``` + +- `user_id` + - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks4"`. + - **Описание**: Идентификатор пользователя SOCKS4 CONNECT. Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области. + - **Пример**: + + ```toml + [[upstreams]] + type = "socks4" + address = "127.0.0.1:1080" + user_id = "telemt" + ``` + +- `username` + - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks5"`. + - **Описание**: Имя пользователя SOCKS5 (для аутентификации по имени пользователя и паролю). Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области. + - **Пример**: + + ```toml + [[upstreams]] + type = "socks5" + address = "127.0.0.1:9050" + username = "alice" + ``` + +- `password` + - **Ограничения / валидация**: `Строка` (необязательно). Только для `type="socks5"`. + - **Описание**: Пароль SOCKS5 (для аутентификации по имени пользователя и паролю). Примечание. Когда выбрана область запроса, Telemt может переопределить ее с помощью выбранного значения области. + - **Пример**: + + ```toml + [[upstreams]] + type = "socks5" + address = "127.0.0.1:9050" + username = "alice" + password = "secret" + ``` + + diff --git a/docs/FAQ.en.md b/docs/FAQ.en.md index 5e5a78a..7d477b2 100644 --- a/docs/FAQ.en.md +++ b/docs/FAQ.en.md @@ -1,5 +1,4 @@ ## How to set up a "proxy sponsor" channel and statistics via the @MTProxybot - 1. Go to the @MTProxybot. 2. Enter the `/newproxy` command. 3. Send your server's IP address and port. For example: `1.2.3.4:443`. @@ -32,13 +31,130 @@ use_middle_proxy = true hello = "ad_tag" hello2 = "ad_tag2" ``` +## Recognizability for DPI and crawler -## Why do you need a middle proxy (ME) +On April 1, 2026, we became aware of a method for detecting MTProxy Fake-TLS, +based on the ECH extension and the ordering of cipher suites, +as well as an overall unique JA3/JA4 fingerprint +that does not occur in modern browsers: +we have already submitted initial changes to the Telegram Desktop developers and are working on updates for other clients. + +- We consider this a breakthrough aspect, which has no stable analogues today +- Based on this: if `telemt` configured correctly, **TLS mode is completely identical to real-life handshake + communication** with a specified host +- Here is our evidence: + - 212.220.88.77 - "dummy" host, running `telemt` + - `petrovich.ru` - `tls` + `masking` host, in HEX: `706574726f766963682e7275` + - **No MITM + No Fake Certificates/Crypto** = pure transparent *TCP Splice* to "best" upstream: MTProxy or tls/mask-host: + - DPI see legitimate HTTPS to `tls_host`, including *valid chain-of-trust* and entropy + - Crawlers completely satisfied receiving responses from `mask_host` + ### Client WITH secret-key accesses the MTProxy resource: + + telemt + + ### Client WITHOUT secret-key gets transparent access to the specified resource: + - with trusted certificate + - with original handshake + - with full request-response way + - with low-latency overhead +```bash +root@debian:~/telemt# curl -v -I --resolve petrovich.ru:443:212.220.88.77 https://petrovich.ru/ +* Added petrovich.ru:443:212.220.88.77 to DNS cache +* Hostname petrovich.ru was found in DNS cache +* Trying 212.220.88.77:443... +* Connected to petrovich.ru (212.220.88.77) port 443 (#0) +* ALPN: offers h2,http/1.1 +* TLSv1.3 (OUT), TLS handshake, Client hello (1): +* CAfile: /etc/ssl/certs/ca-certificates.crt +* CApath: /etc/ssl/certs +* TLSv1.3 (IN), TLS handshake, Server hello (2): +* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): +* TLSv1.3 (IN), TLS handshake, Certificate (11): +* TLSv1.3 (IN), TLS handshake, CERT verify (15): +* TLSv1.3 (IN), TLS handshake, Finished (20): +* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): +* TLSv1.3 (OUT), TLS handshake, Finished (20): +* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 +* ALPN: server did not agree on a protocol. Uses default. +* Server certificate: +* subject: C=RU; ST=Saint Petersburg; L=Saint Petersburg; O=STD Petrovich; CN=*.petrovich.ru +* start date: Jan 28 11:21:01 2025 GMT +* expire date: Mar 1 11:21:00 2026 GMT +* subjectAltName: host "petrovich.ru" matched cert's "petrovich.ru" +* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018 +* SSL certificate verify ok. +* using HTTP/1.x +> HEAD / HTTP/1.1 +> Host: petrovich.ru +> User-Agent: curl/7.88.1 +> Accept: */* +> +* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): +* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): +* old SSL session ID is stale, removing +< HTTP/1.1 200 OK +HTTP/1.1 200 OK +< Server: Variti/0.9.3a +Server: Variti/0.9.3a +< Date: Thu, 01 Jan 2026 00:0000 GMT +Date: Thu, 01 Jan 2026 00:0000 GMT +< Access-Control-Allow-Origin: * +Access-Control-Allow-Origin: * +< Content-Type: text/html +Content-Type: text/html +< Cache-Control: no-store +Cache-Control: no-store +< Expires: Thu, 01 Jan 2026 00:0000 GMT +Expires: Thu, 01 Jan 2026 00:0000 GMT +< Pragma: no-cache +Pragma: no-cache +< Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/ +Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/ +< Content-Type: text/html +Content-Type: text/html +< Content-Length: 31253 +Content-Length: 31253 +< Connection: keep-alive +Connection: keep-alive +< Keep-Alive: timeout=60 +Keep-Alive: timeout=60 + +< +* Connection #0 to host petrovich.ru left intact + +``` +- We challenged ourselves, we kept trying and we didn't only *beat the air*: now, we have something to show you + - Do not just take our word for it? - This is great and we respect that: you can build your own `telemt` or download a build and check it right now + + +## F.A.Q. + +### Telegram Calls via MTProxy +- Telegram architecture **does NOT allow calls via MTProxy**, but only via SOCKS5, which cannot be obfuscated + +### How does DPI see MTProxy TLS? +- DPI sees MTProxy in Fake TLS (ee) mode as TLS 1.3 +- the SNI you specify sends both the client and the server; +- ALPN is similar to HTTP 1.1/2; +- high entropy, which is normal for AES-encrypted traffic; + +### Whitelist on IP +- MTProxy cannot work when there is: + - no IP connectivity to the target host: Russian Whitelist on Mobile Networks - "Белый список" + - OR all TCP traffic is blocked + - OR high entropy/encrypted traffic is blocked: content filters at universities and critical infrastructure + - OR all TLS traffic is blocked + - OR specified port is blocked: use 443 to make it "like real" + - OR provided SNI is blocked: use "officially approved"/innocuous name +- like most protocols on the Internet; +- these situations are observed: + - in China behind the Great Firewall + - in Russia on mobile networks, less in wired networks + - in Iran during "activity" + +### Why do you need a middle proxy (ME) https://github.com/telemt/telemt/discussions/167 - -## How many people can use one link - +### How many people can use one link By default, an unlimited number of people can use a single link. However, you can limit the number of unique IP addresses for each user: ```toml @@ -47,8 +163,7 @@ hello = 1 ``` This parameter sets the maximum number of unique IP addresses from which a single link can be used simultaneously. If the first user disconnects, a second one can connect. At the same time, multiple users can connect from a single IP address simultaneously (for example, devices on the same Wi-Fi network). -## How to create multiple different links - +### How to create multiple different links 1. Generate the required number of secrets using the command: `openssl rand -hex 16`. 2. Open the configuration file: `nano /etc/telemt/telemt.toml`. 3. Add new users to the `[access.users]` section: @@ -64,7 +179,7 @@ user3 = "00000000000000000000000000000003" curl -s http://127.0.0.1:9091/v1/users | jq ``` -## "Unknown TLS SNI" error +### "Unknown TLS SNI" error Usually, this error occurs if you have changed the `tls_domain` parameter, but users continue to connect using old links with the previous domain. If you need to allow connections with any domains (ignoring SNI mismatches), add the following parameters: @@ -73,7 +188,7 @@ If you need to allow connections with any domains (ignoring SNI mismatches), add unknown_sni_action = "mask" ``` -## How to view metrics +### How to view metrics 1. Open the configuration file: `nano /etc/telemt/telemt.toml`. 2. Add the following parameters: @@ -87,6 +202,25 @@ metrics_whitelist = ["127.0.0.1/32", "::1/128", "0.0.0.0/0"] > [!WARNING] > The value `"0.0.0.0/0"` in `metrics_whitelist` opens access to metrics from any IP address. It is recommended to replace it with your personal IP, for example: `"1.2.3.4/32"`. +### Too many open files +- On a fresh Linux install the default open file limit is low; under load `telemt` may fail with `Accept error: Too many open files` +- **Systemd**: add `LimitNOFILE=65536` to the `[Service]` section (already included in the example above) +- **Docker**: add `--ulimit nofile=65536:65536` to your `docker run` command, or in `docker-compose.yml`: +```yaml +ulimits: + nofile: + soft: 65536 + hard: 65536 +``` +- **System-wide** (optional): add to `/etc/security/limits.conf`: +``` +* soft nofile 1048576 +* hard nofile 1048576 +root soft nofile 1048576 +root hard nofile 1048576 +``` + + ## Additional parameters ### Domain in the link instead of IP diff --git a/docs/FAQ.ru.md b/docs/FAQ.ru.md index fa7d5c0..a3bba17 100644 --- a/docs/FAQ.ru.md +++ b/docs/FAQ.ru.md @@ -32,11 +32,145 @@ use_middle_proxy = true hello = "ad_tag" hello2 = "ad_tag2" ``` +## Распознаваемость для DPI и сканеров + +1 апреля 2026 года нам стало известно о методе обнаружения MTProxy Fake-TLS, основанном на расширении ECH и порядке набора шифров, +а также об общем уникальном отпечатке JA3/JA4, который не встречается в современных браузерах: мы уже отправили первоначальные изменения разработчикам Telegram Desktop и работаем над обновлениями для других клиентов. + +- Мы считаем это прорывом, которому на сегодняшний день нет стабильных аналогов; +- Исходя из этого: если `telemt` настроен правильно, **режим TLS полностью идентичен реальному «рукопожатию» + обмену данными** с указанным хостом; +- Вот наши доказательства: + - 212.220.88.77 — «фиктивный» хост, на котором запущен `telemt`; + - `petrovich.ru` — хост с `tls` + `masking`, в HEX: `706574726f766963682e7275`; + - **Без MITM + без поддельных сертификатов/шифрования** = чистое прозрачное *TCP Splice* к «лучшему» исходному серверу: MTProxy или tls/mask-host: + - DPI видит легитимный HTTPS к `tls_host`, включая *достоверную цепочку доверия* и энтропию; + - Краулеры полностью удовлетворены получением ответов от `mask_host`. + + ### Клиент С секретным ключом получает доступ к ресурсу MTProxy: + + telemt + + ### Клиент БЕЗ секретного ключа получает прозрачный доступ к указанному ресурсу: + - с доверенным сертификатом; + - с исходным «рукопожатием»; + - с полным циклом запрос-ответ; + - с низкой задержкой. + +```bash +root@debian:~/telemt# curl -v -I --resolve petrovich.ru:443:212.220.88.77 https://petrovich.ru/ +* Added petrovich.ru:443:212.220.88.77 to DNS cache +* Hostname petrovich.ru was found in DNS cache +* Trying 212.220.88.77:443... +* Connected to petrovich.ru (212.220.88.77) port 443 (#0) +* ALPN: offers h2,http/1.1 +* TLSv1.3 (OUT), TLS handshake, Client hello (1): +* CAfile: /etc/ssl/certs/ca-certificates.crt +* CApath: /etc/ssl/certs +* TLSv1.3 (IN), TLS handshake, Server hello (2): +* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): +* TLSv1.3 (IN), TLS handshake, Certificate (11): +* TLSv1.3 (IN), TLS handshake, CERT verify (15): +* TLSv1.3 (IN), TLS handshake, Finished (20): +* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): +* TLSv1.3 (OUT), TLS handshake, Finished (20): +* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 +* ALPN: server did not agree on a protocol. Uses default. +* Server certificate: +* subject: C=RU; ST=Saint Petersburg; L=Saint Petersburg; O=STD Petrovich; CN=*.petrovich.ru +* start date: Jan 28 11:21:01 2025 GMT +* expire date: Mar 1 11:21:00 2026 GMT +* subjectAltName: host "petrovich.ru" matched cert's "petrovich.ru" +* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018 +* SSL certificate verify ok. +* using HTTP/1.x +> HEAD / HTTP/1.1 +> Host: petrovich.ru +> User-Agent: curl/7.88.1 +> Accept: */* +> +* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): +* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): +* old SSL session ID is stale, removing +< HTTP/1.1 200 OK +HTTP/1.1 200 OK +< Server: Variti/0.9.3a +Server: Variti/0.9.3a +< Date: Thu, 01 Jan 2026 00:0000 GMT +Date: Thu, 01 Jan 2026 00:0000 GMT +< Access-Control-Allow-Origin: * +Access-Control-Allow-Origin: * +< Content-Type: text/html +Content-Type: text/html +< Cache-Control: no-store +Cache-Control: no-store +< Expires: Thu, 01 Jan 2026 00:0000 GMT +Expires: Thu, 01 Jan 2026 00:0000 GMT +< Pragma: no-cache +Pragma: no-cache +< Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/ +Set-Cookie: ipp_uid=XXXXX/XXXXX/XXXXX==; Expires=Tue, 31 Dec 2040 23:59:59 GMT; Domain=.petrovich.ru; Path=/ +< Content-Type: text/html +Content-Type: text/html +< Content-Length: 31253 +Content-Length: 31253 +< Connection: keep-alive +Connection: keep-alive +< Keep-Alive: timeout=60 +Keep-Alive: timeout=60 + +< +* Connection #0 to host petrovich.ru left intact + +``` +- Мы поставили перед собой задачу, не сдавались и не просто «бились в пустоту»: теперь у нас есть что вам показать. +- Не верите нам на слово? — Это прекрасно, и мы уважаем ваше решение: вы можете собрать свой собственный `telemt` или скачать готовую сборку и проверить её прямо сейчас. + +### Звонки в Telegram через MTProxy +- Архитектура Telegram **НЕ поддерживает звонки через MTProxy**, а только через SOCKS5, который невозможно замаскировать + +### Как DPI распознает TLS-соединение MTProxy? +- DPI распознает MTProxy в режиме Fake TLS (ee) как TLS 1.3 +- указанный вами SNI отправляется как клиентом, так и сервером; +- ALPN аналогичен HTTP 1.1/2; +- высокая энтропия, что нормально для трафика, зашифрованного AES; + +### Белый список по IP +- MTProxy не может работать, если: + - отсутствует IP-связь с целевым хостом: российский белый список в мобильных сетях — «Белый список»; + - ИЛИ весь TCP-трафик заблокирован; + - ИЛИ трафик с высокой энтропией/зашифрованный трафик заблокирован: контент-фильтры в университетах и критически важной инфраструктуре; + - ИЛИ весь TLS-трафик заблокирован; + - ИЛИ заблокирован указанный порт: используйте 443, чтобы сделать его «как настоящий»; + - ИЛИ заблокирован предоставленный SNI: используйте «официально одобренное»/безобидное имя; +- как и большинство протоколов в Интернете; +- такие ситуации наблюдаются: + - в Китае за Великим файрволом; + - в России в мобильных сетях, реже в проводных сетях; + - в Иране во время «активности». + ## Зачем нужен middle proxy (ME) https://github.com/telemt/telemt/discussions/167 +## Что такое dd и ee в контексте MTProxy? + +Это два разных режима работы прокси. Понять, какой режим используется, можно взглянув на начало секрета — там будет dd или ee, вот пример: +tg://proxy?server=s1.dimasssss.space&port=443&secret=eebe3007e927acd147dde12bee8b1a7c9364726976652e676f6f676c652e636f6d + +dd — режим с мусорным трафиком, обфускацией данных, похожий на shadowsocks. У такого трафика есть заметный паттерн, который DPI умеют распознавать и впоследствии блокировать. Использовать этот режим на текущий момент не рекомендуется. + +ee — режим маскировки под существующий домен (FakeTLS), словно вы сёрфите в интернете через браузер. На текущий момент не попадает под блокировку. + +### Где эти режимы настраиваются? + +```toml +В конфиге telemt.toml в разделе [general.modes]: +classic = false # классический режим, давно стал бесполезным +secure = false # переменная dd-режима +tls = true # переменная ee-режима +``` + ## Сколько человек может пользоваться одной ссылкой По умолчанию одной ссылкой может пользоваться неограниченное число людей. @@ -104,7 +238,7 @@ max_connections = 10000 # 0 - без ограничений, 10000 - по у ``` ### Upstream Manager -Для настройки исходящих подключений (апстримов) добавьте соответствующие параметры в секцию `[[upstreams]]` файла конфигурации: +Для настройки исходящих подключений (Upstreams) добавьте соответствующие параметры в секцию `[[upstreams]]` файла конфигурации: #### Привязка к исходящему IP-адресу ```toml @@ -119,20 +253,20 @@ interface = "192.168.1.100" # Замените на ваш исходящий IP - Без авторизации: ```toml [[upstreams]] -type = "socks5" # Specify SOCKS4 or SOCKS5 -address = "1.2.3.4:1234" # SOCKS-server Address -weight = 1 # Set Weight for Scenarios +type = "socks5" # выбор типа SOCKS4 или SOCKS5 +address = "1.2.3.4:1234" # адрес сервера SOCKS +weight = 1 # вес enabled = true ``` - С авторизацией: ```toml [[upstreams]] -type = "socks5" # Specify SOCKS4 or SOCKS5 -address = "1.2.3.4:1234" # SOCKS-server Address -username = "user" # Username for Auth on SOCKS-server -password = "pass" # Password for Auth on SOCKS-server -weight = 1 # Set Weight for Scenarios +type = "socks5" # выбор типа SOCKS4 или SOCKS5 +address = "1.2.3.4:1234" # адрес сервера SOCKS +username = "user" # имя пользователя +password = "pass" # пароль +weight = 1 # вес enabled = true ``` diff --git a/docs/OPENBSD.en.md b/docs/Quick_start/OPENBSD_QUICK_START_GUIDE.en.md similarity index 100% rename from docs/OPENBSD.en.md rename to docs/Quick_start/OPENBSD_QUICK_START_GUIDE.en.md diff --git a/docs/QUICK_START_GUIDE.en.md b/docs/Quick_start/QUICK_START_GUIDE.en.md similarity index 100% rename from docs/QUICK_START_GUIDE.en.md rename to docs/Quick_start/QUICK_START_GUIDE.en.md diff --git a/docs/QUICK_START_GUIDE.ru.md b/docs/Quick_start/QUICK_START_GUIDE.ru.md similarity index 100% rename from docs/QUICK_START_GUIDE.ru.md rename to docs/Quick_start/QUICK_START_GUIDE.ru.md diff --git a/docs/VPS_DOUBLE_HOP.en.md b/docs/Setup_examples/VPS_DOUBLE_HOP.en.md similarity index 100% rename from docs/VPS_DOUBLE_HOP.en.md rename to docs/Setup_examples/VPS_DOUBLE_HOP.en.md diff --git a/docs/VPS_DOUBLE_HOP.ru.md b/docs/Setup_examples/VPS_DOUBLE_HOP.ru.md similarity index 100% rename from docs/VPS_DOUBLE_HOP.ru.md rename to docs/Setup_examples/VPS_DOUBLE_HOP.ru.md diff --git a/docs/XRAY-SINGBOX-ROUTING.ru.md b/docs/Setup_examples/XRAY-SINGBOX-ROUTING.ru.md similarity index 100% rename from docs/XRAY-SINGBOX-ROUTING.ru.md rename to docs/Setup_examples/XRAY-SINGBOX-ROUTING.ru.md diff --git a/docs/assets/telegram_button.png b/docs/assets/telegram_button.png new file mode 100644 index 0000000..eb649d3 Binary files /dev/null and b/docs/assets/telegram_button.png differ diff --git a/docs/assets/telemt.png b/docs/assets/telemt.png new file mode 100644 index 0000000..653e383 Binary files /dev/null and b/docs/assets/telemt.png differ