From 87943846d9a55f5274900b7e7f5a1688ebffd629 Mon Sep 17 00:00:00 2001 From: bol-van Date: Wed, 24 Dec 2025 16:39:40 +0300 Subject: [PATCH] update docs --- docs/manual.md | 1021 +++++++++++++++++++++++++----------------------- 1 file changed, 537 insertions(+), 484 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index 010c53b..69d0177 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -1,5 +1,6 @@ # Содержание +- [Содержание](#содержание) - [Введение](#введение) - [Структура проекта](#структура-проекта) - [Схема обработки трафика](#схема-обработки-трафика) @@ -35,7 +36,8 @@ - [Структура track](#структура-track) - [С интерфейс nfqws2](#с-интерфейс-nfqws2) - [Базовые константы](#базовые-константы) - - [Стандартные блобы](#стандартные-блобы) + - [Стандартные блобы](#стандартные-блобы) + - [Переменные окружения](#переменные-окружения) - [C функции](#c-функции) - [Логгинг](#логгинг) - [Конвертация IP](#конвертация-ip) @@ -248,7 +250,6 @@ - [Шпаргалка openrc](#шпаргалка-openrc) - [Альтернативная установка на systemd](#альтернативная-установка-на-systemd) - # Введение zapret2 является пакетным манипулятором, основная задача которого - совершение различных автономных атак на DPI в реальном времени @@ -294,7 +295,7 @@ nfqws2 работает не в ядре (kernel mode), а является пр Пакет пришел в nfqws2. Первое, что он делает, это разбирает его по уровням OSI модели - выделяет ip , ipv6, tcp, udp заголовки и поле данных. Это называется диссекцией. Результатом диссекции является [диссект](#структура-диссекта) - представление пакета в виде структур, которые можно адресовать по полям. -Далее задействуется встроенная в nfqws2 подсистема conntrack - система отслеживания потоков поверх отдельно взятых пакетов. +Далее задействуется встроенная в nfqws2 подсистема conntrack - система отслеживания потоков поверх отдельно взятых пакетов. Ищется уже имеющаяся запись о потоке на основании данных L3/L4 пакета. Если ее нет - создается. Старые записи, по которым давно нет активности, удаляются. conntrack отслеживает логическое направление пакетов в потоке (входящее/исходящее), ведет подсчет количества прошедших пакетов и байт в обе стороны, следит за sequence numbers для tcp. Он же используется в случае необходимости для сборки сообщений, передаваемых несколькими пакетами. @@ -319,7 +320,7 @@ conntrack отслеживает логическое направление п и при необходимости переключение профиля. Таких переключений может быть за время существования потока до двух, поскольку есть лишь 2 изменяемых параметра. Профиль выбран. Из чего состоит его содержание, отвечающее за действия ? -За действия отвечают LUA функции. В профиле их может быть произвольное количество. +За действия отвечают LUA функции. В профиле их может быть произвольное количество. Каждый вызов LUA функции из профиля называется инстансом. Функция может быть одна, вызовов несколько - с разными параметрами. Поэтому и применяется понятие инстанса - экземпляра вызываемой функции, который идентифицируется номером профиля и порядковым номером вызова внутри профиля. Инстансы вызываются через параметры `--lua-desync`. Каждый инстанс получает набор произвольных параметров, задаваемых в `--lua-desync`. @@ -388,7 +389,6 @@ notrack нужен, чтобы NAT не ломал техники, которы Генерируемые nfqws2 пакеты не должны проходить проверки на валидность с точки зрения NAT и дропаться стандартными правилами таблиц. Подстановка IP адресов NAT не требуется, поскольку попадающий на nfqws2 пакет уже прошел NAT и имеет корректные адрес и порт источника для wan. - ``` IFACE_WAN=wan MAX_PKT_IN=15 @@ -476,6 +476,7 @@ done ``` Удаление всех правил из таблицы mangle, включая и иные правила : + ``` iptables -F -t mangle ip6tables -F -t mangle @@ -625,7 +626,6 @@ winws2 может принимать полные raw фильтры - вы пи как минимум в SYN пакете, а желательно еще и FIN, RST. Если нужна фильтрация по сообщениям , занимающим более одного tcp сегмента, такое отфильтровать средствами windivert невозможно - требуется полный перехват порта по направлению. - # nfqws2 ## Общие принципы задания параметров @@ -707,6 +707,7 @@ LUA DESYNC ACTION: ``` Специфические параметры nfqws2 : + ``` --qnum= ; номер очереди NFQUEUE в Linux --user= ; сменить uid/gid на те, что связаны с указанным именем пользователя @@ -718,6 +719,7 @@ LUA DESYNC ACTION: ``` Специфические параметры dvtws2 : + ``` --port= ; номер divert порта --user= ; сменить uid/gid на те, что связаны с указанным именем пользователя @@ -797,9 +799,9 @@ nfqws2 <глобальные_параметры> В примере имеется 3 рабочих профиля и 3 шаблона, 1 из которых импортирует настройки другого. -* Профиль prof1 получает обьединение `<базовые параметры 1>` и `<дополнительные параметры 1>`. -* Профиль prof2 получает обьединение `<базовые параметры 2>`, `<базовые параметры 3>` и `<дополнительные параметры 2>` -* Профиль prof3 получает `<параметры 3>`. Он не импортирует шаблоны. +- Профиль prof1 получает обьединение `<базовые параметры 1>` и `<дополнительные параметры 1>`. +- Профиль prof2 получает обьединение `<базовые параметры 2>`, `<базовые параметры 3>` и `<дополнительные параметры 2>` +- Профиль prof3 получает `<параметры 3>`. Он не импортирует шаблоны. В шаблонах допустимы любые параметры, относящиеся к профилям, включая и фильтры. @@ -815,37 +817,37 @@ nfqws2 <глобальные_параметры> Если есть автохостлист, то при наличии имени хоста профиль выбирается всегда вне зависимости от его вхождения в какие-либо листы этого профиля. Действия зависят от вхождения в листы. -* Если хост входит в исключающие листы, не происходит никаких действий и не происходит попытки выяснить работает ли ресурс. -* Если хост не входит в исключающие листы, но входит во включающие - происходит применение стратегии без +- Если хост входит в исключающие листы, не происходит никаких действий и не происходит попытки выяснить работает ли ресурс. +- Если хост не входит в исключающие листы, но входит во включающие - происходит применение стратегии без попыток выяснить работает ли ресурс с ней. -* Если хост не входит ни в исключающие листы, ни во включающие - стратегия не применяется, происходит обнаружение +- Если хост не входит ни в исключающие листы, ни во включающие - стратегия не применяется, происходит обнаружение неудачи доступа к ресурсу. Если случилась неудача, увеличивается счетчик неудач. Если случается удача или превышается интервал времени между неудачами `--hostlist-auto-fail-time` - счетчик сбрасывается. Когда счетчик достигает `--hostlist-auto-fail-threshold`, происходит занесение хоста в автолист. При следующем запросе будет считаться, что хост входит во включающий лист. -* Файлы хостлистов и ipset-ов перечитываются автоматически при изменении - перезапуск nfqws2 не нужен. -* Сигнал SIGHUP помечает все листы для принудительной перечитки при обработки следующего пакета -* Каждая запись о домене, IP адресе или подсети идет на новой строке. -* Хостлисты и ipset-ы поддерживают комментарии. Пустые строки и строки, начинающиеся с `#`, игнорируются. -* В хостлистах поддомены учитываются автоматически. `*` не поддерживается. Если в начале идет символ `^`, автоматический учет поддоменов отменяется для этого домена. -* ipset-ы могут включать адреса и подсети как ipv4, так и ipv6. -* В статическом варианте `--ipset-ip` и `--hostlist-domains` домены идут через запятую. В статическом хостлисте `#` и `^` так же поддерживаются. -* Для листов поддерживается сжатие gzip. +- Файлы хостлистов и ipset-ов перечитываются автоматически при изменении - перезапуск nfqws2 не нужен. +- Сигнал SIGHUP помечает все листы для принудительной перечитки при обработки следующего пакета +- Каждая запись о домене, IP адресе или подсети идет на новой строке. +- Хостлисты и ipset-ы поддерживают комментарии. Пустые строки и строки, начинающиеся с `#`, игнорируются. +- В хостлистах поддомены учитываются автоматически. `*` не поддерживается. Если в начале идет символ `^`, автоматический учет поддоменов отменяется для этого домена. +- ipset-ы могут включать адреса и подсети как ipv4, так и ipv6. +- В статическом варианте `--ipset-ip` и `--hostlist-domains` домены идут через запятую. В статическом хостлисте `#` и `^` так же поддерживаются. +- Для листов поддерживается сжатие gzip. ### Детектор неудач автохостлистов Детектор срабатывает только при наличии имени хоста. Неудачей считается : -* tcp : происходит не менее `--hostlist-auto-retrans-threshold` ретрансмиссий в пределах исходящего relative sequence `--hostlist-auto-retrans-maxseq`. если `--hostlist-auto-retrans-reset=1`, ретрансмиттеру шлется RST, чтобы он прекратил попытки достучаться (это может быть очень долго). -* tcp : приходит RST в пределах входящего relative sequence от 1 до `--hostlist-auto-incoming-maxseq` -* tcp : принят пейлоад `http_reply` и http ответ является переадресацией 302 или 307 на абсолютный URL с доменом 2 уровня, не совпадающим с доменом 2 уровня хоста. -* udp : ушло не менее `--hostlist-auto-udp-out` пакетов, пришло не более `--hostlist-auto-udp-in` пакетов. Эта ситуация означает, что клиент шлет запросы, а сервер на них не отвечает или отвечает меньше, чем должен по протоколу. +- tcp : происходит не менее `--hostlist-auto-retrans-threshold` ретрансмиссий в пределах исходящего relative sequence `--hostlist-auto-retrans-maxseq`. если `--hostlist-auto-retrans-reset=1`, ретрансмиттеру шлется RST, чтобы он прекратил попытки достучаться (это может быть очень долго). +- tcp : приходит RST в пределах входящего relative sequence от 1 до `--hostlist-auto-incoming-maxseq` +- tcp : принят пейлоад `http_reply` и http ответ является переадресацией 302 или 307 на абсолютный URL с доменом 2 уровня, не совпадающим с доменом 2 уровня хоста. +- udp : ушло не менее `--hostlist-auto-udp-out` пакетов, пришло не более `--hostlist-auto-udp-in` пакетов. Эта ситуация означает, что клиент шлет запросы, а сервер на них не отвечает или отвечает меньше, чем должен по протоколу. Удачей считается : -* tcp : превышение исходящего relative sequence `--hostlist-auto-retrans-maxseq` . Клиент смог отослать достаточно много, что вряд ли бы случилось в случае реакции DPI. -* tcp : превышение входящего relative sequence `--hostlist-auto-incoming-maxseq` . Сервер прислал достаточно много, чтобы это не было похоже на ответ DPI. -* udp : превышение количества пришедших пакетов `--hostlist-auto-udp-in` . Сервер ответил достаточно много. +- tcp : превышение исходящего relative sequence `--hostlist-auto-retrans-maxseq` . Клиент смог отослать достаточно много, что вряд ли бы случилось в случае реакции DPI. +- tcp : превышение входящего relative sequence `--hostlist-auto-incoming-maxseq` . Сервер прислал достаточно много, чтобы это не было похоже на ответ DPI. +- udp : превышение количества пришедших пакетов `--hostlist-auto-udp-in` . Сервер ответил достаточно много. При неудаче, если с прошлой неудачи прошло не более `--hostlist-auto-fail-time` секунд, счетчик неудач увеличивается. Если прошло больше времени - счетчик сбрасывается, счет идет заново. @@ -855,7 +857,7 @@ nfqws2 <глобальные_параметры> При достижении счетчиком `--hostlist-auto-fail-threshold` происходит занесение хоста в лист. Большинство критериев удачи или неудачи требует анализа входящего и исходящего трафика, поэтому необходим их перехват в достаточном обьеме -для возможности срабатывания критериев. +для возможности срабатывания критериев. ### Фильтр по наличию сетей @@ -967,19 +969,19 @@ ipcache представляет собой структуру в памяти ## Сигналы -* **SIGHUP** принудительно перечитывает все файлы хостлистов и ipset -* **SIGUSR1** выводит содержимое пула conntrack -* **SIGUSR2** выводит счетчики autohostlist и содержимое пула ipcache +- **SIGHUP** принудительно перечитывает все файлы хостлистов и ipset +- **SIGUSR1** выводит содержимое пула conntrack +- **SIGUSR2** выводит счетчики autohostlist и содержимое пула ipcache ## Отладка Параметр `--debug` включает вывод отладочных сообщений. -* `--debug=0` выключает вывод -* `--debug`, `--debug=1` вывод на консоль -* `--debug=@` вывод в файл. размер файла ничем не ограничивается, но файл может быть удален в любой момент, и запись продолжится с чистого листа -* `--debug=syslog` вывод в syslog. чтение зависит от syslog daemon. rsyslog пишет файлы в /var/log. busybox logd читается через logread. -* `--debug=android` вывод в android log. чтение через logcat. доступно только в версиях, собранных в Android NDK +- `--debug=0` выключает вывод +- `--debug`, `--debug=1` вывод на консоль +- `--debug=@` вывод в файл. размер файла ничем не ограничивается, но файл может быть удален в любой момент, и запись продолжится с чистого листа +- `--debug=syslog` вывод в syslog. чтение зависит от syslog daemon. rsyslog пишет файлы в /var/log. busybox logd читается через logread. +- `--debug=android` вывод в android log. чтение через logcat. доступно только в версиях, собранных в Android NDK Умение обращаться с `--debug` логом совершенно необходимо для отладки настроек и тем более для написания собственного LUA кода. @@ -999,23 +1001,26 @@ ipcache представляет собой структуру в памяти Весь LUA код выполняется только после сброса привилегий. Он никогда не получает исходные права. BSD : -* Меняется UID/GID на указанные в параметрах `--user`, `--uid`. По умолчанию на 0x7FFFFFFF. + +- Меняется UID/GID на указанные в параметрах `--user`, `--uid`. По умолчанию на 0x7FFFFFFF. Linux : -* Меняется UID/GID на указанные в параметрах `--user`, `--uid`. По умолчанию на 0x7FFFFFFF. -* Сбрасываются capabilities до cap_net_raw, cap_net_admin (требуется для NFQUEUE). Сбрасывается bounding set до нуля. -* Выставляется признак NO_NEW_PRIVS, чтобы не работали suid биты и caps на файлах. Если ядро старее 3.5, NO_NEW_PRIVS не поддерживается. В этом случае выводится предупреждение, выполнение не прекращается. -* Включается seccomp фильтр, запрещающий exec и ряд файловых операций - чтение содержимого каталогов, создание/удаление каталогов, создание специальных файлов (линки, девайсы), chmod, chown, посылание сигналов (kill), ptrace. + +- Меняется UID/GID на указанные в параметрах `--user`, `--uid`. По умолчанию на 0x7FFFFFFF. +- Сбрасываются capabilities до cap_net_raw, cap_net_admin (требуется для NFQUEUE). Сбрасывается bounding set до нуля. +- Выставляется признак NO_NEW_PRIVS, чтобы не работали suid биты и caps на файлах. Если ядро старее 3.5, NO_NEW_PRIVS не поддерживается. В этом случае выводится предупреждение, выполнение не прекращается. +- Включается seccomp фильтр, запрещающий exec и ряд файловых операций - чтение содержимого каталогов, создание/удаление каталогов, создание специальных файлов (линки, девайсы), chmod, chown, посылание сигналов (kill), ptrace. В случае нарушения процесс аварийно завершается. Если ядро не поддерживает seccomp, выводится предупреждение, но выполнение не прекращается. Windows : -* Хотя драйвер windivert требует привилегий администратора, после его инициализации процесс winws2 ставит себе low mandatory level. + +- Хотя драйвер windivert требует привилегий администратора, после его инициализации процесс winws2 ставит себе low mandatory level. Это предотвращает доступ на запись практически ко всем файлам и обьектам, защищенным security descriptor. Процесс больше не может управлять службами и осуществлять привилегированные действия. Однако, группа Administrators остается в токене процесса, поэтому ничто не предотвращает чтение большинства файлов, если на них есть доступ для Administrators. LUA не имеет встроенных средств чтения содержимого каталогов, поэтому обнаружение интересующих файлов для злоумышленника затруднено. -* Безвозвратно убираются все Se* привилегии из токена, кроме SeChangeNotifyPrivilege. -* С помощью Job запрещается создание дочерних процессов и ограничивается взаимодействие с десктопом - clipboard, change desktop, change dispay settings и тд +- Безвозвратно убираются все Se* привилегии из токена, кроме SeChangeNotifyPrivilege. +- С помощью Job запрещается создание дочерних процессов и ограничивается взаимодействие с десктопом - clipboard, change desktop, change dispay settings и тд Есть простой способ передать LUA коду каталог, доступный на запись - параметр `--writeable[=]`. nfqws2 создает каталог, назначает на него такие права, чтобы LUA код смог писать туда файлы, передает имя директории в переменной env `WRITEABLE`. @@ -1045,9 +1050,9 @@ LUA код вызывается в 2 этапа. `--blob=:[+ofs]@|0xHEX` -* `item_name` - имя переменной LUA. -* `[+ofs]@` - загрузка из файла со смещения ofs. -* `0xHEX` - загрузка из HEX строки +- `item_name` - имя переменной LUA. +- `[+ofs]@` - загрузка из файла со смещения ofs. +- `0xHEX` - загрузка из HEX строки Прямые операции с файлами из кода LUA не рекомендованы без необходимости. LUA код выполняется с ограниченными правами, задуманное может не получиться или не работать на разных ОС в разных условиях. @@ -1058,26 +1063,25 @@ LUA код выполняется с ограниченными правами, Они бывают трех видов - `--payload`, `--in-range`, `--out-range`. Значения фильтров действуют с момента их указания до следующего переопределения. -* `--payload=type1[,type2][,type2]...` принимает список известных пейлоадов через зяпятую, "all" или "known". Список известных пейлоадов доступен в help тексте nfqws2. По умолчанию `--payload=all`. -* `--(in-range|out-range)=[(n|a|d|s|p)](-|<)[(n|a|d|s|p)]` задает диапазоны счетчиков conntrack по входящему и исходящему направлениям. По умолчанию `--in-range=x`, `--out-range=a`. +- `--payload=type1[,type2][,type2]...` принимает список известных пейлоадов через зяпятую, "all" или "known". Список известных пейлоадов доступен в help тексте nfqws2. По умолчанию `--payload=all`. +- `--(in-range|out-range)=[(n|a|d|s|p)](-|<)[(n|a|d|s|p)]` задает диапазоны счетчиков conntrack по входящему и исходящему направлениям. По умолчанию `--in-range=x`, `--out-range=a`. Диапазоны задаются в формах : `mX-mY`, `mX [!CAUTION] > В winws2 по умолчанию включен параметр `--wf-tcp-empty=0`. Он блокирует перехват пустых пакетов с ACK, что позволяет примерно в 2 раза сэкономить на процессоре при интенсивных скачиваниях. Пустые ACK в большинстве стратегий не нужны. Но это же и ломает счетчик "n" - он не будет показывать реальное количество пакетов по соединению. Если вам нужно точное значение, укажите параметр `--wf-tcp-empty=1`. В других системах точность счетчиков напрямую зависит от фильтров перехвата. Счетчик не может и не будет считать то, что не перехватывается. - nfqws2 следит за превышением верхней границы счетчиков для всех LUA инстансов. Если во всех инстансах превышена верхняя граница по направлению или инстансы вошли по направлению в состояние cutoff добровольно, происходит lua cutoff - выключение процессинга LUA в текущем потоке. Это нужно для экономии ресурсов процессора, @@ -1104,16 +1108,16 @@ nfqws2 следит за превышением верхней границы с Не суть важно как работают конкретные функции, сейчас важно понять как работают внутрипрофильные фильтры и как передаются параметры LUA инстансам. -* Профильный фильтр по tcp портам и типу протокола потока позволяет избежать вызовов LUA на другом трафике. +- Профильный фильтр по tcp портам и типу протокола потока позволяет избежать вызовов LUA на другом трафике. Профиль вообще не будет задействован, если условия фильтра не выполнятся. -* `--out-range` указан, чтобы отсечь поток от LUA по исходящему направлению после relative sequence (32768+1460) - для экономии процессора. +- `--out-range` указан, чтобы отсечь поток от LUA по исходящему направлению после relative sequence (32768+1460) - для экономии процессора. Такое значение выбрано из-за специфики функции circular - значение s32768 используется в детекторе успеха как порог срабатывания по умолчанию, 1460 - максимально возможная длина данных в tcp пакете. На Linux может быть не нужно, если используется фильтр connbytes. -* сircular для своей работы требует начальные входящие пакеты потока, а по умолчанию они отключены. +- сircular для своей работы требует начальные входящие пакеты потока, а по умолчанию они отключены. Поэтому включаем вплоть до позиции relative sequence 5556. По умолчанию детектор успеха реагирует на s4096. Добавлен еще 1 пакет макс 1460 байт. -* Остальные инстансы не нуждаются во входящем трафике. Снова отключаем. Действие `--in-range=x` распространяется до конца профиля. -* Действие `--payload` распространяется на два следующих за ним инстанса. -* Строчка `--lua-desync=fake:blob=fake_default_tls:badsum:strategy=1` вызывает функцию `fake` с 3 аргументами : `blob`, `badsum`, `strategy`. +- Остальные инстансы не нуждаются во входящем трафике. Снова отключаем. Действие `--in-range=x` распространяется до конца профиля. +- Действие `--payload` распространяется на два следующих за ним инстанса. +- Строчка `--lua-desync=fake:blob=fake_default_tls:badsum:strategy=1` вызывает функцию `fake` с 3 аргументами : `blob`, `badsum`, `strategy`. Значением аргумента `badsum` является пустая строка. ## Прототип LUA функции @@ -1122,15 +1126,15 @@ nfqws2 следит за превышением верхней границы с `function desync_f(ctx,desync)` -* ctx - контекст для вызова некоторых C функций -* desync - таблица, содержащая все передаваемые значения, включая аргументы, диссект текущего пакета и т.д. +- ctx - контекст для вызова некоторых C функций +- desync - таблица, содержащая все передаваемые значения, включая аргументы, диссект текущего пакета и т.д. Функция возвращает вердикт по текущему пакету - VERDICT_PASS, VERDICT_MODIFY, VERDICT_DROP. Может не возвращать ничего, тогда результат приравниваться к VERDICT_PASS. -* VERDICT_PASS передает пакет как есть без учета изменений диссекта -* VERDICT_MODIFY выполняет реконструкцию и отправку текущего диссекта -* VERDICT_DROP дропает текущий пакет +- VERDICT_PASS передает пакет как есть без учета изменений диссекта +- VERDICT_MODIFY выполняет реконструкцию и отправку текущего диссекта +- VERDICT_DROP дропает текущий пакет Результат всех lua-desync инстансов аггрегируется : VERDICT_MODIFY замещает VERDICT_PASS, VERDICT_DROP замещает их обоих. @@ -1138,7 +1142,7 @@ nfqws2 следит за превышением верхней границы с Лучше всего изучать структуру desync по ее реальному содержимому, выполняя тестовую desync функцию pktdebug из zapret-lib.lua. -
+
Пакет http-req от запроса по ipv6 к http://one.one.one.one
 desync:
@@ -1371,6 +1375,7 @@ desync:
 
desync + | Поле | Тип | Содержание | Примечание | | :----------------- | :----- | :------------------------------------------------------------------------------------------- | :---------------------------------------------------------- | | func | string | имя desync функции | | @@ -1415,6 +1420,7 @@ ipv6 extension headers и tcp options представляются в форме Все числовые многобайтовые значения автоматически переведены из network byte order в machine byte order. **dissect** + | Поле | Тип | Описание | | :------------ | :----- | :--------------------------------------------------------------- | | ip | table | заголовок ipv4 | @@ -1428,6 +1434,7 @@ ipv6 extension headers и tcp options представляются в форме | payload | string | L4 пейлоад | **ip** + | Поле | Описание | | :------ | :-------------------------------------------------------------------------------------------------------------------------------------- | | ip_v | версия ip - 4 | @@ -1444,6 +1451,7 @@ ipv6 extension headers и tcp options представляются в форме | options | бинарный блок ip options (практически не используется, режется всеми) | **ip6** + | Поле | Описание | | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- | | ip6_flow | первые 4 байта ipv6 header : version (6), traffic class, flow label | @@ -1455,6 +1463,7 @@ ipv6 extension headers и tcp options представляются в форме | exthdr | массив таблиц расширенных хедеров (индекс от 1) | **ip6 exthdr** + | Поле | Описание | | :--- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | type | [тип хедера](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) : IPPROTO_HOPOPTS, IPPROTO_ROUTING, IPPROTO_DSTOPTS, IPPROTO_MH, IPPROTO_HIP, IPPROTO_SHIM6, IPPROTO_FRAGMENT, IPPROTO_AH | @@ -1462,6 +1471,7 @@ ipv6 extension headers и tcp options представляются в форме | data | данные без первых двух байтов - типа и длины | **udp** + | Поле | Описание | | :------- | :--------------------------------------------------- | | uh_sport | порт источника | @@ -1470,6 +1480,7 @@ ipv6 extension headers и tcp options представляются в форме | uh_sum | чексумма udp | **tcp** + | Поле | Описание | | :------- | :------------------------------------------------------------------------------------------------------------ | | th_sport | порт источника | @@ -1485,6 +1496,7 @@ ipv6 extension headers и tcp options представляются в форме | options | массив таблиц [tcp опций](https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml) (индекс от 1) | **tcp options** + | Поле | Описание | | :--- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | kind | [тип опции](https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml) : TCP_KIND_END, TCP_KIND_NOOP, TCP_KIND_MSS, TCP_KIND_SCALE, TCP_KIND_SACK_PERM, TCP_KIND_SACK, TCP_KIND_TS, TCP_KIND_MD5, TCP_KIND_AO, TCP_KIND_FASTOPEN | @@ -1516,6 +1528,7 @@ ipv6 extension headers и tcp options представляются в форме То же самое верно для опциональных полей track. Проверяйте ваш код с `--ctrack-disable` и на разных протоколах - tcp, udp. **track** + | Поле | Тип | Описание | Примечание | | :------------- | :----- | :-------------------------------------------------------------- | :----------------------------------------------- | | incoming_ttl | number | ttl/hl первого входящего пакета по потоку | может не быть, если не определено | @@ -1598,7 +1611,7 @@ mss дублируется в поле `desync.tcp_mss` независимо о | TCP_BASE_LEN | number | базовый размер tcp хедера | 20 | | UDP_BASE_LEN | number | размер udp хедера | 8 | | TCP_KIND_END
TCP_KIND_NOOP
TCP_KIND_MSS
TCP_KIND_SCALE
TCP_KIND_SACK_PERM
TCP_KIND_SACK
TCP_KIND_TS
TCP_KIND_MD5
TCP_KIND_AO
TCP_KIND_FASTOPEN | number | коды типов tcp опций (kinds) | | -| TH_FIN
TH_SYN
TH_RST
TH_PUSH
TH_ACK
TH_URG
TH_ECE
TH_CWR | number | tcp флаги | можно складывать через + | +| TH_FIN
TH_SYN
TH_RST
TH_PUSH
TH_ACK
TH_FIN
TH_URG
TH_ECE
TH_CWR | number | tcp флаги | можно складывать через + | | IP_MF | number | флаг IP "more fragments" | 0x8000, часть поля ip_off | | IP_DF | number | флаг IP "dont fragment" | 0x4000, часть поля ip_off | | IP_RF | number | флаг IP "reserved" | 0x2000, часть поля ip_off | @@ -1616,11 +1629,18 @@ mss дублируется в поле `desync.tcp_mss` независимо о | IPV6_FLOWINFO_MASK | number | flow label, traffic class в ip6_flow | 0x0FFFFFFF | | IPPROTO_IP
IPPROTO_IPV6
IPPROTO_ICMP
IPPROTO_TCP
IPPROTO_UDP
IPPROTO_ICMPV6
IPPROTO_HOPOPTS
IPPROTO_ROUTING
IPPROTO_FRAGMENT
IPPROTO_AH
IPPROTO_ESP
IPPROTO_DSTOPTS
IPPROTO_MH
IPPROTO_HIP
IPPROTO_SHIM6
IPPROTO_NONE | number | [номера IP протоколов](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) | используются в ipv4 и ipv6 | -### Стандартные блобы +## Стандартные блобы -* fake_default_tls - фейковый tls_client_hello от firefox без kyber, SNI=www.microsoft.com -* fake_default_http - http запрос к www.iana.org -* fake_default_quic - 0x40 + 619*0x00 +- fake_default_tls - фейковый tls_client_hello от firefox без kyber, SNI=www.microsoft.com +- fake_default_http - http запрос к +- fake_default_quic - 0x40 + 619*0x00 + +## Переменные окружения + +| env | Назначение | +| :-------- |:---------- | +| WRITEABLE | Директория, доступная на запись LUA. Результат опции `--writeable` | +| APPDATALOW | (только Windows) Расположение AppData для low mandatory level. Сюда тоже можно записывать, но предпочтительно использовать `--writeable` для кросс-платформенности. | ## C функции @@ -1633,9 +1653,10 @@ function DLOG_CONDUP(string) ``` Функции выводят строку с добавлением EOL в --debug лог. -* DLOG - обычный вывод -* DLOG_CONDUP - обычный вывод + вывод на консоль, если включено логирование в файл или syslog -* DLOG_ERR - аналогично DLOG_CONDUP, но все выводимое на консоль идет в stderr + +- DLOG - обычный вывод +- DLOG_CONDUP - обычный вывод + вывод на консоль, если включено логирование в файл или syslog +- DLOG_ERR - аналогично DLOG_CONDUP, но все выводимое на консоль идет в stderr ### Конвертация IP @@ -1644,8 +1665,8 @@ function ntop(raw_ip) function pton(string_ip) ``` -* ntop конвертирует raw строку с байтами ipv4 или ipv6 адреса в читаемое строковое представление. версия IP определяется по размеру raw_ip - 4 или 16 байт. При несоответствии размера возвращается nil. -* pton конвертирует строковое представление ipv4 или ipv6 адреса в raw_ip. Если строковое представление не является корректным ipv4 или ipv6 адресом, возвращается nil. +- ntop конвертирует raw строку с байтами ipv4 или ipv6 адреса в читаемое строковое представление. версия IP определяется по размеру raw_ip - 4 или 16 байт. При несоответствии размера возвращается nil. +- pton конвертирует строковое представление ipv4 или ipv6 адреса в raw_ip. Если строковое представление не является корректным ipv4 или ipv6 адресом, возвращается nil. ### Битовые операции @@ -1665,6 +1686,7 @@ LUA 5.3 имеет встроенные битовые операции, но н Только в LUA 5.3 реализован тип integer 64 bit. В более старых используется формат плавающей точки double с мантиссой 53 бит. Стандартные операции сдвига и побитовые логические операции : + ``` function bitlshift(u32, bits) function bitrshift(u32, bits) @@ -1677,13 +1699,14 @@ function bitnot(u32) bitand, bitor и bitxor работает с произвольным количеством чисел. Операции получения и установки отдельных битов : + ``` function bitget(u32, bit_from, bit_to) function bitset(u32, bit_from, bit_to, set) ``` -* bitget получает число из диапазона битов u32 с номерами от bit_from до bit_to. нумерация битов с 0. -* bitset записывает число set в диапазон битов u32 с номерами от bit_from до bit_to. нумерация битов с 0. старшие биты set, выходящие за пределы (bit_to-bit_from), игнорируются. +- bitget получает число из диапазона битов u32 с номерами от bit_from до bit_to. нумерация битов с 0. +- bitset записывает число set в диапазон битов u32 с номерами от bit_from до bit_to. нумерация битов с 0. старшие биты set, выходящие за пределы (bit_to-bit_from), игнорируются. ### Операции с беззнаковыми числами @@ -1758,15 +1781,16 @@ function divint(dividend, divisor) Функции генерируют raw строку указанного размера , состоящую из случайных байт. Случайные данные не являются криптографически стойкими. + ``` function brandom(size) function brandom_az(size) function brandom_az09(size) ``` -* brandom возвращает байты от 0 до 255 -* brandom_az - символы от 'a' до 'z' -* brandom_az09 - символы от 'a' до 'z' и числа от '0' до '9' +- brandom возвращает байты от 0 до 255 +- brandom_az - символы от 'a' до 'z' +- brandom_az09 - символы от 'a' до 'z' и числа от '0' до '9' ### Парсинг @@ -1811,11 +1835,12 @@ function aes(encrypt, key, data) ``` Простое шифрование или дешифрование одного блока aes. -* encrypt - true - encrypt , false - decrypt -* key - raw строка. размер должен быть 16,24,32 байт, что соответствует aes128,aes192,aes256 -* data - raw строка. размер должен быть 16 байт -* возвращается raw строка 16 байт с результатом операции -* в случае неверных размеров key или data вызывается error + +- encrypt - true - encrypt , false - decrypt +- key - raw строка. размер должен быть 16,24,32 байт, что соответствует aes128,aes192,aes256 +- data - raw строка. размер должен быть 16 байт +- возвращается raw строка 16 байт с результатом операции +- в случае неверных размеров key или data вызывается error #### aes_gcm @@ -1824,26 +1849,29 @@ function aes_gcm(encrypt, key, iv, data, associated_data) ``` Шифрование в режиме aes-gcm. -* encrypt - true - encrypt , false - decrypt -* key - raw строка. размер key должен быть 16,24,32 байт, что соответствует aes128,aes192,aes256 -* iv - raw строка 12 байт. ОБЯЗАТЕЛЬНО ГЕНЕРИРУЕТСЯ СЛУЧАЙНО ДЛЯ КАЖДОГО ШИФРУЕМОГО БЛОКА ДАННЫХ И ПЕРЕДАЕТСЯ ВМЕСТЕ С НИМ. При **ПОВТОРНОМ ИСПОЛЬЗОВАНИИ iv С ТЕМ ЖЕ КЛЮЧОМ ШИФРОВАНИЕ ЛЕГКО ВЗЛАМЫВАЕТСЯ**. Для генерации iv следует использовать bcryptorandom. -* data - raw строка произвольного размера. Шифр использует гамму, поэтому исходные данные не привязаны к размеру блока AES. -* associated_data - нешифруемые данные, передаваемые вместе с шифрованным сообщением и участвующие в подсчете atag. Может быть nil. -* возвращается 2 значения : raw строка - блок шифрованных данных и raw строка atag (authentication tag). atag может быть передан вместе с шифрованным сообщением, iv и associated_data для проверки их целостности. -* в случае неверных размеров key или iv вызывается error + +- encrypt - true - encrypt , false - decrypt +- key - raw строка. размер key должен быть 16,24,32 байт, что соответствует aes128,aes192,aes256 +- iv - raw строка 12 байт. ОБЯЗАТЕЛЬНО ГЕНЕРИРУЕТСЯ СЛУЧАЙНО ДЛЯ КАЖДОГО ШИФРУЕМОГО БЛОКА ДАННЫХ И ПЕРЕДАЕТСЯ ВМЕСТЕ С НИМ. При **ПОВТОРНОМ ИСПОЛЬЗОВАНИИ iv С ТЕМ ЖЕ КЛЮЧОМ ШИФРОВАНИЕ ЛЕГКО ВЗЛАМЫВАЕТСЯ**. Для генерации iv следует использовать bcryptorandom. +- data - raw строка произвольного размера. Шифр использует гамму, поэтому исходные данные не привязаны к размеру блока AES. +- associated_data - нешифруемые данные, передаваемые вместе с шифрованным сообщением и участвующие в подсчете atag. Может быть nil. +- возвращается 2 значения : raw строка - блок шифрованных данных и raw строка atag (authentication tag). atag может быть передан вместе с шифрованным сообщением, iv и associated_data для проверки их целостности. +- в случае неверных размеров key или iv вызывается error #### aes_ctr ``` function aes_ctr(key, iv, data) ``` + Шифрование в режиме aes-ctr. -* key - raw строка. размер key должен быть 16,24,32 байт, что соответствует aes128,aes192,aes256 -* iv - raw строка 16 байт. ОБЯЗАТЕЛЬНО ГЕНЕРИРУЕТСЯ СЛУЧАЙНО ДЛЯ КАЖДОГО ШИФРУЕМОГО БЛОКА ДАННЫХ И ПЕРЕДАЕТСЯ ВМЕСТЕ С НИМ. При **ПОВТОРНОМ ИСПОЛЬЗОВАНИИ iv С ТЕМ ЖЕ КЛЮЧОМ ШИФРОВАНИЕ ЛЕГКО ВЗЛАМЫВАЕТСЯ**. Для генерации iv следует использовать bcryptorandom. -* data - raw строка произвольного размера. Шифр использует гамму, поэтому исходные данные не привязаны к размеру блока AES. -* шифрование работает по принципу xor с гаммой, поэтому симметрично. шифрование и дешифрование - одна операция. -* возвращается raw строка - блок шифрованных данных -* в случае неверных размеров key или iv вызывается error + +- key - raw строка. размер key должен быть 16,24,32 байт, что соответствует aes128,aes192,aes256 +- iv - raw строка 16 байт. ОБЯЗАТЕЛЬНО ГЕНЕРИРУЕТСЯ СЛУЧАЙНО ДЛЯ КАЖДОГО ШИФРУЕМОГО БЛОКА ДАННЫХ И ПЕРЕДАЕТСЯ ВМЕСТЕ С НИМ. При **ПОВТОРНОМ ИСПОЛЬЗОВАНИИ iv С ТЕМ ЖЕ КЛЮЧОМ ШИФРОВАНИЕ ЛЕГКО ВЗЛАМЫВАЕТСЯ**. Для генерации iv следует использовать bcryptorandom. +- data - raw строка произвольного размера. Шифр использует гамму, поэтому исходные данные не привязаны к размеру блока AES. +- шифрование работает по принципу xor с гаммой, поэтому симметрично. шифрование и дешифрование - одна операция. +- возвращается raw строка - блок шифрованных данных +- в случае неверных размеров key или iv вызывается error #### hkdf @@ -1854,12 +1882,12 @@ function hkdf(hash_type, salt, ikm, info, okm_len) HKDF - HMAC-based Key Derivation Function. Генератор ключей на базе произвольных входных данных - input keying material (ikm). Функция включает extraction и expansion. -* hash_type может быть "sha256" или "sha224" -* salt - raw строка произвольного размера, может быть nil. "соль". несекретная информация. позволяет сделать результат разным на тех же ikm для разных значений salt. если nil, используется блок нулевых байт размером, равным размеру результата hash функции. -* ikm - raw строка - input keying material. на базе этих данных, salt и info генерируется okm - output keying material -* info - raw строка произвольного размера, может быть nil. аналогично salt, но salt подмешивается на extraction phase, а info - на expansion. если nil, то используется info нулевого размера. -* okm_len - требуемая длина okm - output keying material -* возвращается raw строка - okm +- hash_type может быть "sha256" или "sha224" +- salt - raw строка произвольного размера, может быть nil. "соль". несекретная информация. позволяет сделать результат разным на тех же ikm для разных значений salt. если nil, используется блок нулевых байт размером, равным размеру результата hash функции. +- ikm - raw строка - input keying material. на базе этих данных, salt и info генерируется okm - output keying material +- info - raw строка произвольного размера, может быть nil. аналогично salt, но salt подмешивается на extraction phase, а info - на expansion. если nil, то используется info нулевого размера. +- okm_len - требуемая длина okm - output keying material +- возвращается raw строка - okm ### Системные функции @@ -1887,9 +1915,8 @@ function getpid() function gettid() ``` -* getpid() возвращает идентификатор текущего процесса - PID -* gettid() возвращает идентификатор текущего потока - TID - +- getpid() возвращает идентификатор текущего процесса - PID +- gettid() возвращает идентификатор текущего потока - TID ### Опции по работе с пакетами @@ -1899,6 +1926,7 @@ function gettid() #### standard reconstruct Опции реконструкции диссектов - reconstruct_opts. Реконструкция - это сборка raw пакета из диссекта. + | Поле | Тип | Описание | | :---------------- | :----- | :-------------------------------------------------------------------------------------------- | | badsum | bool | испортить L4 checksum. посчитать чексумму и сделать xor со случайным значением от 1 до 0xFFFF | @@ -1924,6 +1952,7 @@ badsum вынесен в реконструкцию, поскольку чекс #### standard rawsend Опции отсылки raw пакетов - rawsend_opts + | Поле | Тип | Описание | | :------ | :----- | :-------------------------------------------------------------------------------------------------------- | | repeats | number | количество повторов отсылки одного и того же пакета | @@ -1968,10 +1997,10 @@ function reconstruct_dissect(dissect, reconstruct_opts) Реконструкция диссектов с IP фрагментацией происходит особым образом - с участием как LUA, так и C кода. LUA код должен подготовить диссект полного пакета, подлежащего фрагментации, но заполнить некоторые поля такими, какими они должны быть во фрагменте. -* ipv4 : ip.ip_len должен быть рассчитан таким, каким он должен быть во фрагменте. +- ipv4 : ip.ip_len должен быть рассчитан таким, каким он должен быть во фрагменте. По ip.ip_len С код определяет размер фрагментированной части. Поле ip.ip_off должно содержать offset фрагмента и признак IP_MF, если это не последний фрагмент. ip.ip_id должен быть не 0. -* ipv6 : нужно вставить в ip6.exthdr fragment header, в котором заполнить ident, offset и бит IP6F_MORE_FRAG, если это не последний фрагмент. +- ipv6 : нужно вставить в ip6.exthdr fragment header, в котором заполнить ident, offset и бит IP6F_MORE_FRAG, если это не последний фрагмент. ip6.ip6_len должен быть рассчитан таким, каким он должен быть во фрагменте. По этой длине C код определяет размер фрагмента. Позицию fragment header выбирает LUA код. Все, что после fragment header, считается fragmentable part. @@ -1988,9 +2017,10 @@ function reconstruct_ip6hdr(ip6, reconstruct_opts) ``` Реконструкция соответствующих raw заголовков из таблиц диссекта. Возвращает raw вариант заголовка. -* реконструкция ip6 задействует reconstruct_opts. из них берется ip6_preserve_next и ip6_last_proto. -* чексумма ip header считается автоматически, поскольку ни от чего больше не зависит -* чексуммы tcp и udp не считаются, поскольку зависят от других компонент + +- реконструкция ip6 задействует reconstruct_opts. из них берется ip6_preserve_next и ip6_last_proto. +- чексумма ip header считается автоматически, поскольку ни от чего больше не зависит +- чексуммы tcp и udp не считаются, поскольку зависят от других компонент #### csum_fix @@ -2003,8 +2033,8 @@ function csum_udp_fix(raw_ip_header, raw_udp_header, payload) Функции для выправления чексумм. Поскольку строки в LUA immutable, они возвращают копию соответствующего заголовка с исправленной чексуммой. -* с csum_ipv4_fix все просто. на входе ip заголовок, на выходе ip заголовок с исправленной суммой -* csum_tcp_fix и csum_udp_fix берут raw ip заголовок (ipv4 или ipv6), tcp/udp заголовок и пейлоад. версия ip определяется автоматически. чексумма считается на базе L3, L4 заголовков и пейлоада. +- с csum_ipv4_fix все просто. на входе ip заголовок, на выходе ip заголовок с исправленной суммой +- csum_tcp_fix и csum_udp_fix берут raw ip заголовок (ipv4 или ipv6), tcp/udp заголовок и пейлоад. версия ip определяется автоматически. чексумма считается на базе L3, L4 заголовков и пейлоада. Прямая реконструкция отдельных заголовков нужна редко. Обычно все задачи выполняют функции по работе с диссектами. Но если у вас особый случай, например вам нужно сконструировать icmp, то вам придется собирать его по частям и использовать rawsend для отсылки. @@ -2019,9 +2049,9 @@ function rawsend(raw_data, rawsend_opts) function rawsend_dissect(dissect, rawsend_opts, reconstruct_opts) ``` -* rawsend работает с raw строкой, содержащий полностью собранный ipv4 или ipv6 пакет -* rawsend_dissect собирает пакет из диссекта и отправляет -* dissect представляет собой таблицу, описанную в соответствующем разделе +- rawsend работает с raw строкой, содержащий полностью собранный ipv4 или ipv6 пакет +- rawsend_dissect собирает пакет из диссекта и отправляет +- dissect представляет собой таблицу, описанную в соответствующем разделе #### raw_packet @@ -2037,20 +2067,20 @@ LUA функции получают готовый диссект текущег #### маркеры -* **Абсолютный положительный маркер** - числовое смещение внутри пейлоада. -* **Абсолютный отрицательный маркер** - числовое смещение внутри пейлоада от следующего за концом байта. -1 указывает на последний байт. -* **Относительный маркер** - положительное или отрицательное смещение относительно логической позиции внутри пейлоада. +- **Абсолютный положительный маркер** - числовое смещение внутри пейлоада. +- **Абсолютный отрицательный маркер** - числовое смещение внутри пейлоада от следующего за концом байта. -1 указывает на последний байт. +- **Относительный маркер** - положительное или отрицательное смещение относительно логической позиции внутри пейлоада. Относительные позиции : -* **method** - начало метода HTTP ('GET', 'POST', 'HEAD', ...). Метод обычно всегда находится на позиции 0, но может сместиться из-за methodeol. Тогда позиция может стать 1 или 2. -* **host** - начало имени хоста -* **endhost** - байт, следующий за последним байтом имени хоста -* **sld** - начало домена 2 уровня в имени хоста -* **endsld** - байт, следующий за последним байтом домена 2 уровня в имени хоста -* **midsld** - середина домена 2 уровня в имени хоста -* **sniext** - начало поля данных SNI extension в TLS. Любой extension состоит из 2-байтовых полей type и length, за ними идет поле данных. -* **extlen** - поле длины TLS extensions +- **method** - начало метода HTTP ('GET', 'POST', 'HEAD', ...). Метод обычно всегда находится на позиции 0, но может сместиться из-за methodeol. Тогда позиция может стать 1 или 2. +- **host** - начало имени хоста +- **endhost** - байт, следующий за последним байтом имени хоста +- **sld** - начало домена 2 уровня в имени хоста +- **endsld** - байт, следующий за последним байтом домена 2 уровня в имени хоста +- **midsld** - середина домена 2 уровня в имени хоста +- **sniext** - начало поля данных SNI extension в TLS. Любой extension состоит из 2-байтовых полей type и length, за ними идет поле данных. +- **extlen** - поле длины TLS extensions Относительные маркеры работают с логическими элементами отдельных известных пейлоадов, поэтому они не будут работать с чем попало. @@ -2066,11 +2096,11 @@ function resolve_multi_pos(blob,l7payload_type,marker_list[,zero_based_pos]) function resolve_range(blob,l7payload_type,marker_list[,strict,zero_based_pos]) ``` -* resolve_pos работает с единственным маркером. если маркер не ресолвится, возвращается nil. -* resolve_multi_pos работает со списком маркеров через запятую. возвращает массив уникальных абсолютных позиций. если некоторые маркеры не ресолвятся - их не будет в результате. -* resolve_range ресолвит список из ровно 2 маркеров, представляющих собой диапазон внутри пейлоада. Если strict = true, и любой маркер не ресолвится, возвращается nil. Иначе если первый маркер не ресолвится - он заменяется на 0. Если не ресолвится второй маркер - он заменяется на длину пейлоада. Если не ресолвятся оба - возвращается nil. -* если задано zero_based_pos=true, все позиции начинаются с 0, иначе с 1, как это принято в LUA. -* при невалидных значениях l7payload_type, marker, marker_list, если количество маркеров не равно 2 для resolve_range - вызывается error +- resolve_pos работает с единственным маркером. если маркер не ресолвится, возвращается nil. +- resolve_multi_pos работает со списком маркеров через запятую. возвращает массив уникальных абсолютных позиций. если некоторые маркеры не ресолвятся - их не будет в результате. +- resolve_range ресолвит список из ровно 2 маркеров, представляющих собой диапазон внутри пейлоада. Если strict = true, и любой маркер не ресолвится, возвращается nil. Иначе если первый маркер не ресолвится - он заменяется на 0. Если не ресолвится второй маркер - он заменяется на длину пейлоада. Если не ресолвятся оба - возвращается nil. +- если задано zero_based_pos=true, все позиции начинаются с 0, иначе с 1, как это принято в LUA. +- при невалидных значениях l7payload_type, marker, marker_list, если количество маркеров не равно 2 для resolve_range - вызывается error ### Управление выполнением инстансов @@ -2082,9 +2112,10 @@ function instance_cutoff(ctx, outgoing) Добровольное само-отсечение инстанса по выбранному направлению. Инстанс перестает вызываться в рамках текущего потока. -* outgoing = true - исходящее направление -* outgoing = false - входящее направление -* outgoing = nil - оба направления + +- outgoing = true - исходящее направление +- outgoing = false - входящее направление +- outgoing = nil - оба направления #### lua_cutoff @@ -2109,6 +2140,7 @@ function execution_plan(ctx) их внутрипрофильных фильтрах и аргументах. **Элемент plan** + | Поле | Тип | Описание | | :------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------- | | func | string | имя desync функции | @@ -2118,6 +2150,7 @@ function execution_plan(ctx) | payload_filter | string | эффективный `--payload-filter` . список названий пейлоадов через запятую | **range** + | Поле | Тип | Описание | | :----------- | :---- | :---------------------------------------------------------- | | from | table | позиция нижней границы | @@ -2125,6 +2158,7 @@ function execution_plan(ctx) | upper_cutoff | bool | true = верхняя граница невключительна, false = включительна | **pos - from,to** + | Поле | Тип | Описание | | :--- | :----- | :----------------------------------- | | mode | string | режим счетчика - a, x, n, d, b, s, p | @@ -2139,7 +2173,6 @@ function execution_plan_cancel(ctx) Однократная отмена выполнения всех следующих инстансов внутри профиля. Инстанс, выполняющий отмену, берет на себя координацию дальнейших действий и называется оркестратором. - # Библиотека базовых функций zapret-lib.lua Почти каждая функция имеет подробные комментарии о своем предназначении и параметрах. @@ -2199,9 +2232,9 @@ function posdebug(ctx, desync) function detect_payload_str(ctx, desync) ``` -* arg: pattern - подстрока для поиска в desync.dis.payload -* arg: payload - присвоить это значение desync.l7payload в случае наличия подстроки -* arg: undetected - если присутствует, присвоить это значение desync.l7payload в случае отсутствия подстроки +- arg: pattern - подстрока для поиска в desync.dis.payload +- arg: payload - присвоить это значение desync.l7payload в случае наличия подстроки +- arg: undetected - если присутствует, присвоить это значение desync.l7payload в случае отсутствия подстроки Пример простейшего протокольного детектора. Ищет подстроку pattern в пейлоаде, в случае нахождения присваивает desync.l7payload = desync.arg.payload , иначе если есть desync.arg.undetected, присваивает desync.l7payload = desync.arg.undetected. @@ -2215,7 +2248,6 @@ function desync_orchestrator_example(ctx, desync) Тестовый оркестратор. Ничего специального не делает, только выполняет execution plan в исходном виде. - ## Служебные функции ### var_debug @@ -2285,12 +2317,12 @@ function hexdump(s, max) function hexdump_dlog(s) ``` -* string2hex преобразует raw строку в символьное hex представление. байты разделены пробелами. "\xAB\xCD\x01\0x2" => "AB CD 01 02" -* has_nonprintable возвращает true, если в строке s есть символы, кроме 0x20-0x7F, '\n', '\r', '\t' -* make_readable заменяет все символы, кроме 0x20-0x7F, точками -* str_or_hex возвращает саму строку, если has_nonpritable(s) = false, иначе string2hex(s) -* hexdump преобразует начальные байт raw строки s (до max байт) в hex строку + результат make_readable. Классический hex dump. -* hexdump_dlog выполняет hexdump и выводит результат в debug log +- string2hex преобразует raw строку в символьное hex представление. байты разделены пробелами. "\xAB\xCD\x01\0x2" => "AB CD 01 02" +- has_nonprintable возвращает true, если в строке s есть символы, кроме 0x20-0x7F, '\n', '\r', '\t' +- make_readable заменяет все символы, кроме 0x20-0x7F, точками +- str_or_hex возвращает саму строку, если has_nonpritable(s) = false, иначе string2hex(s) +- hexdump преобразует начальные байт raw строки s (до max байт) в hex строку + результат make_readable. Классический hex dump. +- hexdump_dlog выполняет hexdump и выводит результат в debug log ### pattern @@ -2307,10 +2339,10 @@ function blob(desync, name, def) function blob_or_def(desync, name, def) ``` -* blob - стандартная функция получения блоба. Если name начинается с `0x`, то дальнейшее интерпретируется как HEX строка. +- blob - стандартная функция получения блоба. Если name начинается с `0x`, то дальнейшее интерпретируется как HEX строка. Иначе читается переменная name сначала в desync. Если там нет, берется глобальная переменная. Если и ее нет, берется значение def. Если name = nil или пустая строка, вызывается error. -* blob_or_def - возвращает def, если name = nil, иначе аналогично blob +- blob_or_def - возвращает def, если name = nil, иначе аналогично blob ## Обслуживание tcp sequence numbers @@ -2323,9 +2355,9 @@ function seq_within(seq, seq_low, seq_hi) function is_retransmission(desync) ``` -* seq_{ge|gt|lt|le} выполняет сравнение sequence numbers в пределах 2 GB. если разница больше - результат неверный. ge означает `>=`, gt `>`, le `<=`, lt `<`. -* seq_within - `seq_low <= seq <= seq_hi` -* is_retransmission - является ли текущий диссект tcp ретрансмиссией +- seq_{ge|gt|lt|le} выполняет сравнение sequence numbers в пределах 2 GB. если разница больше - результат неверный. ge означает `>=`, gt `>`, le `<=`, lt `<`. +- seq_within - `seq_low <= seq <= seq_hi` +- is_retransmission - является ли текущий диссект tcp ретрансмиссией ## Обслуживание позиций @@ -2343,14 +2375,14 @@ function pos_str(desync, pos) Параметр mode содержит строку с одной буквой режима счетчика - 'a','x','n','d','b','s','p'. По умолчанию функции работают с текущим направлением. Если есть параметр reverse и он задан как true, берется противоположное направление. -* pos_counter_overflow - true, если mode = 's' или 'p' и произошел выход relative tcp sequence за пределы 2 GB. Счетчики больше не могут использоваться. -* pos_get_pos - получить значение счетчика mode из таблицы счетчиков `track_pos`. `track_pos` может быть `desync.track.pos.{direct,reverse,client,server}` -* pos_get - получить значение счетчика mode по текущему или противоположному направлению -* pos_check_from - проверить удовлетворяет ли текущая позиция нижней границе range -* pos_check_to - проверить удовлетворяет ли текущая позиция верхней границе range -* pos_range - проверить удовлетворяет ли текущая позиция range (нижней и верхней границе) -* pos_str - преобразование таблицы позиции pos в стандартную строковую форму ``, например `s100`. -* pos_range_str - преобразование таблицы диапазона range в стандартную строковую форму `(-|<)`, например `d1-p5000`. +- pos_counter_overflow - true, если mode = 's' или 'p' и произошел выход relative tcp sequence за пределы 2 GB. Счетчики больше не могут использоваться. +- pos_get_pos - получить значение счетчика mode из таблицы счетчиков `track_pos`. `track_pos` может быть `desync.track.pos.{direct,reverse,client,server}` +- pos_get - получить значение счетчика mode по текущему или противоположному направлению +- pos_check_from - проверить удовлетворяет ли текущая позиция нижней границе range +- pos_check_to - проверить удовлетворяет ли текущая позиция верхней границе range +- pos_range - проверить удовлетворяет ли текущая позиция range (нижней и верхней границе) +- pos_str - преобразование таблицы позиции pos в стандартную строковую форму ``, например `s100`. +- pos_range_str - преобразование таблицы диапазона range в стандартную строковую форму `(-|<)`, например `d1-p5000`. ## Диссекция @@ -2365,7 +2397,7 @@ function dissect_url(url) Возвращает таблицу, где разобраны части URL вида `proto://creds@domain:port/uri`. Если какая-либо из частей отсутствует, соответствующего поля нет в таблице. -
+
Пример разборки `https://user:pass@domain.com:12345/my_uri/script.php?a=1&b=3`
 .proto
@@ -2380,7 +2412,6 @@ function dissect_url(url)
   string /my_uri/script.php?a=1&b=3
 
- ### dissect_nld ``` @@ -2402,7 +2433,7 @@ function http_dissect_reply(http) В заголовках выдаются позиции начала и конца названия заголовка и самого значения. Названия полей в таблице headers соответствуют названию заголовков в нижнем регисте. Все позиции - внутри строки http. -
+
Пример разборки http запроса `http://testhost.com/testuri`
 .uri
@@ -2438,7 +2469,7 @@ function http_dissect_reply(http)
   string GET
 
-
+
Пример разборки http ответа
 .code
@@ -2500,9 +2531,10 @@ function fix_ip6_next(ip6, last_proto)
 
 Эти функции работают с диссектом ipv6 заголовка ip6 и его extension headers - ip6.exthdr.
 При вставлении или удалении extension headers сохраняется корректная цепочка следующих протоколов, начиная с базового ipv6 заголовка.
-* insert_ip6_exthdr вставляет extension header с протоколом header_type и данными data в диссект ip6 по индексу ip6.exthdr idx. Если idx=nil, вставляется в конец. Размер data должен быть 6+N*4 для IPPROTO_AH и 6+N*8 для остальных, иначе будут ошибки при реконструкции.
-* del_ip6_exthdr удаляет extension header по индексу ip6.exthdr idx.
-* fix_ip6_next восстанавливает корректную цепочку следующих протоколов за счет ip6.ip6_nxt и полей type в ip6.exthdr.
+
+- insert_ip6_exthdr вставляет extension header с протоколом header_type и данными data в диссект ip6 по индексу ip6.exthdr idx. Если idx=nil, вставляется в конец. Размер data должен быть 6+N*4 для IPPROTO_AH и 6+N*8 для остальных, иначе будут ошибки при реконструкции.
+- del_ip6_exthdr удаляет extension header по индексу ip6.exthdr idx.
+- fix_ip6_next восстанавливает корректную цепочку следующих протоколов за счет ip6.ip6_nxt и полей type в ip6.exthdr.
 
 ```
 function l3_base_len(dis)
@@ -2518,15 +2550,15 @@ function packet_len(dis)
 
 Подсчет размеров различных элементов диссекта после реконструкции.
 
-* l3_base_len - базовая длина ip/ip6 заголовка без опций и extension headers.
-* l3_extra_len - длина ip options или суммарная длина всех extension headers. Если задан ip6_exthdr_last_idx, считаются extension headers до указанного индекса.
-* l3_len - полная длина ip/ip6 с опциями и extension headers
-* l4_base_len - базовая длина tcp или udp заголовка
-* l4_extra_len - длина tcp options для tcp, 0 для udp
-* l4_len - полная длина tcp заголовка с опциями или длина udp заголовка
-* l3l4_extra_len - сумма l3_extra_len и l4_extra_len
-* l3l4_len - полная длина ip/ip6 и tcp заголовков со всеми options и extension headers
-* packet_len - полная длина реконструированного пакета, включая L4 пейлоад
+- l3_base_len - базовая длина ip/ip6 заголовка без опций и extension headers.
+- l3_extra_len - длина ip options или суммарная длина всех extension headers. Если задан ip6_exthdr_last_idx, считаются extension headers до указанного индекса.
+- l3_len - полная длина ip/ip6 с опциями и extension headers
+- l4_base_len - базовая длина tcp или udp заголовка
+- l4_extra_len - длина tcp options для tcp, 0 для udp
+- l4_len - полная длина tcp заголовка с опциями или длина udp заголовка
+- l3l4_extra_len - сумма l3_extra_len и l4_extra_len
+- l3l4_len - полная длина ip/ip6 и tcp заголовков со всеми options и extension headers
+- packet_len - полная длина реконструированного пакета, включая L4 пейлоад
 
 ## Работа с именами хостов
 
@@ -2536,11 +2568,13 @@ function packet_len(dis)
 function genhost(len, template)
 ```
 
-Генерирует случайный хост длиной len. 
-* Если есть template, генерирует случайный поддомен, чтобы вписаться в длину len. Если длины len не хватает, возвращает обрез template слева.
-* Если template=nil, генерирует случайный поддомен одного из известных 3-буквенных TLD. Если len<7, генерирует случайный домен без точек длиной len.
+Генерирует случайный хост длиной len.
+
+- Если есть template, генерирует случайный поддомен, чтобы вписаться в длину len. Если длины len не хватает, возвращает обрез template слева.
+- Если template=nil, генерирует случайный поддомен одного из известных 3-буквенных TLD. Если len<7, генерирует случайный домен без точек длиной len.
 
 Примеры :
+
 ```
 -- template "google.com", len=16 : h82aj.google.com
 -- template "google.com", len=11 : .google.com
@@ -2558,8 +2592,8 @@ function host_ip(desync)
 function host_or_ip(desync)
 ```
 
-* host_ip возвращает символьное представление desync.target.ip или desync.target.ip6
-* host_or_ip возвращает desync.track.hostname, если есть track и есть track.hostname, иначе host_ip(desync)
+- host_ip возвращает символьное представление desync.target.ip или desync.target.ip6
+- host_or_ip возвращает desync.track.hostname, если есть track и есть track.hostname, иначе host_ip(desync)
 
 ## Операции с именами файлов и путями
 
@@ -2569,12 +2603,12 @@ function append_path(path,file)
 function writeable_file_name(filename)
 ```
 
-* is_absolute_path возвращает true, если путь path начинается с корня. Учитываются особенности путей CYGWIN.
-* append_path дописывает имя файла или каталога file к пути path, разделяя их знаком '/'
-* writeable_file_name возвращает filename, если filename содержит абсолютный путь или env `WRITEABLE` отсутствует.
+- is_absolute_path возвращает true, если путь path начинается с корня. Учитываются особенности путей CYGWIN.
+- append_path дописывает имя файла или каталога file к пути path, разделяя их знаком '/'
+- writeable_file_name возвращает filename, если filename содержит абсолютный путь или env `WRITEABLE` отсутствует.
 Иначе берется путь из env `WRITEABLE` и к нему дописывается имя файла filename через append_path.
 
-## autottl 
+## autottl
 
 ```
 function parse_autottl(s)
@@ -2590,8 +2624,8 @@ delta - это положительная или отрицательная ра
 Вычисление производится на базе предположения о симметричности входящего и исходящего пути и TTL по умолчанию, используемых в основных ОС - 64, 128, 255.
 Эвристика работает не всегда из-за потенциальной неверности данных предположений, но иногда ее можно настроить до приемлемого уровня погрешности.
 
-* parse_autottl переводит строку вида `,-` в таблицу с идентичными полями. Вызывается error, если формат s неверен.
-* autottl производит эвристическую догадку о длине в хопах на базе TTL входящих пакетов и вычисляет TTL , учитывая дельту и допустимый диапазон.
+- parse_autottl переводит строку вида `,-` в таблицу с идентичными полями. Вызывается error, если формат s неверен.
+- autottl производит эвристическую догадку о длине в хопах на базе TTL входящих пакетов и вычисляет TTL , учитывая дельту и допустимый диапазон.
 Готовый incoming_ttl можно взять из desync. attl имеют формат таблицы, получаемой через parse_autottl.
 
 ## Операции с диссектами
@@ -2602,6 +2636,7 @@ delta - это положительная или отрицательная ра
 ### standard ipid
 
 **ipid_options**
+
 | Поле       | Описание                                                                                                                      |
 | :--------- | :---------------------------------------------------------------------------------------------------------------------------- |
 | ip_id      | режим назначения ip_id : seq, rnd, zero, none
seq - последовательное
rnd - случайное
zero - ноль
none - не менять | @@ -2617,6 +2652,7 @@ Windows заменяет нулевые ip_id на собственную пос ### standard fooling **fooling_options** + | Поле | Описание | | :-------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ip_ttl | изменить TTL в ipv4 заголовке на указанный | @@ -2659,6 +2695,7 @@ tcp_ts_up дублирует старое поведение - двигает ti для которых существуют свои специфические опции. **ipfrag_options** + | Поле | Описание | | :-------------- | :--------------------------------------------------------------------------------------------------------------- | | ipfrag | имя функции фрагментатора. если нет, использовать ipfrag2. фрагментатор возвращает массив диссектов - фрагментов | @@ -2718,9 +2755,9 @@ function wsize_rewrite(dis, arg) Переписать в диссекте dis tcp.th_win и scale factor в tcp оцпии, если она присутствует. Увеличение scaling factor блокируется. -* arg: wsize - window size -* arg: scale - scale factor -* возвращает true, если какое-либо изменение было произведено +- arg: wsize - window size +- arg: scale - scale factor +- возвращает true, если какое-либо изменение было произведено ### dis_reverse @@ -2740,6 +2777,7 @@ function dis_reverse(dis) ``` function rawsend_dissect_ipfrag(dis, options) ``` + Отправить диссект dis с IP фрагментацией, заданной в `options.ipfrag`. Если отсутствует - отправить без фрагментации. Использует кастомную функцию фрагментатор, если указано `options.ipfrag.ipfrag`. Отсылает фрагменты в обратном порядке, если указано `options.ipfrag.ipfrag_disorder`. @@ -2764,9 +2802,10 @@ mss берется из desync.tcp_mss. Если options отсутствуют, они создаются на базе desync.arg. Стандартные options формируются следующим образом : -* ipfrag, ipid, fooling принимают значение desync.arg -* rawsend : repeats берется из desync.arg.repeats, ifout и fwmark берутся из desync.arg, если они там есть, либо из desync (то, что пришло в desync функцию) -* reconstruct : берется только desync.arg.badsum, остальные опции не используются + +- ipfrag, ipid, fooling принимают значение desync.arg +- rawsend : repeats берется из desync.arg.repeats, ifout и fwmark берутся из desync.arg, если они там есть, либо из desync (то, что пришло в desync функцию) +- reconstruct : берется только desync.arg.badsum, остальные опции не используются ## Стандартные фильтры direction и payload @@ -2777,8 +2816,8 @@ function direction_cutoff_opposite(ctx, desync, def) Фильтр по направлению представляет собой строку "in", "out" или "any" и передается в desync.arg.dir. Если аргумент отсутствует, берется значение def. -* direction_check проверяет соответствие текущего направления фильтру. -* direction_cutoff_opposite выполняет [instance cutoff](#instance_cutoff) на текущее направление, если оно не соответствует фильтру. +- direction_check проверяет соответствие текущего направления фильтру. +- direction_cutoff_opposite выполняет [instance cutoff](#instance_cutoff) на текущее направление, если оно не соответствует фильтру. ``` function payload_match_filter(l7payload, l7payload_filter, def) @@ -2787,8 +2826,8 @@ function payload_check(desync, def) Функции работают со строкой - списком пейлоадов через запятую. Список известных типов пейлоада можно получить из help текста nfqws2. Все пустые пакеты имеют пейлоад empty, неизвестные - unknown. Особые значения - all и known. all означает любой пейлоад, known - не unknown и не empty. Префикс `~` в начале означает логическую инверсию - несоответствие списку. -* payload_match_filter проверяет соответствие l7payload списку l7payload_filter или def, если l7payload_filter=nil. Если оба nil - список берется как "known". -* payload_check вызывает `payload_match_filter(desync.l7payload, desync.arg.payload, def)` +- payload_match_filter проверяет соответствие l7payload списку l7payload_filter или def, если l7payload_filter=nil. Если оба nil - список берется как "known". +- payload_check вызывает `payload_match_filter(desync.l7payload, desync.arg.payload, def)` ## Работа с многопакетными пейлоадам @@ -2802,9 +2841,9 @@ function replay_drop_set(desync, v) function replay_drop(desync) ``` -* replay_first возвращает true, если текущий диссект не является [replay](#особенности-приема-многопакетных-пейлоадов) или является его первой частью -* replay_drop_set помечает в desync.track.lua_state boolean признак необходимости "v" дропнуть последующие части [replay](#особенности-приема-многопакетных-пейлоадов) -* replay_drop возвращает true, если необходимо дропнуть текущую часть [replay](#особенности-приема-многопакетных-пейлоадов). Если часть последняя - автоматически снимает признак. +- replay_first возвращает true, если текущий диссект не является [replay](#особенности-приема-многопакетных-пейлоадов) или является его первой частью +- replay_drop_set помечает в desync.track.lua_state boolean признак необходимости "v" дропнуть последующие части [replay](#особенности-приема-многопакетных-пейлоадов) +- replay_drop возвращает true, если необходимо дропнуть текущую часть [replay](#особенности-приема-многопакетных-пейлоадов). Если часть последняя - автоматически снимает признак. Функции работают корректно как с [реплеем](#особенности-приема-многопакетных-пейлоадов), так и обычными диссектами. Для обычных диссектов replay_first всегда true, replay_drop_set не меняет признак, replay_drop всегда false. @@ -2908,7 +2947,6 @@ function replay_execution_plan(desync) Выполняет весь [execution plan](#execution_plan) из desync.plan с учетом [instance cutoff](#instance_cutoff) и стандартных фильтров [payload](#внутрипрофильные-фильтры) и [range](#внутрипрофильные-фильтры). - # Библиотека программ атаки на DPI zapret-antidpi.lua ## Стандартные наборы параметров @@ -2925,9 +2963,10 @@ nfqws2 ничего не знает о том, что нужно `--lua-desync` ### standard direction -Фильтр по направлению. В большинстве функций, использующих фильтр по направлению, значение по умолчанию - "out", но есть и те, где по умолчанию "any". Фильтр по направлению можно реализовать и средствами C кода [`--in-range` и `--out-range`](#внутрипрофильные-фильтры). +Фильтр по направлению. В большинстве функций, использующих фильтр по направлению, значение по умолчанию - "out", но есть и те, где по умолчанию "any". Фильтр по направлению можно реализовать и средствами C кода [`--in-range` и `--out-range`](#внутрипрофильные-фильтры). **standard direction** + | Поле | Описание | | :--- | :----------------------------------------------------------------------------------- | | dir | in - входящее направление
out - исходящее направление
any - любое направление | @@ -2937,11 +2976,11 @@ nfqws2 ничего не знает о том, что нужно `--lua-desync` Фильтр по пейлоаду берет список типов пейлоада. Список известных типов пейлоада можно получить из help текста nfqws2. Все пустые пакеты имеют пейлоад empty, неизвестные - unknown. Особые значения - all и known. all означает любой пейлоад, known - не unknown и не empty. **standard payload** + | Поле | Описание | | :------ | :---------------------------------------------------------------------- | | payload | список допустимых пейлоадов через запятую. ~ в начале означает инверсию | - ## Базовые функции ### drop @@ -2950,9 +2989,9 @@ nfqws2 ничего не знает о том, что нужно `--lua-desync` function drop(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* По умолчанию payload=all, direction=any, то есть drop всего. +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- По умолчанию payload=all, direction=any, то есть drop всего. Выносит VERDICT_DROP при выполнении условий фильтра. @@ -2962,13 +3001,13 @@ function drop(ctx, desync) function send(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* режим ip_id по умолчанию - none +- arg: [standard direction](#standard-direction) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- режим ip_id по умолчанию - none Отсылает текущий диссект c опциональным применением модификаций. @@ -2978,9 +3017,9 @@ function send(ctx, desync) function pktmod(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) +- arg: [standard direction](#standard-direction) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) Применить модификации к текущему диссекту без отправки и вынесения вердикта. @@ -2992,8 +3031,8 @@ function pktmod(ctx, desync) function http_hostcase(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: spell - точное написание заголовка. по умолчанию "host" +- arg: [standard direction](#standard-direction) +- arg: spell - точное написание заголовка. по умолчанию "host" Заменяет регистр http заголовка `Host:` @@ -3003,7 +3042,7 @@ function http_hostcase(ctx, desync) function http_domcase(ctx, desync) ``` -* arg: [standard direction](#standard-direction) +- arg: [standard direction](#standard-direction) Меняет регистр написания домена внутри заголовка `Host:`. Верхний и нижний регистр чредуется каждый символ : `rUtRaCkEr.oRg`. @@ -3013,11 +3052,10 @@ function http_domcase(ctx, desync) function http_methodeol(ctx, desync) ``` -* arg: [standard direction](#standard-direction) +- arg: [standard direction](#standard-direction) Вставляет '\r\n' перед методом, отрезая 2 последних символа из содержимого заголовка `User-Agent:`. Работает только на nginx, остальные сервера ломает. - ## Замена window size ### wsize @@ -3026,8 +3064,8 @@ function http_methodeol(ctx, desync) function wsize(ctx, desync) ``` -* arg: wsize - размер tcp окна -* arg: scale - scaling фактор. заменяется в tcp option, если есть. только уменьшение, увеличение блокируется +- arg: wsize - размер tcp окна +- arg: scale - scaling фактор. заменяется в tcp option, если есть. только уменьшение, увеличение блокируется Меняет tcp.th_win и/или scaling factor в tcp оцпии в tcp пакете SYN,ACK, после чего выполняет [instance cutoff](#instance_cutoff). Если изменение выполнено - выставляет VERDICT_MODIFY. @@ -3039,10 +3077,10 @@ function wsize(ctx, desync) function wssize(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: wsize - размер tcp окна -* arg: scale - scaling фактор. заменяется в tcp option, если есть. только уменьшение, увеличение блокируется -* arg: forced_cutoff - список типов пейлоадов через зяпятую, при получении которых выполняется [instance cutoff](#instance_cutoff). Если нужно применять wssize бесконечно, можно указать forced_cutoff=no, то есть несуществующий тип пейлоада, который не придет никогда. +- arg: [standard direction](#standard-direction) +- arg: wsize - размер tcp окна +- arg: scale - scaling фактор. заменяется в tcp option, если есть. только уменьшение, увеличение блокируется +- arg: forced_cutoff - список типов пейлоадов через зяпятую, при получении которых выполняется [instance cutoff](#instance_cutoff). Если нужно применять wssize бесконечно, можно указать forced_cutoff=no, то есть несуществующий тип пейлоада, который не придет никогда. Меняет tcp.th_win и/или scaling factor в tcp оцпии во всех tcp пакетах потока по направлению до достижения условия "cutoff". Если изменение выполнено - выставляет VERDICT_MODIFY. @@ -3074,12 +3112,12 @@ function wssize(ctx, desync) function syndata(ctx, desync) ``` -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: blob - [blob](#передача-блобов), содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна. -* arg: tls_mod - применить указанный tls_mod к пейлоаду blob +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: blob - [blob](#передача-блобов), содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна. +- arg: tls_mod - применить указанный tls_mod к пейлоаду blob Функция добавляет в tcp SYN пакет пейлоад, применяет к нему модификации и отправляет вместо оригинала, вынося VERDICT_DROP. Если проходит пакет без SYN, выполняется [instance cutoff](#instance_cutoff). @@ -3092,16 +3130,16 @@ function syndata(ctx, desync) function fake(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: blob - blob, содержащий фейковый payload. Может быть любой длины - сегментация выполняется автоматически. -* arg: tls_mod - применить указанный tls_mod к пейлоаду blob -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: blob - blob, содержащий фейковый payload. Может быть любой длины - сегментация выполняется автоматически. +- arg: tls_mod - применить указанный tls_mod к пейлоаду blob +- payload фильтр по умолчанию - "known" Это прямой фейк - отдельный пакет или группа пакетов. Функция не выносит вердикт и не блокирует отправку оригинала. @@ -3111,15 +3149,15 @@ function fake(ctx, desync) function rst(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: rstack - отсылка RST,ACK вместо RST -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: rstack - отсылка RST,ACK вместо RST +- payload фильтр по умолчанию - "known" Отослать пустой TCP пакет с флагами RST или RST+ACK. Функция не выносит вердикт и не блокирует отправку оригинала. @@ -3131,19 +3169,19 @@ function rst(ctx, desync) function multisplit(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: pos - список [маркеров](#маркеры) через запятую - точек разреза. По умолчанию "2". -* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window -* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 -* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) -* arg: nodrop - отказ от вынесения VERDICT_DROP -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: pos - список [маркеров](#маркеры) через запятую - точек разреза. По умолчанию "2". +- arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window +- arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 +- arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) +- arg: nodrop - отказ от вынесения VERDICT_DROP +- payload фильтр по умолчанию - "known" Multisplit реализует последовательную сегментацию текущего диссекта или [реасма](#особенности-приема-многопакетных-пейлоадов) с разрезом в определяемых списком [маркеров](#маркеры) позициях. Опционально поддерживается замена блока данных на произвольный [blob](#передача-блобов) и техника seqovl. Выносится VERDICT_DROP после успешной отправки всех сегментов, если не указано "nodrop". @@ -3166,19 +3204,19 @@ seqovl - это фактически средство замешивания ф function multidisorder(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: pos - список [маркеров](#маркеры) через запятую - точек разреза. По умолчанию "2". -* arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево -* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 -* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) -* arg: nodrop - отказ от вынесения VERDICT_DROP -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: pos - список [маркеров](#маркеры) через запятую - точек разреза. По умолчанию "2". +- arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево +- arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 +- arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) +- arg: nodrop - отказ от вынесения VERDICT_DROP +- payload фильтр по умолчанию - "known" Аналогично [multisplit](#multisplit), но отправка сегментов производится в обратном порядке - с последнего по первый. @@ -3196,16 +3234,16 @@ function multidisorder(ctx, desync) function multidisorder_legacy(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: pos - список [маркеров](#маркеры) через запятую - точек разреза. По умолчанию "2". -* arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево -* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: pos - список [маркеров](#маркеры) через запятую - точек разреза. По умолчанию "2". +- arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево +- arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 Реализация multidisorder, полностью совместимая с nfqws1. @@ -3219,20 +3257,20 @@ function multidisorder_legacy(ctx, desync) function fakedsplit(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: pos - один [маркер](#маркеры) - точка разреза. По умолчанию "2". -* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window -* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 -* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) -* arg: nodrop - отказ от вынесения VERDICT_DROP -* arg: nofake1, nofake2, nofake3, nofake4 - отказ от отсылки отдельных фейков -* arg: pattern - [blob](#передача-блобов), которым заполняются фейковые части. По умолчанию 0x00. -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: pos - один [маркер](#маркеры) - точка разреза. По умолчанию "2". +- arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window +- arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 +- arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) +- arg: nodrop - отказ от вынесения VERDICT_DROP +- arg: nofake1, nofake2, nofake3, nofake4 - отказ от отсылки отдельных фейков +- arg: pattern - [blob](#передача-блобов), которым заполняются фейковые части. По умолчанию 0x00. +- payload фильтр по умолчанию - "known" Функция работает аналогично multisplit с одной позицией разреза, но с замешиванием фейков между реальными сегментами. Фейки совпадают в размерах с отсылаемыми частями и формируются на базе pattern со смещением, которое соответствует смещению tcp sequence отсылаемой части относительно первой. Для фейков необходим [фулинг](#standard-fooling), чтобы они не были приняты сервером. @@ -3248,9 +3286,9 @@ function fakedsplit(ctx, desync) Цель данной техники - запутать DPI что есть оригинал, а что есть fake. Части одного размера, в одной мусор, в другой - реальные данные. Что выбрать ? Не знаем... Все выглядит как ретрансмиссии, имеет те же sequence и размеры. -* К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. -* К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. -* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. +- К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. +- К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +- ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". [blob](#передача-блобов) позволяет заменить текущией пейлоад на произвольный [blob](#передача-блобов), и тем самым отослать любой совместимый пейлоад с тем же разбиением. @@ -3261,20 +3299,20 @@ function fakedsplit(ctx, desync) function fakeddisorder(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: pos - один [маркер](#маркеры) - точка разреза. По умолчанию "2". -* arg: seqovl - [маркер](#маркеры) - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево -* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 -* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) -* arg: nodrop - отказ от вынесения VERDICT_DROP -* arg: nofake1, nofake2, nofake3, nofake4 - отказ от отсылки отдельных фейков -* arg: pattern - [blob](#передача-блобов), которым заполняются фейковые части. По умолчанию 0x00. -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: pos - один [маркер](#маркеры) - точка разреза. По умолчанию "2". +- arg: seqovl - [маркер](#маркеры) - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево +- arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 +- arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) +- arg: nodrop - отказ от вынесения VERDICT_DROP +- arg: nofake1, nofake2, nofake3, nofake4 - отказ от отсылки отдельных фейков +- arg: pattern - [blob](#передача-блобов), которым заполняются фейковые части. По умолчанию 0x00. +- payload фильтр по умолчанию - "known" Функция работает аналогично multidisorder с одной позицией разреза, но с замешиванием фейков между реальными сегментами. Фейки совпадают в размерах с отсылаемыми частями и формируются на базе pattern со смещением, которое соответствует смещению tcp sequence отсылаемой части относительно первой. Для фейков необходим [фулинг](#standard-fooling), чтобы они не были приняты сервером. @@ -3290,9 +3328,9 @@ function fakeddisorder(ctx, desync) Кроме запутывания DPI в реальных и фейковых сегментах, добавляется еще и запутывание в их последовательности. -* К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. -* К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. -* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. +- К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. +- К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +- ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". [blob](#передача-блобов) позволяет заменить текущией пейлоад на произвольный [blob](#передача-блобов), и тем самым отослать любой совместимый пейлоад с тем же разбиением. @@ -3303,19 +3341,19 @@ function fakeddisorder(ctx, desync) function hostfakesplit(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: host - шаблон для [генерации фейкового хоста](#genhost) - random.template -* arg: midhost - [маркер](#маркеры) для дополнительного разреза сегмента с реальным хостом -* arg: disorder_after - [маркер](#маркеры) для дополнительного разреза заключительной реальной части и отправки сегментов в обратном порядке -* arg: nofake, nofake2 - отказ от отсылки отдельных фейков -* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) -* arg: nodrop - отказ от вынесения VERDICT_DROP -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: host - шаблон для [генерации фейкового хоста](#genhost) - random.template +- arg: midhost - [маркер](#маркеры) для дополнительного разреза сегмента с реальным хостом +- arg: disorder_after - [маркер](#маркеры) для дополнительного разреза заключительной реальной части и отправки сегментов в обратном порядке +- arg: nofake, nofake2 - отказ от отсылки отдельных фейков +- arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) +- arg: nodrop - отказ от вынесения VERDICT_DROP +- payload фильтр по умолчанию - "known" Это специальный "резатель" с замешиванием фейков для пейлоадов, в которых присутствует имя хоста - http_req и tls_client_hello. Двумя основными точкам разреза являются начало имени хоста - [маркер](#маркеры) "host" и конец имени хоста - [маркер](#маркеры) "endhost". Дополнительными и опциональными точками разреза являются [маркер](#маркеры) midhost (должен быть в пределах host..endost) и [маркер](#маркеры) disorder_after (должен быть больше endhost). При разрезе по disorder_after части отправляются в обратном порядке. @@ -3329,9 +3367,9 @@ function hostfakesplit(ctx, desync) 4. Фейк host..endhost-1 (fake2) 5. Реальная часть после host, либо 2 части : disorder_after..-1, endhost..disorder_after-1 -* К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. -* К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. -* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. +- К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. +- К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +- ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". [blob](#передача-блобов) позволяет заменить текущией пейлоад на произвольный [blob](#передача-блобов), и тем самым отослать любой совместимый пейлоад с тем же разбиением. @@ -3342,18 +3380,18 @@ function hostfakesplit(ctx, desync) function tcpseg(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: [standard fooling](#standard-fooling) -* arg: [standard ipid](#standard-ipid) -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: pos - список из двух [маркеров](#маркеры), определяющий границы tcp сегмента -* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window -* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 -* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: [standard fooling](#standard-fooling) +- arg: [standard ipid](#standard-ipid) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: pos - список из двух [маркеров](#маркеры), определяющий границы tcp сегмента +- arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window +- arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00 +- arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов) +- payload фильтр по умолчанию - "known" Отсылает часть текущего диссекта, [реасма](#особенности-приема-многопакетных-пейлоадов), или произвольного blob, ограниченную двумя [маркерами](#маркеры) pos с опциональным применением техники seqovl таким же способом, как и в [multisplit](#multisplit). Дополнительная сегментация при превышении MSS производится автоматически. @@ -3377,14 +3415,14 @@ function tcpseg(ctx, desync) function udplen(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: [standard payload](#standard-payload) -* arg: min - не трогать пакеты с длиной L4 пейлоада меньше -* arg: max - не трогать пакеты с длиной L4 пейлоада больше -* arg: increment - на сколько увеличить (+) или уменьшить (-) длину L4 пейлоада -* arg: pattern - [blob](#передача-блобов), которым заполняется конец пакета при увеличении длины -* arg: pattern_offset - начальное смещение внутри pattern -* payload фильтр по умолчанию - "known" +- arg: [standard direction](#standard-direction) +- arg: [standard payload](#standard-payload) +- arg: min - не трогать пакеты с длиной L4 пейлоада меньше +- arg: max - не трогать пакеты с длиной L4 пейлоада больше +- arg: increment - на сколько увеличить (+) или уменьшить (-) длину L4 пейлоада +- arg: pattern - [blob](#передача-блобов), которым заполняется конец пакета при увеличении длины +- arg: pattern_offset - начальное смещение внутри pattern +- payload фильтр по умолчанию - "known" Функция увеличивает или уменьшает длину L4 пейлоада udp. При уменьшении часть информации обрезается и теряется, при увеличении - заполняется pattern. Сегментация udp невозможна - при превышении MTU или PMTU пакет не дойдет до адресата. Ошибка в случае превышения MTU будет только на Linux, остальные системы молча не отправят пакет (windivert и ipdivert не имеют средств обнаружения ошибки). @@ -3394,12 +3432,11 @@ function udplen(ctx, desync) function dht_dn(ctx, desync) ``` -* arg: [standard direction](#standard-direction) -* arg: dn - число N, следующее после 'd' в сообщении dht +- arg: [standard direction](#standard-direction) +- arg: dn - число N, следующее после 'd' в сообщении dht dht использует формат bencode для передачи сообщений. 'd' - это тип данных directory. Сообщения dht как правило начинаются с 'd1' или 'd2' и заканчиваются 'e' (end). В некоторых DPI прописаны именно такие сигнатуры - только 'd1' или 'd1'+'d2'. Но можно поставить и 'd3', 'd4', ..., если корректно отредактировать содержимое, не нарушив формат bencode. Этим и занимается данная функция. Работает только по пейлоаду с типом "dht". - ## Другие функции ### synack @@ -3408,9 +3445,9 @@ dht использует формат bencode для передачи сообщ function synack(ctx, desync) ``` -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) Отсылает перед SYN пакет SYN,ACK, чтобы запутать DPI относительно направления tcp соединения. Атака называется в литературе "TCB turnaround". Ломает NAT - через NAT применение невозможно. Применение на проходящем трафике требует nftables и режим POSTNAT. После прохода пакета без SYN выполняет [instance cutoff](#instance_cutoff). Вердикт не выносит. @@ -3420,16 +3457,15 @@ function synack(ctx, desync) function synack_split(ctx, desync) ``` -* arg: [standard ipfrag](#standard-ipfrag) -* arg: [standard reconstruct](#standard-reconstruct) -* arg: [standard rawsend](#standard-rawsend) -* arg: mode - "syn", "synack" или "acksyn" +- arg: [standard ipfrag](#standard-ipfrag) +- arg: [standard reconstruct](#standard-reconstruct) +- arg: [standard rawsend](#standard-rawsend) +- arg: mode - "syn", "synack" или "acksyn" Методика предназначена для серверов. В литературе имеет название "TCP split handshake". Заменяет исходящий от сервера пакет SYN,ACK на SYN, 2 пакета SYN + ACK или 2 пакета ACK + SYN. В случае успеха отсылки выносит VERDICT_DROP. После прохода пакета без SYN,ACK выполняет [instance cutoff](#instance_cutoff). Многие DPI ожидают стандартный ответ на SYN в виде SYN,ACK. В реальности получается, что ответ на SYN является тоже SYN, а потом клиент шлет серверу SYN,ACK. Тем самым DPI перестает понимать какая сторона является клиентом, а какая сервером, и алгоритм проверки дает сбой. Атака может сработать даже если клиент не делает ничего для обхода блокировки. Может использоваться совместно с клиентскими техниками для точечного пробития tcp. - # Библиотека программ автоматизации и оркестрации zapret-auto.lua Стандартный порядок применения инстансов линеен - слева направо с учетом [внутрипрофильных фильтров](#внутрипрофильные-фильтры) и [instance cutoff](#instance_cutoff). nfqws2 никаких других вариантов не предоставляет. @@ -3462,8 +3498,8 @@ function automate_conn_record(desync) function standard_hostkey(desync) ``` -* arg: reqhost - требовать наличие hostname, не работать по IP -* arg: nld - номер уровня домена, до которого отсекается hostname. если не задано - не отсекается +- arg: reqhost - требовать наличие hostname, не работать по IP +- arg: nld - номер уровня домена, до которого отсекается hostname. если не задано - не отсекается Стандартный генератор host-ключей. Функция вычисляет строку-ключ, связанный с именем хоста или IP адресом, если имя хоста отсутствует. Если не может - возвращает nil. @@ -3473,8 +3509,8 @@ function standard_hostkey(desync) function automate_conn_record(desync) ``` -* arg: key - ключ внутри глобальной таблицы autostate. если не задано, в качестве ключа используется имя текущего инстанса -* arg: hostkey - имя функции генератора host-ключей. если не задано, используется [standard_hostkey](#standard_hostkey) +- arg: key - ключ внутри глобальной таблицы autostate. если не задано, в качестве ключа используется имя текущего инстанса +- arg: hostkey - имя функции генератора host-ключей. если не задано, используется [standard_hostkey](#standard_hostkey) Возвращат таблицу - хранилище состояния автоматизации, привязанное к хосту или IP адресу. Используется 2 ключа - key и hostkey. Итоговое расположение - `autostate.key.hostkey`. Если hostkey получить не удается - возвращается nil. @@ -3488,10 +3524,10 @@ function automate_conn_record(desync) function automate_failure_counter(hrec, crec, fails, maxtime) ``` -* hrec - [хост хранилище](#automate_host_record) -* crec - [потоковое хранилище](#automate_conn_record) -* fails - целевое количество неудач -* maxtime - время в секундах, после которого с момента предыдущей неудачи следующая неудача начинает счет заново +- hrec - [хост хранилище](#automate_host_record) +- crec - [потоковое хранилище](#automate_conn_record) +- fails - целевое количество неудач +- maxtime - время в секундах, после которого с момента предыдущей неудачи следующая неудача начинает счет заново Возвращает true, если счетчик достиг значения fails. При этом счетчик сбрасывается. @@ -3501,7 +3537,7 @@ function automate_failure_counter(hrec, crec, fails, maxtime) function automate_failure_counter_reset(hrec) ``` -* hrec - [хост хранилище](#automate_host_record) +- hrec - [хост хранилище](#automate_host_record) Сбрасывает значение счетчика. @@ -3515,12 +3551,12 @@ function automate_failure_counter_reset(hrec) function automate_failure_check(desync, hrec, crec) ``` -* hrec - [хост хранилище](#automate_host_record) -* crec - [потоковое хранилище](#automate_conn_record) -* arg: success_detector - имя функции детектора удач. если не задано, используется standard_success_detector. -* arg: failure_detector - имя функции детектора неудач. если не задано, используется standard_failure_detector. -* arg: fails - целевое значение счетчика неудач. По умолчанию - 3. -* arg: maxtime - максимальное время в секундах между неудачами, после которого счетчик сбрасывается. По умолчанию - 60 сек. +- hrec - [хост хранилище](#automate_host_record) +- crec - [потоковое хранилище](#automate_conn_record) +- arg: success_detector - имя функции детектора удач. если не задано, используется standard_success_detector. +- arg: failure_detector - имя функции детектора неудач. если не задано, используется standard_failure_detector. +- arg: fails - целевое значение счетчика неудач. По умолчанию - 3. +- arg: maxtime - максимальное время в секундах между неудачами, после которого счетчик сбрасывается. По умолчанию - 60 сек. Функция выполняет ведение счетчика неудач, вызывая детекторы удачи и неудачи. Возвращает true, если счетчик достиг целевого значения. При этом счетчик сбрасывается автоматически. @@ -3533,10 +3569,10 @@ function automate_failure_check(desync, hrec, crec) function standard_success_detector(desync, crec) ``` -* crec - [потоковое хранилище](#automate_conn_record) -* arg: maxseq - исходящий relative sequence, при достижении которого фиксируется удача. по умолчанию 32768. Смысл : отправлено достаточно много без застревания потока из-за блокировки. -* arg: inseq - входящий relative sequence, при достижении которого фиксируется удача. по умолчанию 4096. Смысл : оппонент прислал достаточно много, чтобы это не было реакцией DPI. -* arg: udp_out, udp_in - принято более udp_in udp пакетов при условии, что udp_out>0. Смысл : оппонент прислал достаточно много, чтобы это не было реакцией DPI. +- crec - [потоковое хранилище](#automate_conn_record) +- arg: maxseq - исходящий relative sequence, при достижении которого фиксируется удача. по умолчанию 32768. Смысл : отправлено достаточно много без застревания потока из-за блокировки. +- arg: inseq - входящий relative sequence, при достижении которого фиксируется удача. по умолчанию 4096. Смысл : оппонент прислал достаточно много, чтобы это не было реакцией DPI. +- arg: udp_out, udp_in - принято более udp_in udp пакетов при условии, что udp_out>0. Смысл : оппонент прислал достаточно много, чтобы это не было реакцией DPI. Стандартный детектор удач. @@ -3546,14 +3582,14 @@ function standard_success_detector(desync, crec) function standard_failure_detector(desync, crec) ``` -* crec - [потоковое хранилище](#automate_conn_record) -* arg: maxseq - считать ретрансмиссии в пределах исходящих relative sequence от 1 до maxseq. По умолчанию - 32768. -* arg: retrans - считать неудачей не менее retrans ретрансмиссий. По умолчанию - 3. -* arg: reset - посылать ретрансмиттеру RST, чтобы прекратить долгое ожидание -* arg: inseq - считать неудачей RST и http redirect в пределах входящих relative sequence от 1 до inseq. По умолчанию - 4096. -* arg: no_rst - не определять RST как неудачу -* arg: no_http_redirect - не определять http redirect как неудачу -* arg: udp_out, udp_in - считать неудачей ситуацию, когда по потоку отослано >=udp_out пакетов, а принято <=udp_in пакетов. Смысл : мы много шлем, а нам не отвечают или отвечают мало. +- crec - [потоковое хранилище](#automate_conn_record) +- arg: maxseq - считать ретрансмиссии в пределах исходящих relative sequence от 1 до maxseq. По умолчанию - 32768. +- arg: retrans - считать неудачей не менее retrans ретрансмиссий. По умолчанию - 3. +- arg: reset - посылать ретрансмиттеру RST, чтобы прекратить долгое ожидание +- arg: inseq - считать неудачей RST и http redirect в пределах входящих relative sequence от 1 до inseq. По умолчанию - 4096. +- arg: no_rst - не определять RST как неудачу +- arg: no_http_redirect - не определять http redirect как неудачу +- arg: udp_out, udp_in - считать неудачей ситуацию, когда по потоку отослано >=udp_out пакетов, а принято <=udp_in пакетов. Смысл : мы много шлем, а нам не отвечают или отвечают мало. Стандартный детектор неудач. @@ -3567,14 +3603,15 @@ http редиректом от DPI считается то же самое , ч function circular(ctx, desync) ``` -* arg: [standard host storage](#automate_host_record) -* arg: [standard checker](#automate_failure_check) -* arg: (только для стандартного детектора) [standard success detector](#standard_success_detector) -* arg: (только для стандартного детектора) [standard failure detector](#standard_failure_detector) +- arg: [standard host storage](#automate_host_record) +- arg: [standard checker](#automate_failure_check) +- arg: (только для стандартного детектора) [standard success detector](#standard_success_detector) +- arg: (только для стандартного детектора) [standard failure detector](#standard_failure_detector) Оркестратор позволяет считать неудачи и менять стратегии по кругу по достижению счетчиком неудач целевого значения fails. Все последующие инстансы маркируются аргументом "strategy", который содержит номер стратегии, начиная от 1. Инстансы, не имеющие аргумента "strategy", circular не вызывает. Номера стратегии должны идти непрерывно от 1 до последней, промежутки не допускаются, иначе вызывается error. Если в любом инстансе стратегии N имеется аргумент "final", эта стратегия является последней - дальнейшее хождение по кругу блокируется. Пример запуска : + ``` --lua-desync=circular:fails=4:retrans=2:maxseq=16384 --lua-desync=argdebug:v=1.1:strategy=1 @@ -3593,12 +3630,12 @@ function circular(ctx, desync) function repeater(ctx, desync) ``` -* arg: instances - сколько ближайших инстансов повторять -* arg: repeats - количество повторов -* arg: stop - не проигрывать однократно последующие инстансы после "instances" -* arg: clear - очистить execution plan после повторений -* arg: iff - имя [функции условия](#iff-функции) для продолжения цикла повторов. если не задано - условие всегда true -* arg: neg - инвертировать значение iff. по умолчанию - false +- arg: instances - сколько ближайших инстансов повторять +- arg: repeats - количество повторов +- arg: stop - не проигрывать однократно последующие инстансы после "instances" +- arg: clear - очистить execution plan после повторений +- arg: iff - имя [функции условия](#iff-функции) для продолжения цикла повторов. если не задано - условие всегда true +- arg: neg - инвертировать значение iff. по умолчанию - false Смысл repeater заключен в самом названии - он повторяет последующие инстансы в количестве instances repeats раз. Повторение идет по принципу 1-2-3-1-2-3-1-2-3-4-5-6. 4-5-6 в данном случае - последующие за 1-2-3 инстансы, если instances=3. Если задано stop или clear, 4-5-6 не вызываются. clear дополнительно очищает execution plan - бывает нужно для взаимодействия с вышестоящими оркестраторами. @@ -3622,8 +3659,8 @@ repeater может сколько угодно раз быть вложенны function condition(ctx, desync) ``` -* arg: iff - имя [функции условия](#iff-функции) -* arg: neg - инвертировать значение iff. по умолчанию - false +- arg: iff - имя [функции условия](#iff-функции) +- arg: neg - инвертировать значение iff. по умолчанию - false condition вызывает iff. если iff xor neg = true, выполняются все инстансы plan, иначе план очищается. @@ -3633,8 +3670,8 @@ condition вызывает iff. если iff xor neg = true, выполняют function condition(ctx, desync) ``` -* arg: iff - имя [функции условия](#iff-функции) -* arg: neg - инвертировать значение iff. по умолчанию - false +- arg: iff - имя [функции условия](#iff-функции) +- arg: neg - инвертировать значение iff. по умолчанию - false stopif вызывает iff. если iff xor neg = true, план очищается, иначе не делается ничего. @@ -3667,7 +3704,7 @@ function cond_false(desync) function cond_random(desync) ``` -* arg: percent - процент выпадения true. по умолчанию 50 +- arg: percent - процент выпадения true. по умолчанию 50 Случайное значение true с вероятностью percent, иначе false. @@ -3677,12 +3714,11 @@ function cond_random(desync) function cond_payload_str(desync) ``` -* arg: pattern - строка, которая ищется в пейлоаде +- arg: pattern - строка, которая ищется в пейлоаде Возвращает true, если в desync.dis.payload присутствует подстрока pattern. Это простейший сигнатурый детектор. Если C код не распознает нужный вам протокол, вы можете написать свой сигнатурный детектор и запускать последующие инстансы под оркестратором condition с вашим детектором в качестве iff. - # Вспомогательные программы ## ip2net @@ -3696,6 +3732,7 @@ function cond_payload_str(desync) --v4-threshold=mul/div ; ipv4 : включать подсети, в которых заполнено по крайней мере mul/div адресов. например : 3/4 --v6-threshold=N ; ipv6 : минимальное количество ip для создания подсети ``` + В списке могут присутствовать записи вида ip/prefix и ip1-ip2. Такие записи выкидываются в stdout без изменений. Они принимаются командой ipset. ipset умеет для листов hash:net из ip1-ip2 делать оптимальное покрытие ip/prefix. ipfw из FreeBSD понимает ip/prefix, но не понимает ip1-ip2. @@ -3708,6 +3745,7 @@ ip2net фильтрует входные данные, выкидывая неп Сначала в указанном диапазоне длин префиксов ищутся подсети, в которых количество адресов - максимально. Если таких сетей найдено несколько, берется наименьшая сеть (префикс больше). Например, заданы параметры v6_threshold=2 prefix_length=32-64, имеются следующие ipv6 : + ``` 1234:5678:aaaa::5 1234:5678:aaaa::6 @@ -3715,15 +3753,19 @@ ip2net фильтрует входные данные, выкидывая неп Результат будет : 1234:5678:aaa8::/45 ``` + Эти адреса так же входят в подсеть /32. Однако, нет смысла проходиться ковровой бомбардировкой, когда те же самые адреса вполне влезают в /45 и их ровно столько же. Если изменить v6_threshold=4, то результат будет: + ``` 1234:5678:aaaa::5 1234:5678:aaaa::6 1234:5678:aaac::5 ``` + То есть ip не объединятся в подсеть, потому что их слишком мало. Если изменить `prefix_length=56-64`, результат будет: + ``` 1234:5678:aaaa::/64 1234:5678:aaac::5 @@ -3796,14 +3838,17 @@ blockcheck2 работает не всех поддерживаемых плат yandex предоставляет DNS на портах 1253. На openwrt он прописывается довольно просто : **/etc/config/dhcp** + ``` config dnsmasq - list server '77.88.8.88#1253' + list server '77.88.8.88#1253' ``` + **/etc/config/network** + ``` config interface 'wan' - option peerdns '0' + option peerdns '0' ``` blockcheck2 способен определить подменяется ли DNS и перехватывается ли обращение к сторонним DNS. Если есть подмена, он автоматически переходит на DoH. @@ -3821,9 +3866,9 @@ blockcheck2 способен определить подменяется ли DN ### Уровни сканирования -* standard - использовать алгоритм теста, позволяющий исключить тестирование неактуальных по его мнению стратегий в зависимости от успешности предыдущих или по каким-то другим критериям. В случае множественных попыток тестирование не прекращается при неудаче. Процент успеха и ошибки curl тоже могут служить полезной информации при анализе ситуации. -* quick - то же самое, что и standard, но при использовании множественных попыток прекращение тестирования после первой неудачи -* force - тестировать максимально много без учета результата предыдущих тестов +- standard - использовать алгоритм теста, позволяющий исключить тестирование неактуальных по его мнению стратегий в зависимости от успешности предыдущих или по каким-то другим критериям. В случае множественных попыток тестирование не прекращается при неудаче. Процент успеха и ошибки curl тоже могут служить полезной информации при анализе ситуации. +- quick - то же самое, что и standard, но при использовании множественных попыток прекращение тестирования после первой неудачи +- force - тестировать максимально много без учета результата предыдущих тестов ### Поддерживаемые протоколы @@ -4021,7 +4066,6 @@ SIMULATE=1 - включить режим симуляции для отладк SIM_SUCCESS_RATE= - вероятность успеха симуляции в процентах ``` - # Скрипты запуска Под скриптами запуска понимается обвязка для Linux, позволяющая устанавливать, настраивать, удалять, запускать и останавливать программу. Сюда же входит система обслуживания файлов IP и хост листов. Она поддерживает openwrt и классические Linux с systemd и openrc. Для остальных Linux и прошивок возможна настройка параметров, но обеспечить автозапуск вам нужно самостоятельно. @@ -4072,13 +4116,13 @@ nfqws2 может работать и самостоятельно без скр | FILTER_TTL_EXPIRED_ICMP | фильтровать "time exceeded" в ответ на пакеты, принадлежащие потокам, прошедшим через zapret | | GETLIST | [скрипт внутри ipset](#система-ведения-листов), вызываемый из `ipset/get_config.sh` . если не указано - `ipset/get_ipban.sh` | -* По стандартным режимом nfqws2 понимается то, что запускается с параметрами `NFQWS2_OPT` при включении `NFQWS2_ENABLE`. В противовес [custom скриптам](#custom-скрипты), откуда могут запускаться нестандартные, кастомные, инстансы nfqws2. -* netifd интерфейсы - это то, что видно в `/etc/config/network` или в Luci, и что берет команда ifstatus. Не являются интерфейсами Linux. Интерфейсы Linux указываются в параметре device в определении интерфейса и видны по команде `ip link`. Например, интерфейс netifd - "lan", интерфейс Linux - "br-lan". В OPENWRT_LAN надо вписывать "lan", а не "br-lan", иначе это работать не будет. -* Указание LAN интерфейсов нужно только для flow offloading в nftables, больше ни для чего не используется. -* Параметры командной строки `NFQWS2_OPT` включают только стратегию. Стандартные LUA файлы, служебные параметры типа `--qnum` или `--user` добавляются автоматически. Можно добавлять свои `--blob` или `--lua-init`. -* `NFQWS2_OPT` берет маркеры `` и ``. Это подстановка стандартных листов. Маркеры замещаются на параметры `--hostlist` и `--hostlist-auto` в зависимости от режима `MODE_FILTER`. `` добавляет автохослист как обычный лист без авто. В параметры вписываются только те файлы стандартных листов, которые по факту есть. Маркеры могут вписываться в разные профили, и только вы можете знать куда их вписывать , а куда нет, исходя из логики ваших стратегий. -* Прямое указание параметров в `NFQWS2_OPT` типа `--hostlist=/opt/zapret2/ipset/zapret-hosts-user.txt` крайне не приветствуется, поскольку ломает логику `MODE_FILTER` и скриптов получения листов - их результат может не быть учтен. -* Класть свои файлы в `/opt/zapret2` чревато тем, что их снесет инсталятор при обновлении zapret2. Используете расположение вне каталога zapret2. +- По стандартным режимом nfqws2 понимается то, что запускается с параметрами `NFQWS2_OPT` при включении `NFQWS2_ENABLE`. В противовес [custom скриптам](#custom-скрипты), откуда могут запускаться нестандартные, кастомные, инстансы nfqws2. +- netifd интерфейсы - это то, что видно в `/etc/config/network` или в Luci, и что берет команда ifstatus. Не являются интерфейсами Linux. Интерфейсы Linux указываются в параметре device в определении интерфейса и видны по команде `ip link`. Например, интерфейс netifd - "lan", интерфейс Linux - "br-lan". В OPENWRT_LAN надо вписывать "lan", а не "br-lan", иначе это работать не будет. +- Указание LAN интерфейсов нужно только для flow offloading в nftables, больше ни для чего не используется. +- Параметры командной строки `NFQWS2_OPT` включают только стратегию. Стандартные LUA файлы, служебные параметры типа `--qnum` или `--user` добавляются автоматически. Можно добавлять свои `--blob` или `--lua-init`. +- `NFQWS2_OPT` берет маркеры `` и ``. Это подстановка стандартных листов. Маркеры замещаются на параметры `--hostlist` и `--hostlist-auto` в зависимости от режима `MODE_FILTER`. `` добавляет автохослист как обычный лист без авто. В параметры вписываются только те файлы стандартных листов, которые по факту есть. Маркеры могут вписываться в разные профили, и только вы можете знать куда их вписывать , а куда нет, исходя из логики ваших стратегий. +- Прямое указание параметров в `NFQWS2_OPT` типа `--hostlist=/opt/zapret2/ipset/zapret-hosts-user.txt` крайне не приветствуется, поскольку ломает логику `MODE_FILTER` и скриптов получения листов - их результат может не быть учтен. +- Класть свои файлы в `/opt/zapret2` чревато тем, что их снесет инсталятор при обновлении zapret2. Используете расположение вне каталога zapret2. ## Система ведения листов @@ -4121,9 +4165,9 @@ ip листы разделяются на ipv4 и ipv6. ipv6 листы имею Имена ipset-ов : -* nozapret, nozapret6 - исключение IP адресов -* zapret, zapret6 - включение IP адресов -* ipban, ipban6 - отдельный включающий список для стороннего перенаправления или проксирования +- nozapret, nozapret6 - исключение IP адресов +- zapret, zapret6 - включение IP адресов +- ipban, ipban6 - отдельный включающий список для стороннего перенаправления или проксирования ipfw использует set-ы, включающие как ipv4, так и ipv6 адреса, поэтому варианты "6" не применяются. @@ -4145,7 +4189,7 @@ ipfw использует set-ы, включающие как ipv4, так и ip #### get_antifilter_*.sh -Загружает ip или хостлисты с https://antifilter.network. +Загружает ip или хостлисты с . Роскомнадзор в своей непрестанной заботе о благополучии граждан Российской Федерации ведет несколько списков ресурсов, на которые гражданам ходить нельзя. К сожалению, из-за нехватки сил, вызванной думами о будущем России, они не могут донести содержимое этого списка до каждого гражданина Российской Федерации. @@ -4155,13 +4199,13 @@ ipfw использует set-ы, включающие как ipv4, так и ip #### get_antizapret_domains.sh -Загружает хостлисты с https://antizapret.prostovpn.org. +Загружает хостлисты с . Хостлист со старого сервиса обхода блокировок "prostovpn.org" #### get_refilter_*.sh -Загружает ip или хостлист с https://github.com/1andrevich/Re-filter-lists. +Загружает ip или хостлист с . Re:filter — это попытка создать актуальный список заблокированных доменов и IP-адресов в РФ, а также популярных и заблокированных для пользователей из России. @@ -4169,17 +4213,16 @@ Re:filter — это попытка создать актуальный спис #### get_reestr_*.sh -Загружает ip или хостлисты с https://github.com/bol-van/rulist. +Загружает ip или хостлисты с . IP листы содержат как ipv4, так и ipv6. -* `get_reestr_resolvable_domains.sh` - список заблокированных доменов, которые ресолвятся. Среди заблокированных доменов больше половины уже мертвы. Чтобы не перегружать лист они удаляются. -* `get_reestr_preresolved.sh` - периодический ресолв списка заблокированных доменов. Не помогает от "прыгающих" доменов с регулярно изменяющимися IP и от доменов, которые ресолвятся по-разному в зависимости от geoip. -* `get_reestr_preresolved_smart.sh` - предыдущий список + подсети некоторых проблемных AS + исключение некоторых точно незаблокированных (белых) AS. Проблемными IP считаются популярные CDN с прыгающими IP и хостеры, к которым в России применяются особые более жесткие правила фильтрации. На момент написания проблемные AS : AS32934 (facebook,instagram), AS13414 (twitter) , AS13335 (cloudflare), AS15169 (google), AS16509 (amazon), AS16276 (ovh), AS24940 (hetzner). Белые AS : AS47541 (vk), AS35237 (sberbank), AS47764 (mail.ru), AS13238 (yandex). - +- `get_reestr_resolvable_domains.sh` - список заблокированных доменов, которые ресолвятся. Среди заблокированных доменов больше половины уже мертвы. Чтобы не перегружать лист они удаляются. +- `get_reestr_preresolved.sh` - периодический ресолв списка заблокированных доменов. Не помогает от "прыгающих" доменов с регулярно изменяющимися IP и от доменов, которые ресолвятся по-разному в зависимости от geoip. +- `get_reestr_preresolved_smart.sh` - предыдущий список + подсети некоторых проблемных AS + исключение некоторых точно незаблокированных (белых) AS. Проблемными IP считаются популярные CDN с прыгающими IP и хостеры, к которым в России применяются особые более жесткие правила фильтрации. На момент написания проблемные AS : AS32934 (facebook,instagram), AS13414 (twitter) , AS13335 (cloudflare), AS15169 (google), AS16509 (amazon), AS16276 (ovh), AS24940 (hetzner). Белые AS : AS47541 (vk), AS35237 (sberbank), AS47764 (mail.ru), AS13238 (yandex). ## Стартовые скрипты -Имеются только для Linux и OpenWRT. Вариант для Linux - в `init.d/sysv`, для OpenWRT - в `init.d/openwrt`. Основной исполняемый файл - `zapret2`. Требуемое действие передается в аргументе `$1`. Процедура запуска разделена на запуск демонов - процессов nfqws2, и запуск firewall - выставление правил ip/nf tables. +Имеются только для Linux и OpenWRT. Вариант для Linux - в `init.d/sysv`, для OpenWRT - в `init.d/openwrt`. Основной исполняемый файл - `zapret2`. Требуемое действие передается в аргументе `$1`. Процедура запуска разделена на запуск демонов - процессов nfqws2, и запуск firewall - выставление правил ip/nf tables. | Команда ($1) | Действие | | :----------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -4212,10 +4255,10 @@ sysv вариант предназначен для любых Linux, не яв custom скрипт может иметь следующие shell функции, которые вызываются системой запуска : -* **zapret_custom_daemons** - поднятие и останов демонов. $1 = 1 - поднятие, 0 - останов. -* **zapret_custom_firewall** - поднятие и снятие правил iptables. $1 - поднятие, 0 - снятие. -* **zapret_custom_firewall_nft** - поднятие правил nftables. останов не требуется, поскольку основной код при останове очищает цепочки nft вместе с custom правилами. -* **zapret_custom_firewall_nft_flush** - вызывается при останове nftables, чтобы можно было удалить обьекты, выходящие за рамки стандартных цепочек - такие, как собственные set-ы или собственные цепочки. +- **zapret_custom_daemons** - поднятие и останов демонов. $1 = 1 - поднятие, 0 - останов. +- **zapret_custom_firewall** - поднятие и снятие правил iptables. $1 - поднятие, 0 - снятие. +- **zapret_custom_firewall_nft** - поднятие правил nftables. останов не требуется, поскольку основной код при останове очищает цепочки nft вместе с custom правилами. +- **zapret_custom_firewall_nft_flush** - вызывается при останове nftables, чтобы можно было удалить обьекты, выходящие за рамки стандартных цепочек - такие, как собственные set-ы или собственные цепочки. Если вам не нужны iptables или nftables, функции для соответствующего типа firewall можно не писать. В функциях крайне желательно пользоваться хелперами основного кода - так вы будете следовать идеологии скриптов запуска без необходимости сосредотачиваться на частностях. Можно свободно адресовать переменные [config](#файл-config) и добавлять туда свои. @@ -4285,8 +4328,8 @@ fw_nfqws_pre() Что не следует писать в фильтр : -* Проверку стандарных exclude ipset - nozapret, nozapret6. -* Проверку по [DESYNC_FWMARK](#файл-config). +- Проверку стандарных exclude ipset - nozapret, nozapret6. +- Проверку по [DESYNC_FWMARK](#файл-config). Будут ли применены правила для каждой версии ip зависит от настроек [config](#файл-config). @@ -4335,11 +4378,11 @@ ipt6a_add_del() Все правила начинаются с имени цепочки без команды iptables '-A', '-D', '-I' и т.д. -* ipt - iptables -I - добавление в начало -* ipta - iptables -A - добавление в конец -* ipt_del - iptables -D - удаление -* ipt_add_del - добавление через -I или удаление. в $1 - 1 - добавление, 0 - удаление. Само правило идет начиная с $2. -* ipta_add_del - как в предыдущем варианте, только -A вместо -I +- ipt - iptables -I - добавление в начало +- ipta - iptables -A - добавление в конец +- ipt_del - iptables -D - удаление +- ipt_add_del - добавление через -I или удаление. в $1 - 1 - добавление, 0 - удаление. Само правило идет начиная с $2. +- ipta_add_del - как в предыдущем варианте, только -A вместо -I ``` ipt_first_packets() @@ -4366,8 +4409,8 @@ nft_fw_nfqws_pre() Что не следует писать в фильтр : -* Проверку стандарных exclude ipset - nozapret, nozapret6. -* Проверку по [DESYNC_FWMARK](#файл-config). +- Проверку стандарных exclude ipset - nozapret, nozapret6. +- Проверку по [DESYNC_FWMARK](#файл-config). Будут ли применены правила для каждой версии ip зависит от настроек [config](#файл-config). @@ -4434,15 +4477,14 @@ nft_first_packets() Множество полезных хелперов расположены в `common/base.sh`. Их назначение несложно понять по коду. - ## Инсталлятор Состоит из файлов `install_bin.sh`, `install_prereq.sh`, `install_easy.sh`, `uninstall_easy.sh`. Используются файлы из `common`. -* `install_bin.sh` - средство автоматического поиска и настройки подходящих по архитектуре бинарных файлов из `binaries`. Создает линки в директориях nfq2, mdig, ip2net на файлы внутри одной из субдиректорий из binaries. Заточено на максимально обрезанные прошивки, где много чего нет. Работает почти на всем, но не 100%. Отсутствие или обрезанный вариант какой-нибудь стандартной программы может сломать скрипт - типично для неподдерживаемых прошивок типа padavan, merlin и тому подобных. Если не работает - создайте линки вручную. -* `install_prepreq.sh` - установщик пре-реквизитов - требуемых пакетов для работы zapret. Работает в OpenWRT и на большинстве дистрибутивов Linux, но не на всех, поскольку могут использоваться очень разные системы управления пакетами и иметься индивидуальные особенности, которые все учесть невозможно. Если скрипт не справляется - требуется установить пакеты вручную. -* `install_easy.sh` - основной установщик. Рассчитан на запуск из любого расположения. Работает в диалоговом режиме, задает вопросы. Автоматически настраивает binaries и устанавливает пре-реквизиты (отдельный запуск предыдущих скриптов не требуется). На неподдерживаемых системах Linux не может прописать автозапуск - вам это придется сделать вручную. -* `uninstall_easy.sh` - деинсталлятор. Не может убрать автозапуск на неподдерживаемых системах. Предлагает удалить пре-реквизиты только на OpenWRT, на остальных системах - нет. Не удаляет саму директорию установки - для полного удаления ее надо удалить самостоятельно. +- `install_bin.sh` - средство автоматического поиска и настройки подходящих по архитектуре бинарных файлов из `binaries`. Создает линки в директориях nfq2, mdig, ip2net на файлы внутри одной из субдиректорий из binaries. Заточено на максимально обрезанные прошивки, где много чего нет. Работает почти на всем, но не 100%. Отсутствие или обрезанный вариант какой-нибудь стандартной программы может сломать скрипт - типично для неподдерживаемых прошивок типа padavan, merlin и тому подобных. Если не работает - создайте линки вручную. +- `install_prepreq.sh` - установщик пре-реквизитов - требуемых пакетов для работы zapret. Работает в OpenWRT и на большинстве дистрибутивов Linux, но не на всех, поскольку могут использоваться очень разные системы управления пакетами и иметься индивидуальные особенности, которые все учесть невозможно. Если скрипт не справляется - требуется установить пакеты вручную. +- `install_easy.sh` - основной установщик. Рассчитан на запуск из любого расположения. Работает в диалоговом режиме, задает вопросы. Автоматически настраивает binaries и устанавливает пре-реквизиты (отдельный запуск предыдущих скриптов не требуется). На неподдерживаемых системах Linux не может прописать автозапуск - вам это придется сделать вручную. +- `uninstall_easy.sh` - деинсталлятор. Не может убрать автозапуск на неподдерживаемых системах. Предлагает удалить пре-реквизиты только на OpenWRT, на остальных системах - нет. Не удаляет саму директорию установки - для полного удаления ее надо удалить самостоятельно. Отдельные файлы `install_bin.sh` и `install_prereq.sh` полезны, когда вы не собираетесь запускать установку, но вам нужен рабочий [blockcheck2](#blockcheck2) или есть необходимость запускать [стартовые скрипты](#стартовые-скрипты) самостоятельно. @@ -4457,15 +4499,20 @@ nft_first_packets() ### Принципы интеграции с OpenWRT 1. Автозапуск. + ``` ln -s /opt/zapret2/init.d/openwrt/zapret2 /etc/init.d /etc/init.d/zapret2 enable ``` -2. Обновление правил firewall по событию поднятия/опускания интерфейсов. + +1. Обновление правил firewall по событию поднятия/опускания интерфейсов. + ``` ln -s /opt/zapret2/init.d/openwrt/90-zapret2 /etc/hotplug.d/iface ``` -3. (только для fw3) Интеграция с firewall. + +1. (только для fw3) Интеграция с firewall. + ``` ln -s /opt/zapret2/init.d/openwrt/firewall.zapret2 /etc uci add firewall include @@ -4473,26 +4520,30 @@ uci set firewall.@include[-1].path="/etc/firewall.zapret" uci set firewall.@include[-1].reload=1 uci commit ``` -4. Обновление листов - cron job на вызов `/opt/zapret2/ipset/get_config.sh` ночью в случайное время каждые 2 дня - для обновления листов. Рассчет идет на роутер, работающий круглосуточно. + +1. Обновление листов - cron job на вызов `/opt/zapret2/ipset/get_config.sh` ночью в случайное время каждые 2 дня - для обновления листов. Рассчет идет на роутер, работающий круглосуточно. ### Шпаргалка OpenWRT -* Запуск службы : /etc/init.d/zapret2 start -* Останов службы : /etc/init.d/zapret2 stop -* Рестарт службы : /etc/init.d/zapret2 restart -* Состояние службы : /etc/init.d/zapret2 status -* Отключение автозапуска : /etc/init.d/zapret2 disable -* Включение автозапуска : /etc/init.d/zapret2 enable +- Запуск службы : /etc/init.d/zapret2 start +- Останов службы : /etc/init.d/zapret2 stop +- Рестарт службы : /etc/init.d/zapret2 restart +- Состояние службы : /etc/init.d/zapret2 status +- Отключение автозапуска : /etc/init.d/zapret2 disable +- Включение автозапуска : /etc/init.d/zapret2 enable ### Принципы интеграции с systemd -1. Автозапуск +1. Автозапуск + ``` cp /opt/zapret2/init.d/systemd/zapret2.service /lib/systemd/system systemctl daemon-reload systemctl enable zapret2 ``` -2. Таймер для обновления листов - в случайное время суток каждые 2 дня. Рассчет идет на любую систему, в том числе десктопную, которую могут включать только днем. + +1. Таймер для обновления листов - в случайное время суток каждые 2 дня. Рассчет идет на любую систему, в том числе десктопную, которую могут включать только днем. + ``` cp /opt/zapret2/init.d/systemd/zapret2-list-update.* /lib/systemd/system systemctl daemon-reload @@ -4502,30 +4553,32 @@ systemctl start zapret2-list-update.timer ### Шпаргалка systemd -* Запуск службы : systemctl start zapret2 -* Останов службы : systemctl stop zapret2 -* Рестарт службы : systemctl restart zapret2 -* Состояние службы : systemctl status zapret2 -* Отключение автозапуска : systemctl disable zapret2 -* Включение автозапуска : systemctl enable zapret2 +- Запуск службы : systemctl start zapret2 +- Останов службы : systemctl stop zapret2 +- Рестарт службы : systemctl restart zapret2 +- Состояние службы : systemctl status zapret2 +- Отключение автозапуска : systemctl disable zapret2 +- Включение автозапуска : systemctl enable zapret2 ### Принципы интеграции с openrc 1. Автозапуск + ``` ln -s /opt/zapret2/init.d/openrc/zapret2 /etc/init.d rc-update add zapret2 ``` -2. Обновление листов - cron job на вызов `/opt/zapret2/ipset/get_config.sh` днем в случайное время каждые 2 дня. Рассчет идет на любую систему, в том числе десктопную, которую могут включать только днем. + +1. Обновление листов - cron job на вызов `/opt/zapret2/ipset/get_config.sh` днем в случайное время каждые 2 дня. Рассчет идет на любую систему, в том числе десктопную, которую могут включать только днем. ### Шпаргалка openrc -* Запуск службы : rc-service zapret2 start -* Останов службы : rc-service zapret2 stop -* Рестарт службы : rc-service zapret2 restart -* Состояние службы : rc-service zapret2 status -* Отключение автозапуска : rc-update del zapret2 -* Включение автозапуска : rc-update add zapret2 +- Запуск службы : rc-service zapret2 start +- Останов службы : rc-service zapret2 stop +- Рестарт службы : rc-service zapret2 restart +- Состояние службы : rc-service zapret2 status +- Отключение автозапуска : rc-update del zapret2 +- Включение автозапуска : rc-update add zapret2 ## Альтернативная установка на systemd