## 📋 **Что это такое** `--lua-desync` — это **главный механизм** desync в nfqws2. Он вызывает Lua функцию **для каждого пакета**, проходящего через профиль. ### **Синтаксис:** ```bash --lua-desync=<функция>[:параметр1=значение1[:параметр2=значение2]] ``` --- ## 🔧 **Как это работает** ``` Пакет → профиль → --lua-desync → Lua функция → действие ``` 1. Пакет проходит через фильтры профиля (`--filter-tcp`, `--filter-l7`, `--hostlist`) 2. Если пакет соответствует фильтрам → вызывается Lua функция 3. Функция выполняет действие (отправляет fake, разбивает пакет, модифицирует и т.д.) 4. Функция возвращает вердикт (`VERDICT_PASS`, `VERDICT_DROP`, `VERDICT_MODIFY`) --- ## 📦 **Доступные функции из `zapret-antidpi.lua`** Аргументы | Категория | Аргумент | Описание | | ----------- | ------------------------- | ---------------------------------------- | | Direction | dir | in \| out \| any | | Fooling | ip_ttl=N | TTL для IPv4 | | | ip6_ttl=N | TTL для IPv6 | | | ip_autottl=delta,min-max | Авто-определение TTL | | | ip6_autottl=delta,min-max | Авто-определение TTL для IPv6 | | | ip6_hopbyhop[=hex] | Добавить hop-by-hop заголовок | | | ip6_hopbyhop2[=hex] | Второй hop-by-hop | | | ip6_destopt[=hex] | Destopt заголовок | | | ip6_destopt2[=hex] | Второй destopt | | | ip6_routing[=hex] | Routing заголовок | | | ip6_ah[=hex] | Authentication заголовок | | | tcp_seq=N | Добавить N к tcp.th_seq | | | tcp_ack=N | Добавить N к tcp.th_ack | | | tcp_ts=N | Добавить N к timestamp | | | tcp_md5[=hex] | Добавить MD5 опцию | | | tcp_flags_set=<list> | Установить TCP флаги | | | tcp_flags_unset=<list> | Снять TCP флаги | | | tcp_ts_up | Переместить timestamp наверх | | | fool=<func> | Кастомная функция fooling | | Reconstruct | badsum | Невалидная L4 checksum | | Rawsend | repeats | Сколько раз отправить пакет | | | ifout | Override исходящего интерфейса | | | fwmark | Override fwmark | | Payload | payload | Список разрешённых типов payload | | IP_ID | ip_id | seq\|rnd\|zero\|none | | | ip_id_conn | Сохранять ip_id между пакетами | | IPfrag | ipfrag[=func] | Функция фрагментации (default: ipfrag2) | | | ipfrag_disorder | Отправить фрагменты в обратном порядке | | | ipfrag_pos_udp | Позиция UDP фрагмента (default: 8) | | | ipfrag_pos_tcp | Позиция TCP фрагмента (default: 32) | | | ipfrag_next | Next protocol для второго фрагмента IPv6 | ### Базовые: | Функция | Описание | |---------|----------| | `drop` | Отбросить пакет | | `send` | Отправить пакет как есть (с возможной модификацией заголовков) | | `pktmod` | Модифицировать заголовки пакета (fooling) | | Функция | Std args | Специфичные args | |---------|---------------------------------------------------------|------------------| | drop | direction, payload | - | | send | direction, fooling, ip_id, ipfrag, rawsend, reconstruct | - | | pktmod | direction, fooling, ip_id | - | ### HTTP модификации: | Функция | Описание | |---------|----------| | `http_domcase` | Изменить регистр домена (HoSt) | | `http_hostcase` | Изменить регистр заголовка Host | | `http_methodeol` | Модифицировать конец строки метода | ### TCP сплит и disorder: | Функция | Описание | |---------|----------| | `multisplit` | Разбить пакет на несколько TCP сегментов | | `multidisorder` | Разбить + отправить в обратном порядке | | `tcpseg` | TCP сегментация | | Функция | Std args | Специфичные args | |---------------|------------------------------------------------------------------|------------------------------------------------------------------------------------| | multisplit | direction, payload, fooling, ip_id, rawsend, reconstruct, ipfrag | pos=<list> (default: "2"), seqovl=N, seqovl_pattern=<blob>, blob=<blob>, nodrop | | multidisorder | direction, payload, fooling, ip_id, rawsend, reconstruct, ipfrag | pos=<list> (default: "2"), seqovl=N, seqovl_pattern=<blob>, blob=<blob>, nodrop | | tcpseg | direction, payload, fooling, ip_id, rawsend, reconstruct, ipfrag | pos=<list> (обязательный, 2 позиции), seqovl=N, seqovl_pattern=<blob>, blob=<blob> | ### Fake-атаки: | Функция | Описание | | --------------- | ----------------------------- | | `fake` | Отправить fake пакет | | `fakedsplit` | Fake + сплит оригинала | | `fakeddisorder` | Fake + disorder оригинала | | `hostfakesplit` | Fake только для хоста + сплит | | Функция | Std args | Специфичные args | |---------------|------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------| | fake | direction, payload, fooling, ip_id, rawsend, reconstruct, ipfrag | blob=<blob> (обязательный), tls_mod=<list> (rnd,rndsni,sni=,dupsid,padencap) | | fakedsplit | direction, payload, fooling, ip_id, rawsend, reconstruct | pos=<marker> (default: "2"), nofake1, nofake2, nofake3, nofake4, pattern=<blob>, seqovl=N, seqovl_pattern=<blob>, blob=<blob>, nodrop | | fakeddisorder | direction, payload, fooling, ip_id, rawsend, reconstruct | pos=<marker> (default: "2"), nofake1-4, pattern=<blob>, seqovl=N, seqovl_pattern=<blob>, blob=<blob>, nodrop | | hostfakesplit | direction, payload, fooling, ip_id, rawsend, reconstruct | host=<str> (шаблон хоста), midhost=<marker>, nofake1, nofake2, disorder_after=<marker>, blob=<blob>, nodrop | ### SYN-атаки: | Функция | Описание | |---------|----------| | `syndata` | Отправить SYN с данными | | `synack` | Работа с SYN/ACK | | `synack_split` | Сплит по SYN/ACK | ### Window size: | Функция | Описание | |---------|----------| | `wsize` | Изменить window size на SYN-ACK | | `wssize` | Изменить window size на всех пакетах | ### Прочее: | Функция | Описание | |---------|----------| | `rst` | Отправить RST | | `udplen` | Изменить длину UDP | | `dht_dn` | DHT domain name injection | ### Из `zapret-lib.lua`: | Функция | Описание | |---------|----------| | `pass` | Ничего не делать (для отладки) | | `pktdebug` | Вывести содержимое desync в лог | | `argdebug` | Вывести аргументы в лог | | `posdebug` | Вывести позиции conntrack | | `luaexec` | Выполнить произвольный Lua код | --- ## 💡 **Примеры использования** ### Простой fake: ```bash --lua-desync=fake:blob=fake_default_tls ``` ### Fake с параметрами: ```bash --lua-desync=fake:blob=fake_default_tls:tcp_md5:ip_ttl=3:repeats=5 ``` ### Multisplit: ```bash --lua-desync=multisplit:pos=1,midsld ``` ### Комбинация функций: ```bash --lua-desync=fake:blob=fake_default_tls:tcp_md5 \ --lua-desync=multisplit:pos=1,midsld ``` ### С фильтром payload: ```bash --payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls \ --payload=http_req --lua-desync=fake:blob=fake_default_http ``` --- ## 📊 **Структура параметров** ```bash --lua-desync=функция:param1=val1:param2=val2:param3 ─────────┬───────────────────────────── │ параметры через двоеточие ``` **Типы параметров:** - `param=value` — параметр со значением - `param` — булевый параметр (без значения = true) --- ## 🔍 **Что получает функция** Каждая функция получает таблицу `desync` с данными: ```lua desync = { -- Аргументы функции arg = { blob = "...", tcp_md5 = true, ... }, -- Информация о функции func = "fake", func_n = 1, func_instance = "1:fake:1", -- Диссект пакета dis = { ip = { ... }, -- или ip6 = { ... } tcp = { ... }, -- или udp = { ... } payload = "...", }, -- Направление outgoing = true/false, -- Тип payload l7payload = "tls_client_hello", -- Conntrack (если есть) track = { lua_state = {}, -- для хранения данных между пакетами tcp = { seq = ..., ack = ... }, ... }, -- Reassembled данные (если есть) reasm_data = "...", -- Другие поля... } ``` --- ## 🎯 **Полный пример** ```bash winws2 ^ --wf-tcp-out=80,443 ^ [email protected] [email protected] ^ --filter-tcp=80 --filter-l7=http ^ --payload=http_req --lua-desync=fake:blob=fake_default_http:tcp_md5 ^ --lua-desync=multisplit:pos=method+2 ^ --new ^ --filter-tcp=443 --filter-l7=tls ^ --payload=tls_client_hello --lua-desync=fake:blob=fake_default_tls:tcp_md5:tls_mod=rnd,rndsni ^ --lua-desync=multidisorder:pos=1,midsld ``` --- ## ✅ **Итог** **`--lua-desync`** — это сердце nfqws2: - 🔹 Вызывает Lua функцию для каждого пакета - 🔹 Передаёт параметры через двоеточие - 🔹 Можно указывать несколько раз (выполняются последовательно) - 🔹 Работает с фильтрами `--payload`, `--out-range`, `--in-range` - 🔹 Можно писать свои функции ## 📋 **Полная таблица функций `--lua-desync`** ### 🔹 **Базовые функции (zapret-lib.lua)** | Функция | Описание | Параметры | |---------|----------|-----------| | `pass` | Ничего не делает (для отладки) | — | | `pktdebug` | Выводит содержимое desync в лог | — | | `argdebug` | Выводит аргументы функции в лог | — | | `posdebug` | Выводит позиции conntrack в лог | — | | `luaexec` | Выполняет произвольный Lua код | `code=<lua_code>` | --- ### 🔹 **Функции из zapret-antidpi.lua** #### **Базовые действия** | Функция | Аналог nfqws1 | Описание | Параметры | |---------|---------------|----------|-----------| | `drop` | — | Отбросить пакет | `dir`, `payload` | | `send` | `--dup` | Отправить копию пакета | `dir`, fooling, `ip_id`, `ipfrag`, `rawsend`, `reconstruct` | | `pktmod` | `--orig` | Модифицировать текущий пакет | `dir`, fooling, `ip_id` | --- #### **HTTP модификации** | Функция | Аналог nfqws1 | Описание | Параметры | |---------|---------------|----------|-----------| | `http_domcase` | `--domcase` | Изменить регистр домена (HoSt) | `dir` | | `http_hostcase` | `--hostcase` | Изменить регистр заголовка Host | `dir`, `spell=<str>` (4 символа) | | `http_methodeol` | `--methodeol` | Модифицировать EOL метода | `dir`, `method=cr\|lf\|crlf\|lfcr`, `no_space` | --- #### **SYN-атаки** | Функция | Аналог nfqws1 | Описание | Параметры | | -------------- | ---------------------- | ----------------------- | ---------------------------------------------------------------------------- | | `syndata` | `--dpi-desync=syndata` | Отправить SYN с данными | `blob=<blob>`, `tls_mod=<list>`, fooling, `rawsend`, `reconstruct`, `ipfrag` | | `synack` | — | Отправить SYN-ACK | fooling, `rawsend`, `reconstruct`, `ipfrag` | | `synack_split` | — | Сплит по SYN-ACK | `pos=<posmarker>`, `seqovl=N`, `seqovl_pattern=<blob>` | --- #### **Window size** | Функция | Аналог nfqws1 | Описание | Параметры | |---------|---------------|----------|-----------| | `wsize` | `--wssize` | Изменить window size на SYN-ACK | `wsize=N`, `scale=N` | | `wssize` | `--wssize` | Изменить window size на всех пакетах | `wsize=N`, `scale=N` | --- #### **RST** | Функция | Аналог nfqws1 | Описание | Параметры | |---------|---------------|----------|-----------| | `rst` | `--dpi-desync=rst` | Отправить RST | `dir`, `payload`, fooling, `ip_id`, `rawsend`, `reconstruct`, `ipfrag`, `rstack` | --- #### **Fake-атаки** | Функция | Аналог nfqws1 | Описание | Параметры | |---------|---------------|----------|-----------| | `fake` | `--dpi-desync=fake` | Отправить fake пакет | `blob=<blob>` *(обязательный)*, `tls_mod=<list>`, `dir`, `payload`, fooling, `ip_id`, `rawsend`, `reconstruct`, `ipfrag` | --- #### **Сплит и disorder** | Функция | Аналог nfqws1 | Описание | Параметры | |---------|---------------|----------|-----------| | `multisplit` | `--dpi-desync=multisplit` | Разбить на TCP сегменты | `pos=<posmarker_list>`, `seqovl=N`, `seqovl_pattern=<blob>`, `blob=<blob>`, `nodrop` | | `multidisorder` | `--dpi-desync=multidisorder` | Разбить + обратный порядок | `pos=<posmarker_list>`, `seqovl=<posmarker>`, `seqovl_pattern=<blob>`, `blob=<blob>`, `nodrop` | | `tcpseg` | — | TCP сегментация по диапазону | `pos=<range>` *(обязательный)*, `seqovl=N`, `seqovl_pattern=<blob>`, `blob=<blob>` | --- #### **Fake + сплит комбинации** | Функция | Аналог nfqws1 | Описание | Параметры | |---------|---------------|----------|-----------| | `hostfakesplit` | `--dpi-desync=hostfakesplit` | Fake только для хоста + сплит | `host=<template>`, `midhost=<posmarker>`, `nofake1`, `nofake2`, `disorder_after=<posmarker>`, `blob=<blob>`, `nodrop` | | `fakedsplit` | `--dpi-desync=fakedsplit` | Fake + сплит оригинала | `pos=<posmarker>`, `nofake1`, `nofake2`, `nofake3`, `nofake4`, `pattern=<blob>`, `seqovl=N`, `seqovl_pattern=<blob>`, `blob=<blob>`, `nodrop` | | `fakeddisorder` | `--dpi-desync=fakeddisorder` | Fake + disorder оригинала | `pos=<posmarker>`, `nofake1`, `nofake2`, `nofake3`, `nofake4`, `pattern=<blob>`, `seqovl=<posmarker>`, `seqovl_pattern=<blob>`, `blob=<blob>`, `nodrop` | --- #### **UDP** | Функция | Аналог nfqws1 | Описание | Параметры | |---------|---------------|----------|-----------| | `udplen` | `--dpi-desync=udplen` | Изменить длину UDP пакета | `dir`, `payload`, `min=N`, `max=N`, `increment=N` (по умолч. 2), `pattern=<blob>`, `pattern_offset=N` | | `dht_dn` | `--dpi-desync=tamper` (dht) | DHT domain name injection | `dir`, `dn=N` (по умолч. 2) | --- ## 🔧 **Стандартные параметры (применимы ко многим функциям)** ### **Direction (направление)** | Параметр | Описание | |----------|----------| | `dir=in` | Только входящие пакеты | | `dir=out` | Только исходящие (по умолчанию) | | `dir=any` | Оба направления | ### **Payload фильтр** | Параметр | Описание | |----------|----------| | `payload=<type_list>` | Фильтр по типу payload | ### **Fooling (обманки)** | Параметр | Описание | | --------------------------- | -------------------------------- | | `ip_ttl=N` | Установить TTL IPv4 | | `ip6_ttl=N` | Установить Hop Limit IPv6 | | `ip_autottl=delta,min-max` | Автоматический TTL | | `ip6_autottl=delta,min-max` | Автоматический Hop Limit | | `ip6_hopbyhop[=hex]` | Добавить Hop-by-Hop заголовок | | `ip6_hopbyhop2[=hex]` | Второй Hop-by-Hop | | `ip6_destopt[=hex]` | Добавить Destination Options | | `ip6_destopt2[=hex]` | Второй Destination Options | | `ip6_routing[=hex]` | Добавить Routing заголовок | | `ip6_ah[=hex]` | Добавить Authentication Header | | `tcp_seq=N` | Добавить к TCP sequence | | `tcp_ack=N` | Добавить к TCP ack | | `tcp_ts=N` | Добавить к timestamp | | `tcp_md5[=hex]` | Добавить TCP MD5 опцию | | `tcp_flags_set=<list>` | Установить TCP флаги | | `tcp_flags_unset=<list>` | Снять TCP флаги | | `tcp_ts_up` | Переместить timestamp наверх | | `fool=<function>` | Пользовательская функция обманки | ### **Reconstruct** | Параметр | Описание | | -------- | ------------------------------- | | `badsum` | Невалидная контрольная сумма L4 | ### **Rawsend** | Параметр | Описание | |----------|----------| | `repeats=N` | Количество повторов | | `ifout=<iface>` | Интерфейс отправки | | `fwmark=N` | fwmark пакета | ### **IP ID** | Параметр | Описание | |----------|----------| | `ip_id=seq\|rnd\|zero\|none` | Политика IP ID | | `ip_id_conn` | Сохранять IP ID между пакетами | ### **IP фрагментация** | Параметр | Описание | |----------|----------| | `ipfrag[=function]` | Включить IP фрагментацию | | `ipfrag_disorder` | Отправить фрагменты в обратном порядке | | `ipfrag_pos_tcp=N` | Позиция фрагментации TCP (кратно 8) | | `ipfrag_pos_udp=N` | Позиция фрагментации UDP (кратно 8) | | `ipfrag_next=N` | Next proto для второго фрагмента | ### **TLS модификации** | Параметр | Описание | |----------|----------| | `tls_mod=rnd` | Рандомизировать поле random | | `tls_mod=rndsni` | Случайный SNI | | `tls_mod=sni=<domain>` | Установить конкретный SNI | | `tls_mod=dupsid` | Копировать Session ID | | `tls_mod=padencap` | Padding encapsulation | --- ## 📍 **Position markers (маркеры позиций)** | Маркер | Описание | |--------|----------| | `N` | Абсолютная позиция (число) | | `-N` | Позиция с конца | | `host` | Начало хоста | | `endhost` | Конец хоста | | `sld` | Second-level domain | | `midsld` | Середина SLD | | `endsld` | Конец SLD | | `method` | HTTP метод | | `extlen` | TLS extensions length | | `sniext` | TLS SNI extension | | `marker+N` | Маркер + смещение | | `marker-N` | Маркер - смещение | --- ## 💡 **Примеры** ```bash # Простой fake --lua-desync=fake:blob=fake_default_tls:tcp_md5 # Fake с TTL и повторами --lua-desync=fake:blob=fake_default_tls:ip_ttl=3:repeats=5:tls_mod=rnd,rndsni # Multisplit с seqovl --lua-desync=multisplit:pos=1,midsld:seqovl=10 # Fakedsplit --lua-desync=fakedsplit:pos=midsld:nofake1:tcp_md5 # Комбинация fake + multidisorder --lua-desync=fake:blob=fake_default_tls:tcp_md5 --lua-desync=multidisorder:pos=1,midsld # UDP length --lua-desync=udplen:increment=4:min=50 ``` ## Соответствие флагов nfqws1 → nfqws2 В nfqws1 были готовые флаги `--dpi-desync-fooling=`. В nfqws2 их нет — вместо этого используются **отдельные параметры** для каждого действия. --- ## 📋 **Таблица соответствия** | nfqws1 флаг | nfqws2 параметр | Описание | |-------------|-----------------|----------| | `md5sig` | `tcp_md5` | Добавить TCP MD5 signature опцию | | `badsum` | `badsum` | Невалидная контрольная сумма L4 | | `badseq` | `tcp_seq=-10000` | Сдвинуть TCP sequence (для SYN) | | `badseq` | `tcp_ack=-66000` | Сдвинуть TCP ack (для данных) | | `datanoack` | `tcp_flags_unset=ack` | Снять флаг ACK | | `badack` | `tcp_ack=-66000` | Сдвинуть TCP ack | | `hopbyhop` | `ip6_hopbyhop` | IPv6 Hop-by-Hop header | | `hopbyhop2` | `ip6_hopbyhop2` | Второй Hop-by-Hop header | | `destopt` | `ip6_destopt` | IPv6 Destination Options | | `destopt2` | `ip6_destopt2` | Второй Destination Options | | `ipfrag1` | `ipfrag` | IP фрагментация | --- ## 🔧 **Детали каждого флага** ### **`md5sig` → `tcp_md5`** Добавляет TCP опцию MD5 signature (RFC 2385). DPI не может проверить подпись. ```bash # nfqws1 --dpi-desync-fooling=md5sig # nfqws2 --lua-desync=fake:blob=fake_default_tls:tcp_md5 ``` ### **`badsum` → `badsum`** Делает контрольную сумму TCP/UDP невалидной. Сервер отбросит пакет. ```bash # nfqws1 --dpi-desync-fooling=badsum # nfqws2 --lua-desync=fake:blob=fake_default_tls:badsum ``` ### **`badseq` → `tcp_seq` / `tcp_ack`** В nfqws1 `badseq` применял разные значения для SYN и обычных пакетов: - SYN пакеты: `tcp_seq=-10000` - Обычные пакеты: `tcp_ack=-66000` ```bash # nfqws1 --dpi-desync-fooling=badseq # nfqws2 (для обычных пакетов) --lua-desync=fake:blob=fake_default_tls:tcp_ack=-66000 # nfqws2 (для SYN) --lua-desync=fake:blob=fake_default_tls:tcp_seq=-10000 ``` ### **`badack` → `tcp_ack`** Сдвигает TCP acknowledgment number. ```bash # nfqws1 --dpi-desync-fooling=badack # nfqws2 --lua-desync=fake:blob=fake_default_tls:tcp_ack=-66000 ``` **Важно!** Для Linux нужен `tcp_ts_up` чтобы работало без `badseq`: ```bash --lua-desync=fake:blob=fake_default_tls:tcp_ack=-66000:tcp_ts_up ``` ### **`datanoack` → `tcp_flags_unset=ack`** Снимает флаг ACK с пакета. ```bash # nfqws1 --dpi-desync-fooling=datanoack # nfqws2 --lua-desync=fake:blob=fake_default_tls:tcp_flags_unset=ack ``` ### **`hopbyhop` → `ip6_hopbyhop`** Добавляет IPv6 Hop-by-Hop extension header. ```bash # nfqws1 --dpi-desync-fooling=hopbyhop # nfqws2 --lua-desync=fake:blob=fake_default_tls:ip6_hopbyhop ``` ### **`hopbyhop2` → `ip6_hopbyhop2`** Добавляет **второй** Hop-by-Hop header (нестандартно, ломает обработку). ```bash # nfqws1 --dpi-desync-fooling=hopbyhop2 # nfqws2 --lua-desync=fake:blob=fake_default_tls:ip6_hopbyhop2 ``` ### **`destopt` → `ip6_destopt`** Добавляет IPv6 Destination Options header. ```bash # nfqws1 --dpi-desync-fooling=destopt # nfqws2 --lua-desync=fake:blob=fake_default_tls:ip6_destopt ``` ### **`ipfrag1` → `ipfrag`** IP фрагментация пакета. ```bash # nfqws1 --dpi-desync-fooling=ipfrag1 # nfqws2 --lua-desync=send:ipfrag ``` --- ## 💡 **Примеры комбинаций** ### Классический fake с md5sig: ```bash # nfqws1 --dpi-desync=fake --dpi-desync-fooling=md5sig # nfqws2 --lua-desync=fake:blob=fake_default_tls:tcp_md5 ``` ### Fake с badseq + md5sig: ```bash # nfqws1 --dpi-desync=fake --dpi-desync-fooling=badseq,md5sig # nfqws2 --lua-desync=fake:blob=fake_default_tls:tcp_ack=-66000:tcp_md5 ``` ### Fake с TTL: ```bash # nfqws1 --dpi-desync=fake --dpi-desync-ttl=3 # nfqws2 --lua-desync=fake:blob=fake_default_tls:ip_ttl=3 ``` ### Fake с autottl: ```bash # nfqws1 --dpi-desync=fake --dpi-desync-autottl=-1,3-20 # nfqws2 --lua-desync=fake:blob=fake_default_tls:ip_autottl=-1,3-20:ip6_autottl=-1,3-20 ``` ### Fakedsplit с badseq + md5sig: ```bash # nfqws1 --dpi-desync=fakedsplit --dpi-desync-fooling=badseq,md5sig --dpi-desync-split-pos=2 # nfqws2 --lua-desync=fakedsplit:pos=2:tcp_ack=-66000:tcp_md5 ``` ### IPv6 hopbyhop + destopt: ```bash # nfqws1 --dpi-desync=fake --dpi-desync-fooling=hopbyhop,destopt # nfqws2 --lua-desync=fake:blob=fake_default_tls:ip6_hopbyhop:ip6_destopt ``` --- ## 📝 **Полный список fooling параметров nfqws2** | Параметр | Значение | Описание | | ----------------- | -------------- | ---------------------------- | | `tcp_md5` | `[=hex]` | TCP MD5 signature (16 байт) | | `tcp_seq` | `=N` | Сдвиг TCP sequence | | `tcp_ack` | `=N` | Сдвиг TCP ack | | `tcp_ts` | `=N` | Сдвиг TCP timestamp | | `tcp_flags_set` | `=list` | Установить TCP флаги | | `tcp_flags_unset` | `=list` | Снять TCP флаги | | `tcp_ts_up` | — | Переместить timestamp наверх | | `badsum` | — | Невалидная контрольная сумма | | `ip_ttl` | `=N` | Установить TTL | | `ip6_ttl` | `=N` | Установить Hop Limit | | `ip_autottl` | =delta,min-max | Авто TTL | | `ip6_autottl` | =delta,min-max | Авто Hop Limit | | `ip6_hopbyhop` | `[=hex]` | Hop-by-Hop header | | `ip6_hopbyhop2` | `[=hex]` | Второй Hop-by-Hop | | `ip6_destopt` | `[=hex]` | Destination Options | | `ip6_destopt2` | `[=hex]` | Второй Destination Options | | `ip6_routing` | `[=hex]` | Routing header | | `ip6_ah` | `[=hex]` | Authentication header | --- ## ⚡ **Быстрая шпаргалка** ```bash # md5sig :tcp_md5 # badsum :badsum # badseq (для данных) :tcp_ack=-66000 # badseq (для SYN) :tcp_seq=-10000 # badack :tcp_ack=-66000:tcp_ts_up # datanoack :tcp_flags_unset=ack # TTL :ip_ttl=3:ip6_ttl=3 # autottl :ip_autottl=-1,3-20:ip6_autottl=-1,3-20 # IPv6 headers :ip6_hopbyhop:ip6_destopt ``` ## Нет, `badseq` и `badack` — это **разные** вещи! --- ## 📊 **Разница** | Флаг | Что меняет | Поле TCP | Типичное значение | |------|------------|----------|-------------------| | **`badseq`** | Sequence number | `tcp.th_seq` | `-10000` | | **`badack`** | Acknowledgment number | `tcp.th_ack` | `-66000` | --- ## 🔬 **Как работают** ### **`badseq` (tcp_seq)** Сдвигает **номер последовательности** (sequence number) пакета. ``` Оригинальный пакет: seq=1000, ack=5000 С badseq (-10000): seq=-9000 (990), ack=5000 ``` - Сервер видит пакет с "неправильным" seq - Пакет **не попадает в окно приёма** → отбрасывается - DPI может обработать пакет, но сервер его игнорирует ### **`badack` (tcp_ack)** Сдвигает **номер подтверждения** (acknowledgment number) пакета. ``` Оригинальный пакет: seq=1000, ack=5000 С badack (-66000): seq=1000, ack=-61000 ``` - Сервер видит пакет с "неправильным" ack - Пакет может быть отброшен или обработан (зависит от ОС) - На Linux с опцией timestamp пакет может быть принят! --- ## ⚠️ **Важный нюанс для Linux** На Linux **badack без badseq** может не работать, если есть TCP timestamp опция! Linux отбрасывает пакеты с плохим ack только если timestamp опция идёт **первой** в списке TCP опций. Поэтому в nfqws2 есть параметр **`tcp_ts_up`** — он перемещает timestamp наверх: ```bash # Чтобы badack работал на Linux: --lua-desync=fake:blob=fake_default_tls:tcp_ack=-66000:tcp_ts_up ``` --- ## 📝 **В nfqws1** В nfqws1 флаг `badseq` был **универсальным** и применял разные значения в зависимости от типа пакета: | Тип пакета | Что менялось | Значение | |------------|--------------|----------| | SYN | `tcp_seq` | `-10000` | | Данные | `tcp_ack` | `-66000` | Поэтому `--dpi-desync-fooling=badseq` фактически менял **либо seq, либо ack** в зависимости от контекста. --- ## 🎯 **В nfqws2** В nfqws2 нет такой "магии" — вы **явно указываете** что хотите изменить: ```bash # Изменить sequence (для SYN) :tcp_seq=-10000 # Изменить ack (для данных) :tcp_ack=-66000 # Изменить оба :tcp_seq=-10000:tcp_ack=-66000 ``` --- ## 💡 **Рекомендации** ### Для fake пакетов (данные): ```bash # Вариант 1: badack с tcp_ts_up (надёжнее на Linux) --lua-desync=fake:blob=fake_default_tls:tcp_ack=-66000:tcp_ts_up # Вариант 2: md5sig (проще, работает везде) --lua-desync=fake:blob=fake_default_tls:tcp_md5 # Вариант 3: TTL (если известно расстояние до DPI) --lua-desync=fake:blob=fake_default_tls:ip_ttl=3 ``` ### Для syndata (SYN пакеты): ```bash --lua-desync=syndata:blob=fake_default_tls:tcp_seq=-10000 ``` --- ## ✅ **Итог** | | `badseq` | `badack` | |---|---------|---------| | **Поле** | Sequence | Acknowledgment | | **nfqws2 параметр** | `tcp_seq=N` | `tcp_ack=N` | | **Типичное значение** | `-10000` | `-66000` | | **Для SYN** | ✅ Да | ❌ Нет | | **Для данных** | ⚠️ Редко | ✅ Да | | **Нужен tcp_ts_up** | Нет | Да (на Linux) | **Короткий ответ:** `badseq` меняет **seq**, `badack` меняет **ack** — это разные поля TCP заголовка. ## `tcp_ts_up` — нужен **не всегда**, но рекомендуется для Linux --- ## 🔍 **Когда `tcp_ts_up` НУЖЕН** **Только на Linux**, и только если: 1. Вы используете `tcp_ack` (badack) **без** `tcp_seq` (badseq) 2. В пакете **есть** TCP timestamp опция ### Почему? Linux проверяет timestamp опцию для валидации пакетов. Но есть баг/особенность: - Linux отбрасывает пакеты с плохим ack **только если timestamp идёт первой** в списке TCP опций - Если timestamp не первая — пакет может быть **принят** несмотря на плохой ack! `tcp_ts_up` перемещает timestamp в начало списка опций → Linux корректно отбрасывает пакет. --- ## ✅ **Когда `tcp_ts_up` НЕ нужен** 1. **Целевой сервер — не Linux** (Windows, BSD и др.) 2. **Используете `tcp_seq`** (badseq) — тогда пакет отбрасывается по другой причине 3. **Используете `tcp_md5`** — md5sig работает независимо 4. **Используете `ip_ttl`** — пакет не дойдёт до сервера 5. **В пакете нет timestamp опции** — нечего перемещать --- ## 📊 **Таблица: когда нужен `tcp_ts_up`** | Fooling | Linux | Windows/BSD | `tcp_ts_up` нужен? | |---------|-------|-------------|-------------------| | `tcp_ack` только | ⚠️ Может не работать | ✅ Работает | **Да** (для Linux) | | `tcp_seq` только | ✅ Работает | ✅ Работает | Нет | | `tcp_ack` + `tcp_seq` | ✅ Работает | ✅ Работает | Нет | | `tcp_md5` | ✅ Работает | ✅ Работает | Нет | | `ip_ttl` | ✅ Работает | ✅ Работает | Нет | --- ## 💡 **Рекомендация** **Если не уверены — добавляйте `tcp_ts_up`**. Он не навредит, но гарантирует работу на Linux: ```bash # Безопасный вариант (работает везде) --lua-desync=fake:blob=fake_default_tls:tcp_ack=-66000:tcp_ts_up # Или просто используйте md5sig — проще и надёжнее --lua-desync=fake:blob=fake_default_tls:tcp_md5 ``` --- ## 🎯 **Короткий ответ** **Нет, не обязательно**, но: - На **Linux** без `tcp_ts_up` badack может **не сработать** - На **Windows/BSD** работает и без него - **Рекомендуется** добавлять для универсальности ## `autottl` — формат **обязателен**, значений по умолчанию нет! --- ## ❌ **Нельзя использовать без цифр** ```bash # ОШИБКА! Так нельзя: --lua-desync=fake:blob=fake_default_tls:ip_autottl # ОШИБКА! Так тоже нельзя: --lua-desync=fake:blob=fake_default_tls:ip_autottl= ``` Будет ошибка: ``` parse_autottl: invalid value '...' ``` --- ## ✅ **Обязательный формат** ``` ip_autottl=delta,min-max ip6_autottl=delta,min-max ``` | Параметр | Описание | |----------|----------| | `delta` | Сдвиг от вычисленного hop count (может быть отрицательным) | | `min` | Минимальное значение TTL | | `max` | Максимальное значение TTL | --- ## 💡 **Примеры** ```bash # Стандартный вариант: delta=-1, диапазон 3-20 :ip_autottl=-1,3-20:ip6_autottl=-1,3-20 # Более агрессивный: delta=-2 :ip_autottl=-2,3-20:ip6_autottl=-2,3-20 # Осторожный: delta=0 (точно до DPI) :ip_autottl=0,3-20:ip6_autottl=0,3-20 ``` --- ## 🔬 **Как работает autottl** 1. **Получает incoming TTL** из ответа сервера (SYN-ACK) 2. **Угадывает начальный TTL** сервера (64, 128 или 255) 3. **Вычисляет hop count** = начальный TTL - incoming TTL 4. **Применяет формулу**: fake_ttl = hop_count + delta 5. **Ограничивает** результат диапазоном min-max ### Пример расчёта: ``` Incoming TTL = 52 Угаданный начальный TTL = 64 Hop count = 64 - 52 = 12 delta = -1 Результат = 12 + (-1) = 11 Если min=3, max=20: итоговый TTL = 11 ✓ ``` --- ## ⚠️ **Важно** - **Требует conntrack** — нужно видеть входящие пакеты для определения TTL - **Не работает** если incoming TTL не попадает в диапазоны (32-64, 96-128, 223-255) - **Fallback на ip_ttl** — если autottl не сработал, используется `ip_ttl` если указан ```bash # С fallback на фиксированный TTL: :ip_ttl=5:ip_autottl=-1,3-20 ``` --- ## 📝 **Типичное использование** ```bash # Полный пример с autottl и fallback --lua-desync=fake:blob=fake_default_tls:tcp_md5:ip_ttl=5:ip_autottl=-1,3-20:ip6_ttl=5:ip6_autottl=-1,3-20 ```