## Типы `--payload` в zapret2 Параметр `--payload` определяет **тип содержимого пакета** (payload type), к которому будут применяться последующие LUA-функции desync. ### 📋 **Полный список типов payload:** #### 🔹 **Специальные типы** 1. **`all`** - все пакеты (любой payload) 2. **`unknown`** - неопознанный тип данных 3. **`empty`** - пустой пакет (без данных) 4. **`known`** - любой известный тип (все кроме `unknown` и `empty`) #### 🔹 **HTTP** 5. **`http_req`** - HTTP запрос (GET, POST и т.д.) 6. **`http_reply`** - HTTP ответ сервера #### 🔹 **TLS/SSL** 7. **`tls_client_hello`** - TLS Client Hello (начало TLS handshake от клиента) 8. **`tls_server_hello`** - TLS Server Hello (ответ сервера) #### 🔹 **QUIC** 9. **`quic_initial`** - QUIC Initial пакет #### 🔹 **WireGuard VPN** 10. **`wireguard_initiation`** - WireGuard инициация соединения 11. **`wireguard_response`** - WireGuard ответ 12. **`wireguard_cookie`** - WireGuard cookie пакет 13. **`wireguard_keepalive`** - WireGuard keepalive 14. **`wireguard_data`** - WireGuard данные #### 🔹 **P2P и мессенджеры** 15. **`dht`** - DHT (Distributed Hash Table, используется в BitTorrent) 16. **`discord_ip_discovery`** - Discord IP discovery пакет 17. **`stun`** - STUN протокол (используется для NAT traversal) #### 🔹 **XMPP (Jabber)** 18. **`xmpp_stream`** - XMPP stream 19. **`xmpp_starttls`** - XMPP STARTTLS команда 20. **`xmpp_proceed`** - XMPP proceed ответ 21. **`xmpp_features`** - XMPP features #### 🔹 **DNS** 22. **`dns_query`** - DNS запрос 23. **`dns_response`** - DNS ответ #### 🔹 **Telegram** 24. **`mtproto_initial`** - MTProto initial пакет (протокол Telegram) --- ### 💡 **Синтаксис использования:** ```bash # Один тип --payload=tls_client_hello # Несколько типов (через запятую) --payload=http_req,http_reply # Все известные типы --payload=known # Все пакеты --payload=all # Отрицание (все КРОМЕ указанных) --payload=~empty ``` ### 📝 **Важные особенности:** 1. **По умолчанию**: если `--payload` не указан, используется `known` (только известные непустые типы) 2. **Отрицание**: префикс `~` означает инверсию - `--payload=~empty` - все кроме пустых пакетов - `--payload=~unknown` - все кроме неопознанных 3. **Множественные фильтры**: можно использовать несколько раз в одном профиле ```bash --payload=tls_client_hello --lua-desync=fake \ --payload=http_req --lua-desync=split ``` 4. **Связь с протоколом**: - Протокол соединения (`--filter-l7`) определяется для всего соединения - Payload type определяется для каждого пакета отдельно - Пример: протокол `tls`, но payload может быть `tls_client_hello` или `tls_server_hello` ### 📖 **Примеры использования:** ```bash # Только для TLS Client Hello --filter-l7=tls --payload=tls_client_hello --lua-desync=fake # Для HTTP запросов и ответов --payload=http_req,http_reply --lua-desync=multisplit # Для всех известных типов (по умолчанию) --payload=known --lua-desync=fake # Для всех пакетов включая пустые --payload=all --lua-desync=send # Исключить пустые пакеты --payload=~empty --lua-desync=fake # Комбинация: разные стратегии для разных payload --payload=tls_client_hello --lua-desync=fake:ip_ttl=1 \ --payload=http_req --lua-desync=split:pos=method+2 ``` Типы payload позволяют **точно таргетировать** desync-стратегии на конкретные типы данных в пакетах, что делает обход DPI более эффективным и избирательным! ## Фильтр payload по умолчанию ```1074:1079:lua/zapret-lib.lua function payload_match_filter(l7payload, l7payload_filter, def) local argpl = l7payload_filter or def or "known" local neg = string.sub(argpl,1,1)=="~" local pl = neg and string.sub(argpl,2) or argpl return neg ~= (in_list(pl, "all") or in_list(pl, l7payload) or in_list(pl, "known") and l7payload~="unknown" and l7payload~="empty") end ``` **По умолчанию фильтр = "known"**, что означает: - ✅ Пропускает любой известный payload (`mtproto_initial`, `tls_client_hello`, и т.д.) - ❌ **НЕ пропускает `unknown`** - ❌ **НЕ пропускает `empty`** ## Для MTProto | Пакет | l7payload | Пройдёт "known"? | |-------|-----------|------------------| | Первый пакет с данными | `mtproto_initial` | ✅ Да | | Последующие пакеты | `unknown` | ❌ **Нет** | ## Нужно ли указывать `payload=unknown`? **Зависит от цели:** ### Если нужен только initial (обычный случай): ```bash # Достаточно - unknown пакеты игнорируются автоматически nfqws2 --filter-l7=mtproto \ --payload=mtproto_initial \ --lua-desync=fake:blob=0x00000000 ``` ### Если нужны ВСЕ пакеты MTProto: ```bash # Вариант 1: явно указать unknown nfqws2 --filter-l7=mtproto \ --payload=mtproto_initial --lua-desync=fake:blob=... \ --payload=unknown --lua-desync=send:ip_ttl=3 # Вариант 2: использовать all nfqws2 --filter-l7=mtproto \ --payload=all \ --lua-desync=fake:blob=... ``` ## Практический совет Для обхода блокировки Telegram обычно **достаточно `mtproto_initial`**, потому что: 1. DPI анализирует только начало соединения (сигнатуру MTProto) 2. После initial все данные зашифрованы - DPI их не парсит 3. Если initial прошёл - соединение установлено ```bash # Рекомендуемый вариант nfqws2 --filter-l7=mtproto \ --payload=mtproto_initial \ --lua-desync=fake:blob=0x00000000:repeats=3 ``` **Ответ: Нет, обычно НЕ нужно указывать `payload=unknown`** для MTProto — достаточно обработать только `mtproto_initial`.