From 100fff0461089fb1a8388d69ec305df31fd85902 Mon Sep 17 00:00:00 2001 From: bol-van Date: Wed, 24 Dec 2025 14:26:51 +0300 Subject: [PATCH] update docs --- docs/manual.md | 771 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 510 insertions(+), 261 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index d3e2fa5..9e9acbc 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -1,3 +1,252 @@ +- [Введение](#введение) +- [Структура проекта](#структура-проекта) +- [Схема обработки трафика](#схема-обработки-трафика) +- [Перехват трафика из ядра ОС](#перехват-трафика-из-ядра-ос) + - [Перехват трафика в ядре Linux](#перехват-трафика-в-ядре-linux) + - [Перехват трафика с помощью nftables](#перехват-трафика-с-помощью-nftables) + - [Перехват трафика с помощью iptables](#перехват-трафика-с-помощью-iptables) + - [Перехват трафика в ядре FreeBSD](#перехват-трафика-в-ядре-freebsd) + - [Перехват трафика в ядре OpenBSD](#перехват-трафика-в-ядре-openbsd) + - [Перехват трафика в ядре Windows](#перехват-трафика-в-ядре-windows) +- [nfqws2](#nfqws2) + - [Общие принципы задания параметров](#общие-принципы-задания-параметров) + - [Полный список опций](#полный-список-опций) + - [Использование множественных профилей](#использование-множественных-профилей) + - [Шаблоны профилей](#шаблоны-профилей) + - [Фильтрация по листам](#фильтрация-по-листам) + - [Детектор неудач автохостлистов](#детектор-неудач-автохостлистов) + - [Фильтр по наличию сетей](#фильтр-по-наличию-сетей) + - [Серверный режим](#серверный-режим) + - [Кэш IP](#кэш-ip) + - [Сигналы](#сигналы) + - [Отладка](#отладка) + - [Виртуальные машины](#виртуальные-машины) + - [Песочница](#песочница) + - [Вызов LUA кода](#вызов-lua-кода) + - [Передача блобов](#передача-блобов) + - [Внутрипрофильные фильтры](#внутрипрофильные-фильтры) + - [Типичная схема вызова инстансов внутри профиля](#типичная-схема-вызова-инстансов-внутри-профиля) + - [Прототип LUA функции](#прототип-lua-функции) + - [Структура таблицы desync](#структура-таблицы-desync) + - [Структура диссекта](#структура-диссекта) + - [Особенности приема многопакетных пейлоадов](#особенности-приема-многопакетных-пейлоадов) + - [Структура track](#структура-track) +- [С интерфейс nfqws2](#с-интерфейс-nfqws2) + - [Базовые константы](#базовые-константы) + - [Стандартные блобы](#стандартные-блобы) + - [C функции](#c-функции) + - [Логгинг](#логгинг) + - [Конвертация IP](#конвертация-ip) + - [Битовые операции](#битовые-операции) + - [Операции с беззнаковыми числами](#операции-с-беззнаковыми-числами) + - [uX](#ux) + - [buX](#bux) + - [swapX](#swapx) + - [uXadd](#uxadd) + - [Целочисленное деление](#целочисленное-деление) + - [divint](#divint) + - [Генерация случайных данных](#генерация-случайных-данных) + - [brandom](#brandom) + - [Парсинг](#парсинг) + - [parse\_hex](#parse_hex) + - [Криптография](#криптография) + - [bcryptorandom](#bcryptorandom) + - [hash](#hash) + - [aes](#aes) + - [aes\_gcm](#aes_gcm) + - [aes\_ctr](#aes_ctr) + - [hkdf](#hkdf) + - [Системные функции](#системные-функции) + - [uname](#uname) + - [clock\_gettime](#clock_gettime) + - [getpid](#getpid) + - [Опции по работе с пакетами](#опции-по-работе-с-пакетами) + - [standard reconstruct](#standard-reconstruct) + - [standard rawsend](#standard-rawsend) + - [Диссекция и реконструкция](#диссекция-и-реконструкция) + - [dissect](#dissect) + - [reconstruct\_dissect](#reconstruct_dissect) + - [reconstruct\_hdr](#reconstruct_hdr) + - [csum\_fix](#csum_fix) + - [Прием и отсылка пакетов](#прием-и-отсылка-пакетов) + - [rawsend](#rawsend) + - [raw\_packet](#raw_packet) + - [Работа с пейлоадами](#работа-с-пейлоадами) + - [маркеры](#маркеры) + - [resolve\_pos](#resolve_pos) + - [Управление выполнением инстансов](#управление-выполнением-инстансов) + - [instance\_cutoff](#instance_cutoff) + - [lua\_cutoff](#lua_cutoff) + - [execution\_plan](#execution_plan) + - [execution\_plan\_cancel](#execution_plan_cancel) +- [Библиотека базовых функций zapret-lib.lua](#библиотека-базовых-функций-zapret-liblua) + - [Базовые desync функции](#базовые-desync-функции) + - [luaexec](#luaexec) + - [pass](#pass) + - [pktdebug](#pktdebug) + - [argdebug](#argdebug) + - [posdebug](#posdebug) + - [detect\_payload\_str](#detect_payload_str) + - [desync\_orchestrator\_example](#desync_orchestrator_example) + - [Служебные функции](#служебные-функции) + - [var\_debug](#var_debug) + - [deepcopy](#deepcopy) + - [logical\_xor](#logical_xor) + - [Работа со строками](#работа-со-строками) + - [in\_list](#in_list) + - [find\_next\_line](#find_next_line) + - [Обслуживание raw string](#обслуживание-raw-string) + - [hex](#hex) + - [pattern](#pattern) + - [blob](#blob) + - [Обслуживание tcp sequence numbers](#обслуживание-tcp-sequence-numbers) + - [Обслуживание позиций](#обслуживание-позиций) + - [Диссекция](#диссекция) + - [dissect\_url](#dissect_url) + - [dissect\_nld](#dissect_nld) + - [dissect\_http](#dissect_http) + - [Работа с элементами L3 и L4 протоколов](#работа-с-элементами-l3-и-l4-протоколов) + - [find\_tcp\_options](#find_tcp_options) + - [ip6hdr](#ip6hdr) + - [packet\_len](#packet_len) + - [Работа с именами хостов](#работа-с-именами-хостов) + - [genhost](#genhost) + - [host\_ip](#host_ip) + - [Операции с именами файлов и путями](#операции-с-именами-файлов-и-путями) + - [autottl](#autottl) + - [Операции с диссектами](#операции-с-диссектами) + - [standard ipid](#standard-ipid) + - [standard fooling](#standard-fooling) + - [standard ipfrag](#standard-ipfrag) + - [apply\_ip\_id](#apply_ip_id) + - [apply\_fooling](#apply_fooling) + - [ipfrag2](#ipfrag2) + - [wssize\_rewrite](#wssize_rewrite) + - [dis\_reverse](#dis_reverse) + - [Отсылка](#отсылка) + - [rawsend\_dissect\_ipfrag](#rawsend_dissect_ipfrag) + - [rawsend\_dissect\_segmented](#rawsend_dissect_segmented) + - [rawsend\_payload\_segmented](#rawsend_payload_segmented) + - [Стандартные фильтры direction и payload](#стандартные-фильтры-direction-и-payload) + - [Работа с многопакетными пейлоадам](#работа-с-многопакетными-пейлоадам) + - [Оркестрация](#оркестрация) + - [instance\_cutoff\_shim](#instance_cutoff_shim) + - [cutoff\_shim\_check](#cutoff_shim_check) + - [apply\_arg\_prefix](#apply_arg_prefix) + - [apply\_execution\_plan](#apply_execution_plan) + - [verdict\_aggregate](#verdict_aggregate) + - [plan\_instance\_execute](#plan_instance_execute) + - [plan\_instance\_pop](#plan_instance_pop) + - [plan\_clear](#plan_clear) + - [orchestrate](#orchestrate) + - [replay\_execution\_plan](#replay_execution_plan) +- [Библиотека программ атаки на DPI zapret-antidpi.lua](#библиотека-программ-атаки-на-dpi-zapret-antidpilua) + - [Стандартные наборы параметров](#стандартные-наборы-параметров) + - [standard direction](#standard-direction) + - [standard payload](#standard-payload) + - [Базовые функции](#базовые-функции) + - [drop](#drop) + - [send](#send) + - [pktmod](#pktmod) + - [Дурение http](#дурение-http) + - [http\_hostcase](#http_hostcase) + - [http\_domcase](#http_domcase) + - [http\_methodeol](#http_methodeol) + - [Замена window size](#замена-window-size) + - [wsize](#wsize) + - [wssize](#wssize) + - [Фейки](#фейки) + - [syndata](#syndata) + - [fake](#fake) + - [rst](#rst) + - [TCP сегментация](#tcp-сегментация) + - [multisplit](#multisplit) + - [multidisorder](#multidisorder) + - [multidisorder\_legacy](#multidisorder_legacy) + - [fakedsplit](#fakedsplit) + - [fakeddisorder](#fakeddisorder) + - [hostfakesplit](#hostfakesplit) + - [tcpseg](#tcpseg) + - [Дурение udp](#дурение-udp) + - [udplen](#udplen) + - [dht\_dn](#dht_dn) + - [Другие функции](#другие-функции) + - [synack](#synack) + - [synack\_split](#synack_split) +- [Библиотека программ автоматизации и оркестрации zapret-auto.lua](#библиотека-программ-автоматизации-и-оркестрации-zapret-autolua) + - [Хранилище состояний](#хранилище-состояний) + - [automate\_conn\_record](#automate_conn_record) + - [standard\_hostkey](#standard_hostkey) + - [automate\_host\_record](#automate_host_record) + - [Обслуживание удач и неудач](#обслуживание-удач-и-неудач) + - [automate\_failure\_counter](#automate_failure_counter) + - [automate\_failure\_counter\_reset](#automate_failure_counter_reset) + - [Детекция удач и неудач](#детекция-удач-и-неудач) + - [automate\_failure\_check](#automate_failure_check) + - [standard\_success\_detector](#standard_success_detector) + - [standard\_failure\_detector](#standard_failure_detector) + - [Оркестраторы](#оркестраторы) + - [circular](#circular) + - [repeater](#repeater) + - [condition](#condition) + - [stopif](#stopif) + - [iff функции](#iff-функции) + - [cond\_true](#cond_true) + - [cond\_false](#cond_false) + - [cond\_random](#cond_random) + - [cond\_payload\_str](#cond_payload_str) +- [Вспомогательные программы](#вспомогательные-программы) + - [ip2net](#ip2net) + - [mdig](#mdig) +- [blockcheck2](#blockcheck2) + - [Проверка DNS](#проверка-dns) + - [Основные режимы тестирования](#основные-режимы-тестирования) + - [Множественные попытки](#множественные-попытки) + - [Уровни сканирования](#уровни-сканирования) + - [Поддерживаемые протоколы](#поддерживаемые-протоколы) + - [Проверка блока по IP](#проверка-блока-по-ip) + - [Примеры блокировки только по домену без блока по IP](#примеры-блокировки-только-по-домену-без-блока-по-ip) + - [Пример полного IP блока или блока TCP порта при отсутствии блока по домену](#пример-полного-ip-блока-или-блока-tcp-порта-при-отсутствии-блока-по-домену) + - [Стандартные тесты](#стандартные-тесты) + - [Тест standard](#тест-standard) + - [Тест custom](#тест-custom) + - [Summary](#summary) + - [Shell переменные](#shell-переменные) +- [Скрипты запуска](#скрипты-запуска) + - [Файл config](#файл-config) + - [Система ведения листов](#система-ведения-листов) + - [Стандартные файлы листов](#стандартные-файлы-листов) + - [Скрипты ipset](#скрипты-ipset) + - [clear\_lists.sh](#clear_listssh) + - [create\_ipset.sh](#create_ipsetsh) + - [get\_config.sh](#get_configsh) + - [get\_user.sh](#get_usersh) + - [get\_ipban.sh](#get_ipbansh) + - [get\_exclude.sh](#get_excludesh) + - [get\_antifilter\_\*.sh](#get_antifilter_sh) + - [get\_antizapret\_domains.sh](#get_antizapret_domainssh) + - [get\_refilter\_\*.sh](#get_refilter_sh) + - [get\_reestr\_\*.sh](#get_reestr_sh) + - [Стартовые скрипты](#стартовые-скрипты) + - [Интеграция с firewall](#интеграция-с-firewall) + - [Интеграция с OpenWRT firewall](#интеграция-с-openwrt-firewall) + - [custom скрипты](#custom-скрипты) + - [custom хелперы](#custom-хелперы) + - [Получение динамических номеров](#получение-динамических-номеров) + - [Работа с демонами](#работа-с-демонами) + - [Работа с iptables](#работа-с-iptables) + - [Работа с nftables](#работа-с-nftables) + - [Дополнительные функции](#дополнительные-функции) + - [Инсталлятор](#инсталлятор) + - [Принципы интеграции с OpenWRT](#принципы-интеграции-с-openwrt) + - [Шпаргалка OpenWRT](#шпаргалка-openwrt) + - [Принципы интеграции с systemd](#принципы-интеграции-с-systemd) + - [Шпаргалка systemd](#шпаргалка-systemd) + - [Принципы интеграции с openrc](#принципы-интеграции-с-openrc) + - [Шпаргалка openrc](#шпаргалка-openrc) + - [Альтернативная установка на systemd](#альтернативная-установка-на-systemd) + + # Введение zapret2 является пакетным манипулятором, основная задача которого - совершение различных автономных атак на DPI в реальном времени @@ -1120,34 +1369,34 @@ desync: desync -| Поле | Тип | Содержание | Примечание | -|:------|:-----|:-------------|:-----------| -| func | string | имя desync функции | | -| func_n | number | номер инстанса внутри профиля | | -| func_instance | string | название инстанса | производная имени функции, номера инстанса и номера профиля | -| profile_n | number | номер профиля | | -| profile_name | string | название профиля | может отсутствовать | -| template_n | number | номер шаблона, на базе которого создан профиль | может отсутствовать | -| template_name | string | название шаблона, на базе которого создан профиль | может отсутствовать | -| cookie | string | значение параметра nfqws2 --cookie для профиля | может отсутствовать | -| outgoing | bool | true , если направление исходящее | | -| ifin | string | имя входящего интерфейса | может отсутствовать | -| ifout | string | имя исходящего интерфейса | может отсутствовать | -| fwmark | number | fwmark текущего пакета | только в Linux | -| target | table | таблица, включающая ip адрес и порт, на базе которых проверяются ipset-ы и фильтры по портам | | -| replay | bool | проигрывание задержанного пакета (replay) | | -| replay_piece | number | номер проигрываемой части | нумерация с 1 | -| replay_piece_count | number | количество проигрываемых частей| | -| replay_piece_last | bool | последняя проигрываемая часть | | -| l7payload | string | тип пейлоада текущего пакета или группы пакетов. список возможных в help тексте nfqws2 | если неизвестно - unknown | -| l7proto | string | тип протокола потока | если неизвестно - unknown | -| reasm_data | string | результат сборки многопакетного сообщения, либо сам пейлоад, если сборки не было | пока применяется только для tcp | -| reasm_offset | string | смещение текущего переигрываемого пакета в сборке | пока применяется только для tcp | -| decrypt_data | string | результат сборки и дешифровки пейлоада или пейлоадов нескольких пакетов | применяется для quic | -| tcp_mss | number | MSS противоположного конца tcp соединения | присутствует всегда, только для tcp | -| track | table | данные, привязанные к записи conntrack | только если есть conntrack, может не быть | -| arg | table | все аргументы инстанса и их значения | подстановки % и # уже замещены | -| dis | table | диссект текущего пакета | | +| Поле | Тип | Содержание | Примечание | +| :----------------- | :----- | :------------------------------------------------------------------------------------------- | :---------------------------------------------------------- | +| func | string | имя desync функции | | +| func_n | number | номер инстанса внутри профиля | | +| func_instance | string | название инстанса | производная имени функции, номера инстанса и номера профиля | +| profile_n | number | номер профиля | | +| profile_name | string | название профиля | может отсутствовать | +| template_n | number | номер шаблона, на базе которого создан профиль | может отсутствовать | +| template_name | string | название шаблона, на базе которого создан профиль | может отсутствовать | +| cookie | string | значение параметра nfqws2 --cookie для профиля | может отсутствовать | +| outgoing | bool | true , если направление исходящее | | +| ifin | string | имя входящего интерфейса | может отсутствовать | +| ifout | string | имя исходящего интерфейса | может отсутствовать | +| fwmark | number | fwmark текущего пакета | только в Linux | +| target | table | таблица, включающая ip адрес и порт, на базе которых проверяются ipset-ы и фильтры по портам | | +| replay | bool | проигрывание задержанного пакета (replay) | | +| replay_piece | number | номер проигрываемой части | нумерация с 1 | +| replay_piece_count | number | количество проигрываемых частей | | +| replay_piece_last | bool | последняя проигрываемая часть | | +| l7payload | string | тип пейлоада текущего пакета или группы пакетов. список возможных в help тексте nfqws2 | если неизвестно - unknown | +| l7proto | string | тип протокола потока | если неизвестно - unknown | +| reasm_data | string | результат сборки многопакетного сообщения, либо сам пейлоад, если сборки не было | пока применяется только для tcp | +| reasm_offset | string | смещение текущего переигрываемого пакета в сборке | пока применяется только для tcp | +| decrypt_data | string | результат сборки и дешифровки пейлоада или пейлоадов нескольких пакетов | применяется для quic | +| tcp_mss | number | MSS противоположного конца tcp соединения | присутствует всегда, только для tcp | +| track | table | данные, привязанные к записи conntrack | только если есть conntrack, может не быть | +| arg | table | все аргументы инстанса и их значения | подстановки % и # уже замещены | +| dis | table | диссект текущего пакета | | ### Структура диссекта @@ -1164,80 +1413,80 @@ ipv6 extension headers и tcp options представляются в форме Все числовые многобайтовые значения автоматически переведены из network byte order в machine byte order. **dissect** -| Поле | Тип | Описание | -|:------|:----|:---------| -| ip | table | заголовок ipv4 | -| ip6 | table | заголовок ipv6 | -| tcp | table | заголовок tcp | -| udp | table | заголовок udp | -| l4proto | number | IPPROTO_TCP или IPPROTO_UDP | -| transport_len | number | длина пакета без L3 заголовков | -| l3_len | number | длина L3 заголовков, включая ip options и ipv6 extension headers | -| l4_len | number | длина L4 заголовка, включая tcp options | -| payload | string | L4 пейлоад | +| Поле | Тип | Описание | +| :------------ | :----- | :--------------------------------------------------------------- | +| ip | table | заголовок ipv4 | +| ip6 | table | заголовок ipv6 | +| tcp | table | заголовок tcp | +| udp | table | заголовок udp | +| l4proto | number | IPPROTO_TCP или IPPROTO_UDP | +| transport_len | number | длина пакета без L3 заголовков | +| l3_len | number | длина L3 заголовков, включая ip options и ipv6 extension headers | +| l4_len | number | длина L4 заголовка, включая tcp options | +| payload | string | L4 пейлоад | **ip** -| Поле | Описание | -|:------|:---------| -| ip_v | версия ip - 4 | -| ip_hl | длина ip заголовка в блоках по 4 байта. 5 без ip options. | -| ip_tos | type of service. содержит DSCP | -| ip_len | полная длина ip пакета вместе со всеми заголовками и пейлоадом | -| ip_id | идентификация пакета для сборки из фрагментов | -| ip_off | offset фрагмента, флаги MF (more fragments) и DF (dont fragment) | -| ip_ttl | time to live - максимальное количество хопов | -| ip_p | [номер ip протокола](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). как правило IPPROTO_TCP или IPPROTO_UDP | -| ip_sum | чексумма ip хедера | -| ip_src | ip источника | -| ip_src | ip назначения | -| options | бинарный блок ip options (практически не используется, режется всеми) | +| Поле | Описание | +| :------ | :-------------------------------------------------------------------------------------------------------------------------------------- | +| ip_v | версия ip - 4 | +| ip_hl | длина ip заголовка в блоках по 4 байта. 5 без ip options. | +| ip_tos | type of service. содержит DSCP | +| ip_len | полная длина ip пакета вместе со всеми заголовками и пейлоадом | +| ip_id | идентификация пакета для сборки из фрагментов | +| ip_off | offset фрагмента, флаги MF (more fragments) и DF (dont fragment) | +| ip_ttl | time to live - максимальное количество хопов | +| ip_p | [номер ip протокола](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). как правило IPPROTO_TCP или IPPROTO_UDP | +| ip_sum | чексумма ip хедера | +| ip_src | ip источника | +| ip_src | ip назначения | +| options | бинарный блок ip options (практически не используется, режется всеми) | **ip6** -| Поле | Описание | -|:------|:---------| -| ip6_flow | первые 4 байта ipv6 header : version (6), traffic class, flow label | -| ip6_plen | длина пакета за вычетом базового хедера ipv6 - IP6_BASE_LEN (40) байт | -| ip6_nxt | [следующий протокол](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). если нет exthdr - IPPROTO_TCP (6) или IPPROTO_UDP (17) | -| ip6_hlim | hop limit. имеет тот же смысл, что и TTL в ipv4 | -| ip6_src | ipv6 адрес источника | -| ip6_dst | ipv6 адрес приемника | -| exthdr | массив таблиц расширенных хедеров (индекс от 1) | +| Поле | Описание | +| :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- | +| ip6_flow | первые 4 байта ipv6 header : version (6), traffic class, flow label | +| ip6_plen | длина пакета за вычетом базового хедера ipv6 - IP6_BASE_LEN (40) байт | +| ip6_nxt | [следующий протокол](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). если нет exthdr - IPPROTO_TCP (6) или IPPROTO_UDP (17) | +| ip6_hlim | hop limit. имеет тот же смысл, что и TTL в ipv4 | +| ip6_src | ipv6 адрес источника | +| ip6_dst | ipv6 адрес приемника | +| 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 | -| next | тип следующего хедера. аналогично type. для последнего хедера может быть IPPROTO_TCP или IPPROTO_UDP | -| data | данные без первых двух байтов - типа и длины | +| next | тип следующего хедера. аналогично type. для последнего хедера может быть IPPROTO_TCP или IPPROTO_UDP | +| data | данные без первых двух байтов - типа и длины | **udp** -| Поле | Описание | -|:------|:---------| -| uh_sport | порт источника | -| uh_dport | порт приемника | -| uh_ulen | длина udp - header UDP_BASE_LEN (8) + длина пейлоада | -| uh_sum | чексумма udp | +| Поле | Описание | +| :------- | :--------------------------------------------------- | +| uh_sport | порт источника | +| uh_dport | порт приемника | +| uh_ulen | длина udp - header UDP_BASE_LEN (8) + длина пейлоада | +| uh_sum | чексумма udp | **tcp** -| Поле | Описание | -|:------|:---------| -| th_sport | порт источника | -| th_dport | порт приемника | -| th_x2 | зарезервированное поле. используется для расширенных tcp flags | -| th_off | размер tcp хедера в блоках по 4 байта | -| th_flags | tcp флаги : TH_FIN,TH_SYN,TH_RST,TH_PUSH,TH_ACK,TH_FIN,TH_URG,TH_ECE,TH_CWR | -| th_seq | sequence number | -| th_ack | acknowledgement number | -| th_win | размер tcp окна | -| th_sum | чексумма tcp | -| th_urp | urgent pointer | -| options | массив таблиц [tcp опций](https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml) (индекс от 1) | +| Поле | Описание | +| :------- | :------------------------------------------------------------------------------------------------------------ | +| th_sport | порт источника | +| th_dport | порт приемника | +| th_x2 | зарезервированное поле. используется для расширенных tcp flags | +| th_off | размер tcp хедера в блоках по 4 байта | +| th_flags | tcp флаги : TH_FIN,TH_SYN,TH_RST,TH_PUSH,TH_ACK,TH_FIN,TH_URG,TH_ECE,TH_CWR | +| th_seq | sequence number | +| th_ack | acknowledgement number | +| th_win | размер tcp окна | +| th_sum | чексумма tcp | +| th_urp | urgent pointer | +| 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 | -| data | блок данных опции без kind и length. отсутствует для TCP_KIND_END и TCP_KIND_NOOP | +| data | блок данных опции без kind и length. отсутствует для TCP_KIND_END и TCP_KIND_NOOP | ### Особенности приема многопакетных пейлоадов @@ -1265,17 +1514,17 @@ ipv6 extension headers и tcp options представляются в форме То же самое верно для опциональных полей track. Проверяйте ваш код с `--ctrack-disable` и на разных протоколах - tcp, udp. **track** -| Поле | Тип | Описание | Примечание | -|:------|:-----|:---------|:-----------| -| incoming_ttl | number | ttl/hl первого входящего пакета по потоку | может не быть, если не определено | -| l7proto | string | протокол потока. список возможных доступен в help тексте nfqws2 | есть всегда. если неизвестно - unknown | -| hostname | string | имя хоста. определяется на основе анализа L6/L7 протоколов | появляется только после определения | -| hostname_is_ip | bool | является ли hostname ip адресом | только если есть hostname | -| lua_state | table | таблица для хранения состояния, привязанного к потоку | есть всегда, передается с каждым пакетом потока | -| lua_in_cutoff | bool | отсечение LUA от входящего направления | только для чтения | -| lua_out_cutoff | bool | отсечение LUA от исходящего направления | только для чтения | -| t_start | number | unix time первого пакета потока | включает дробную часть с высокой точностью | -| pos | table | счетчики по различным направлениям | содержит таблицы client, server, direct, reverse | +| Поле | Тип | Описание | Примечание | +| :------------- | :----- | :-------------------------------------------------------------- | :----------------------------------------------- | +| incoming_ttl | number | ttl/hl первого входящего пакета по потоку | может не быть, если не определено | +| l7proto | string | протокол потока. список возможных доступен в help тексте nfqws2 | есть всегда. если неизвестно - unknown | +| hostname | string | имя хоста. определяется на основе анализа L6/L7 протоколов | появляется только после определения | +| hostname_is_ip | bool | является ли hostname ip адресом | только если есть hostname | +| lua_state | table | таблица для хранения состояния, привязанного к потоку | есть всегда, передается с каждым пакетом потока | +| lua_in_cutoff | bool | отсечение LUA от входящего направления | только для чтения | +| lua_out_cutoff | bool | отсечение LUA от исходящего направления | только для чтения | +| t_start | number | unix time первого пакета потока | включает дробную часть с высокой точностью | +| pos | table | счетчики по различным направлениям | содержит таблицы client, server, direct, reverse | Таблица track.pos содержит подтаблицы с набором счетчиков по двум направлениям - client и server. client означает пакеты от клиента, server - пакеты от сервера. @@ -1288,23 +1537,23 @@ track.pos содержит еще одно поле - `dt`. Время полу Список полей таблицы счетчиков приведен ниже. Подтаблица tcp присутствует только для tcp протокола. -| Поле | Описание | Примечание | -|:------|:---------|:-----------| -| pcounter | счетчик пакетов | | -| pdcounter | счетчик пакетов с данными | пакеты, у которых размер L4 пейлоада не равен 0 | -| pbcounter | счетчик переданных байт | считаются только размеры пейлоада L4, заголовки - нет | -| ip6_flow | последнее поле ip6.ip6_flow | отсутствует, если неизвестно или ip протокол - не ipv6 | -| tcp.seq0 | начальный sequence соединения | | -| tcp.seq | sequence текущего пакета | | -| tcp.rseq | relative sequence текущего пакета | вычисляется как seq-seq0 | -| tcp.rseq_over_2G | был переход rseq за границу 2 GB | s и p позиции больше нельзя учитывать | -| tcp.pos | relative sequence верхней границы текущего пакета | вычисляется как rseq+payload_size | -| tcp.uppos | максимальный pos в соединении | | -| tcp.uppos_prev | uppos в предыдущем пакете с данными | полезно для определения ретрансмиссий | -| tcp.winsize | последнее поле th_win | без коррекции по scale | -| tcp.scale | последнее значение tcp опции scale | | -| tcp.winsize_calc | коррекция winsize с учетом scale | эффективное значение tcp window size | -| tcp.mss | последнее значение tcp опции mss | | +| Поле | Описание | Примечание | +| :--------------- | :------------------------------------------------ | :----------------------------------------------------- | +| pcounter | счетчик пакетов | | +| pdcounter | счетчик пакетов с данными | пакеты, у которых размер L4 пейлоада не равен 0 | +| pbcounter | счетчик переданных байт | считаются только размеры пейлоада L4, заголовки - нет | +| ip6_flow | последнее поле ip6.ip6_flow | отсутствует, если неизвестно или ip протокол - не ipv6 | +| tcp.seq0 | начальный sequence соединения | | +| tcp.seq | sequence текущего пакета | | +| tcp.rseq | relative sequence текущего пакета | вычисляется как seq-seq0 | +| tcp.rseq_over_2G | был переход rseq за границу 2 GB | s и p позиции больше нельзя учитывать | +| tcp.pos | relative sequence верхней границы текущего пакета | вычисляется как rseq+payload_size | +| tcp.uppos | максимальный pos в соединении | | +| tcp.uppos_prev | uppos в предыдущем пакете с данными | полезно для определения ретрансмиссий | +| tcp.winsize | последнее поле th_win | без коррекции по scale | +| tcp.scale | последнее значение tcp опции scale | | +| tcp.winsize_calc | коррекция winsize с учетом scale | эффективное значение tcp window size | +| tcp.mss | последнее значение tcp опции mss | | mss, winsize, scale передаются от одной стороны соединения другой стороне, чтобы она знала о допустимых параметрах партнера. При использовани этих полей важно не перепутать сторону. @@ -1328,42 +1577,42 @@ mss дублируется в поле `desync.tcp_mss` независимо о ## Базовые константы -| Поле | Тип | Описание | Примечание | -|:------|:-----|:---------|:-----------| -| qnum | number | номер очереди NFQUEUE | только в Linux | -| divert_port | number | номер порта divert | только в BSD | -| desync_fwmark | number | fwmark для Linux, sockarg для BSD, 0 в Windows | | -| NFQWS2_VER | string | версия nfqws2 | строка, выводимая по --version | -| NFQWS2_COMPAT_VER | number | порядковый номер несовместимых изменений интерфейса с nfqws2 | увеличивается на 1 после каждого изменения | -| b_debug | bool | включен --debug | вывод отладочных сообщений | -| b_daemon | bool | включен --daemon | демонизация процесса, отвязка от tty | -| b_server | bool | включен --server | серверный режим | -| b_ipcache_hostname | bool | включен --ipcache-hostname | кэширование имен хостов, соответствующих IP адресам | -| b_ctrack_disable | bool | включен --ctrack-disable | отключен conntrack | -| VERDICT_PASS
VERDICT_MODIFY
VERDICT_DROP | number | код вердикта desync функции | | -| DEFAULT_MSS | number | значение MSS по умолчанию | 1220 | -| IP_BASE_LEN | number | базовый размер ipv4 хедера | 20 | -| IP6_BASE_LEN | number | базовый размер ipv6 хедера | 40 | -| 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_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 | -| IP_OFFMASK | number | битовая маска поля ip_off, соответствующая fragment offset | 0x1FFF | -| IP_FLAGMASK | number | битовая маска поля ip_off, соответствующая IP флагам | 0xE000 | -| IPTOS_ECN_MASK | number | битовая маска поля ip_tos, соответствующая ECN | 0x03 | -| IPTOS_ECN_NOT_ECT | number | Not ECN-Capable Transport | 0x00 | -| IPTOS_ECN_ECT1 | number | ECN Capable Transport(1) | 0x01 | -| IPTOS_ECN_ECT1 | number | ECN Capable Transport(0) | 0x02 | -| IPTOS_ECN_CE1 | number | Congestion Experienced | 0x03 | -| IPTOS_DSCP_MASK | number | битовая маска поля ip_tos, соответствующая DSCP | 0xFC | -| IP6F_MORE_FRAG | number | бит "More fragment" поля ip6f_offlg из ipv6 fragment header | 0x0001 | -| IP6 | number | бит "More fragment" поля ip6f_offlg из ipv6 fragment header | 0x0001 | -| IPV6_FLOWLABEL_MASK | number | flow label в ip6_flow | 0x000FFFFF | -| 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 | +| Поле | Тип | Описание | Примечание | +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----- | :----------------------------------------------------------------------------------------------- | :-------------------------------------------------- | +| qnum | number | номер очереди NFQUEUE | только в Linux | +| divert_port | number | номер порта divert | только в BSD | +| desync_fwmark | number | fwmark для Linux, sockarg для BSD, 0 в Windows | | +| NFQWS2_VER | string | версия nfqws2 | строка, выводимая по --version | +| NFQWS2_COMPAT_VER | number | порядковый номер несовместимых изменений интерфейса с nfqws2 | увеличивается на 1 после каждого изменения | +| b_debug | bool | включен --debug | вывод отладочных сообщений | +| b_daemon | bool | включен --daemon | демонизация процесса, отвязка от tty | +| b_server | bool | включен --server | серверный режим | +| b_ipcache_hostname | bool | включен --ipcache-hostname | кэширование имен хостов, соответствующих IP адресам | +| b_ctrack_disable | bool | включен --ctrack-disable | отключен conntrack | +| VERDICT_PASS
VERDICT_MODIFY
VERDICT_DROP | number | код вердикта desync функции | | +| DEFAULT_MSS | number | значение MSS по умолчанию | 1220 | +| IP_BASE_LEN | number | базовый размер ipv4 хедера | 20 | +| IP6_BASE_LEN | number | базовый размер ipv6 хедера | 40 | +| 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_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 | +| IP_OFFMASK | number | битовая маска поля ip_off, соответствующая fragment offset | 0x1FFF | +| IP_FLAGMASK | number | битовая маска поля ip_off, соответствующая IP флагам | 0xE000 | +| IPTOS_ECN_MASK | number | битовая маска поля ip_tos, соответствующая ECN | 0x03 | +| IPTOS_ECN_NOT_ECT | number | Not ECN-Capable Transport | 0x00 | +| IPTOS_ECN_ECT1 | number | ECN Capable Transport(1) | 0x01 | +| IPTOS_ECN_ECT1 | number | ECN Capable Transport(0) | 0x02 | +| IPTOS_ECN_CE1 | number | Congestion Experienced | 0x03 | +| IPTOS_DSCP_MASK | number | битовая маска поля ip_tos, соответствующая DSCP | 0xFC | +| IP6F_MORE_FRAG | number | бит "More fragment" поля ip6f_offlg из ipv6 fragment header | 0x0001 | +| IP6 | number | бит "More fragment" поля ip6f_offlg из ipv6 fragment header | 0x0001 | +| IPV6_FLOWLABEL_MASK | number | flow label в ip6_flow | 0x000FFFFF | +| 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 | ### Стандартные блобы @@ -1648,11 +1897,11 @@ function gettid() #### standard reconstruct Опции реконструкции диссектов - reconstruct_opts. Реконструкция - это сборка raw пакета из диссекта. -| Поле | Тип | Описание | -|:------|:----|:---------| -| badsum | bool | испортить L4 checksum. посчитать чексумму и сделать xor со случайным значением от 1 до 0xFFFF | -| ip6_preserve_next | bool | использовать значения "next" из ip6.exthdr | -| ip6_last_proto | number | если ip6_preserve_next=true, IP протокол последнего exthdr | +| Поле | Тип | Описание | +| :---------------- | :----- | :-------------------------------------------------------------------------------------------- | +| badsum | bool | испортить L4 checksum. посчитать чексумму и сделать xor со случайным значением от 1 до 0xFFFF | +| ip6_preserve_next | bool | использовать значения "next" из ip6.exthdr | +| ip6_last_proto | number | если ip6_preserve_next=true, IP протокол последнего exthdr | При сборке ipv6 по умолчанию цепочка ip протоколов в exthdr собирается автоматически. У каждого exthdr есть поле type, поэтому понятно что вписывать в предыдущий exthdr, @@ -1673,11 +1922,11 @@ badsum вынесен в реконструкцию, поскольку чекс #### standard rawsend Опции отсылки raw пакетов - rawsend_opts -| Поле | Тип | Описание | -|:------|:----|:---------| -| repeats | number | количество повторов отсылки одного и того же пакета | -| fwmark | number | fwmark исходящего пакета. только для linux. по умолчанию 0. бит desync_mark устанавливается принудительно | -| ifout | string | исходящий интерфейс. может использоваться или не использоваться в разных ситуациях | +| Поле | Тип | Описание | +| :------ | :----- | :-------------------------------------------------------------------------------------------------------- | +| repeats | number | количество повторов отсылки одного и того же пакета | +| fwmark | number | fwmark исходящего пакета. только для linux. по умолчанию 0. бит desync_mark устанавливается принудительно | +| ifout | string | исходящий интерфейс. может использоваться или не использоваться в разных ситуациях | ifout всегда следует передавать таким, каким он пришел в диссекте. Для windows правильный ifout обязателен. На BSD он не используется. @@ -1858,26 +2107,26 @@ function execution_plan(ctx) их внутрипрофильных фильтрах и аргументах. **Элемент plan** -| Поле | Тип | Описание | -|:------|:----|:---------| -| func | string | имя desync функции | -| func_n | number | номер инстанса внутри профиля | -| func_instance | string | название инстанса | производная имени функции, номера инстанса и номера профиля | -| range | table | эффективный диапазон [счетчиков](#внутрипрофильные-фильтры) `--in-range` или `--out-range` в зависимости от текущего направления | -| payload_filter | string | эффективный `--payload-filter` . список названий пейлоадов через запятую | +| Поле | Тип | Описание | +| :------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------- | +| func | string | имя desync функции | +| func_n | number | номер инстанса внутри профиля | +| func_instance | string | название инстанса | производная имени функции, номера инстанса и номера профиля | +| range | table | эффективный диапазон [счетчиков](#внутрипрофильные-фильтры) `--in-range` или `--out-range` в зависимости от текущего направления | +| payload_filter | string | эффективный `--payload-filter` . список названий пейлоадов через запятую | **range** -| Поле | Тип | Описание | -|:------|:------|:---------| -| from | table | позиция нижней границы | -| to | table | позиция верхней границы | -| upper_cutoff | bool | true = верхняя граница невключительна, false = включительна | +| Поле | Тип | Описание | +| :----------- | :---- | :---------------------------------------------------------- | +| from | table | позиция нижней границы | +| to | table | позиция верхней границы | +| upper_cutoff | bool | true = верхняя граница невключительна, false = включительна | **pos - from,to** -| Поле | Тип | Описание | -|:------|:-------|:---------| -| mode | string | режим счетчика - a, x, n, d, b, s, p | -| pos | number | значение счетчика | +| Поле | Тип | Описание | +| :--- | :----- | :----------------------------------- | +| mode | string | режим счетчика - a, x, n, d, b, s, p | +| pos | number | значение счетчика | #### execution_plan_cancel @@ -2351,10 +2600,10 @@ delta - это положительная или отрицательная ра ### standard ipid **ipid_options** -| Поле | Описание | -|:------|:---------| -| ip_id | режим назначения ip_id : seq, rnd, zero, none
seq - последовательное
rnd - случайное
zero - ноль
none - не менять | -| ip_id_conn | запоминать последнее сгенерированное значение seq и начинать с него в следующем пакете. не работает без desync.track | +| Поле | Описание | +| :--------- | :---------------------------------------------------------------------------------------------------------------------------- | +| ip_id | режим назначения ip_id : seq, rnd, zero, none
seq - последовательное
rnd - случайное
zero - ноль
none - не менять | +| ip_id_conn | запоминать последнее сгенерированное значение seq и начинать с него в следующем пакете. не работает без desync.track | Из seq далеко не всегда получится ожидаемая и преемлемая последовательность. ip_id применяется только в ряде функций, оно не применяется ко всем проходящим пакетам автоматически. @@ -2366,26 +2615,26 @@ Windows заменяет нулевые ip_id на собственную пос ### standard fooling **fooling_options** -| Поле | Описание | -|:------|:---------| -| ip_ttl | изменить TTL в ipv4 заголовке на указанный | -| ip6_ttl | изменить TTL (HL) в ipv6 заголовке на указанный | -| ip_autottl | изменить TTL в ipv4 заголовке на автоматически определяемый по шаблону autottl `delta,min-max`. При невозможности определения TTL берется ip_ttl, если есть. Иначе TTL не меняется. | -| ip6_autottl | изменить HL в ipv6 заголовке на автоматически определяемый по шаблону autottl `delta,min-max`. При невозможности определения HL берется ip6_ttl, если есть. Иначе HL не меняется. | -| ip6_hopbyhop | вставить extension header "hop-by-hop options". по умолчанию данные - 6 нулей, но можно задать hex строку с данными. длина должна быть 6+N*8 | -| ip6_hopbyhop2 | вставить второй extension header "hop-by-hop options" | -| ip6_destopt | вставить extension header "destination options". по умолчанию данные - 6 нулей, но можно задать hex строку с данными. длина должна быть 6+N*8 | -| ip6_destopt2 | вставить второй extension header "destination options" | -| ip6_routing | вставить extension header "routing options". по умолчанию данные - 6 нулей, но можно задать hex строку с данными. длина должна быть 6+N*8 | -| ip6_ah | вставить extension header "authentication header". по умолчанию данные - 2 нуля и 4 случайных байта, но можно задать hex строку с данными. длина должна быть 6+N*4 | -| tcp_seq | положительное или отрицательное смещение sequence | -| tcp_ack | положительное или отрицательное смещение ack sequence | -| tcp_ts | положительное или отрицательное смещение timestamp. работает только если уже есть timestamp option | -| tcp_md5 | добавить MD5 header, если его еще нет. по умолчанию - случайные байты, но можно задать hex string длиной 16 байт | -| tcp_flags_set | установить флаги TCP. флаги представлены списком через зяпятую : FIN,SYN,RST,PUSH,ACK,FIN,URG,ECE,CWR | -| tcp_flags_unset | снять флаги TCP. аналогично tcp_flags_set | -| tcp_ts_up | поднять tcp timestamp опцию в самое начало, если она есть | -| fool | имя кастомной функции фулинга. она берет диссект и таблицу fooling_options | +| Поле | Описание | +| :-------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ip_ttl | изменить TTL в ipv4 заголовке на указанный | +| ip6_ttl | изменить TTL (HL) в ipv6 заголовке на указанный | +| ip_autottl | изменить TTL в ipv4 заголовке на автоматически определяемый по шаблону autottl `delta,min-max`. При невозможности определения TTL берется ip_ttl, если есть. Иначе TTL не меняется. | +| ip6_autottl | изменить HL в ipv6 заголовке на автоматически определяемый по шаблону autottl `delta,min-max`. При невозможности определения HL берется ip6_ttl, если есть. Иначе HL не меняется. | +| ip6_hopbyhop | вставить extension header "hop-by-hop options". по умолчанию данные - 6 нулей, но можно задать hex строку с данными. длина должна быть 6+N*8 | +| ip6_hopbyhop2 | вставить второй extension header "hop-by-hop options" | +| ip6_destopt | вставить extension header "destination options". по умолчанию данные - 6 нулей, но можно задать hex строку с данными. длина должна быть 6+N*8 | +| ip6_destopt2 | вставить второй extension header "destination options" | +| ip6_routing | вставить extension header "routing options". по умолчанию данные - 6 нулей, но можно задать hex строку с данными. длина должна быть 6+N*8 | +| ip6_ah | вставить extension header "authentication header". по умолчанию данные - 2 нуля и 4 случайных байта, но можно задать hex строку с данными. длина должна быть 6+N*4 | +| tcp_seq | положительное или отрицательное смещение sequence | +| tcp_ack | положительное или отрицательное смещение ack sequence | +| tcp_ts | положительное или отрицательное смещение timestamp. работает только если уже есть timestamp option | +| tcp_md5 | добавить MD5 header, если его еще нет. по умолчанию - случайные байты, но можно задать hex string длиной 16 байт | +| tcp_flags_set | установить флаги TCP. флаги представлены списком через зяпятую : FIN,SYN,RST,PUSH,ACK,FIN,URG,ECE,CWR | +| tcp_flags_unset | снять флаги TCP. аналогично tcp_flags_set | +| tcp_ts_up | поднять tcp timestamp опцию в самое начало, если она есть | +| fool | имя кастомной функции фулинга. она берет диссект и таблицу fooling_options | ipv6 extension headers добавляются в следующем порядке: @@ -2408,13 +2657,13 @@ tcp_ts_up дублирует старое поведение - двигает ti для которых существуют свои специфические опции. **ipfrag_options** -| Поле | Описание | -|:------|:---------| -| ipfrag | имя функции фрагментатора. если нет, использовать ipfrag2. фрагментатор возвращает массив диссектов - фрагментов | -| ipfrag_disorder | отправить фрагменты в обратном порядке | -| ipfrag_pos_udp | (фрагментатор ipfrag2) позиция фрагментации udp. должна быть кратна 8, по умолчанию 8 | -| ipfrag_pos_tcp | (фрагментатор ipfrag2) позиция фрагментации tcp. должна быть кратна 8, по умолчанию 32 | -| ipfrag_next | (фрагментатор ipfrag2) тип следующего протокола в "fragment" extension header второго фрагмента | +| Поле | Описание | +| :-------------- | :--------------------------------------------------------------------------------------------------------------- | +| ipfrag | имя функции фрагментатора. если нет, использовать ipfrag2. фрагментатор возвращает массив диссектов - фрагментов | +| ipfrag_disorder | отправить фрагменты в обратном порядке | +| ipfrag_pos_udp | (фрагментатор ipfrag2) позиция фрагментации udp. должна быть кратна 8, по умолчанию 8 | +| ipfrag_pos_tcp | (фрагментатор ipfrag2) позиция фрагментации tcp. должна быть кратна 8, по умолчанию 32 | +| ipfrag_next | (фрагментатор ipfrag2) тип следующего протокола в "fragment" extension header второго фрагмента | ### apply_ip_id @@ -2677,18 +2926,18 @@ nfqws2 ничего не знает о том, что нужно `--lua-desync` Фильтр по направлению. В большинстве функций, использующих фильтр по направлению, значение по умолчанию - "out", но есть и те, где по умолчанию "any". Фильтр по направлению можно реализовать и средствами C кода [`--in-range` и `--out-range`](#внутрипрофильные-фильтры). **standard direction** -| Поле | Описание | -|:------|:---------| -| dir | in - входящее направление
out - исходящее направление
any - любое направление | +| Поле | Описание | +| :--- | :----------------------------------------------------------------------------------- | +| dir | in - входящее направление
out - исходящее направление
any - любое направление | ### standard payload Фильтр по пейлоаду берет список типов пейлоада. Список известных типов пейлоада можно получить из help текста nfqws2. Все пустые пакеты имеют пейлоад empty, неизвестные - unknown. Особые значения - all и known. all означает любой пейлоад, known - не unknown и не empty. **standard payload** -| Поле | Описание | -|:------|:---------| -| payload | список допустимых пейлоадов через запятую. ~ в начале означает инверсию | +| Поле | Описание | +| :------ | :---------------------------------------------------------------------- | +| payload | список допустимых пейлоадов через запятую. ~ в начале означает инверсию | ## Базовые функции @@ -3789,37 +4038,37 @@ nfqws2 может работать и самостоятельно без скр Сам nfqws2 ничего не знает о скриптах запуска и файле config, не принимает ссылку на него в командной строке. -| Параметр | Назначение | -|:---------|:-----------| -| TMPDIR | временная директория вместо /tmp . полезно, если на устройстве мало памяти и tmpfs в /tmp не хватает | -| WS_USER | пользователь, под которым запускается nfqws2. по умолчанию используется автоматическое значение в зависимости от ОС | -| FWTYPE | тип фаервола - iptables, nftables, ipfw. по умолчанию определяется автоматически | -| SET_MAXELEM | максимальное количество записей в создаваемых ipset-ах | -| IPSET_OPT | опции ipset от iptables | -| IPSET_HOOK | скрипт, который получает имя ipset в $1, выдает в stdout список ip, и они добавляются в ipset | -| IP2NET_OPT4
IP2NET_OPT6 | настройки ip2net для скриптов получения ip листов | -| MDIG_THREADS | количество потоков mdig. используется при ресолвинге хостлистов | -| AUTOHOSTLIST_INCOMING_MAXSEQ
AUTOHOSTLIST_RETRANS_MAXSEQ
AUTOHOSTLIST_RETRANS_THRESHOLD
AUTOHOSTLIST_RETRANS_RESET
AUTOHOSTLIST_FAIL_THRESHOLD
AUTOHOSTLIST_FAIL_TIME
AUTOHOSTLIST_UDP_IN
AUTOHOSTLIST_UDP_OUT | параметры [автохостлистов](#детектор-неудач-автохостлистов) | -| AUTOHOSTLIST_DEBUGLOG | включение autohostlist debug log. лог пишется в `ipset/zapret-hosts-auto-debug.log` | -| GZIP_LISTS | применять ли сжатие gzip для генерируемых хост и ip листов | -| DESYNC_MARK | марк-бит для предотвращения зацикливания | -| DESYNC_MARK_POSTNAT | марк-бит для пометки потоков, идущих по схеме POSTNAT | -| FILTER_MARK | если задан, перехватывает пакеты только с этим битом mark. Полезно для организации особых фильтров, например, по ip источника локальной сети. | -| POSTNAT | использовать режим перехвата после NAT на nftables. По умолчанию - 1. На iptables перехват всегда до NAT. | -| NFQWS2_ENABLE | включение стандартного режима nfqws2 | -| NFQWS2_PORTS_TCP
NFQWS2_PORTS_UDP | порты перехвата для стандартного режима nfqws2 | -| NFQWS2_TCP_PKT_OUT
NFQWS2_TCP_PKT_IN
NFQWS2_UDP_PKT_OUT
NFQWS2_UDP_PKT_IN | ограничители connbytes по tcp/udp и направлению для стандартного режима nfqws2 | -| NFQWS2_PORTS_TCP_KEEPALIVE
NFQWS2_PORTS_UDP_KEEPALIVE | список портов tcp/udp, для которых выключается ограничитель connbytes по исходящему направлению для стандартного режима nfqws2 | -| NFQWS2_OPT | параметры командной строки стандартного режима nfqws2 | -| MODE_FILTER | режим фильтрации : none,ipset,hostlist,autohostlist | -| FLOWOFFLOAD | режим offload : donttouch,none,software,hardware | -| OPENWRT_LAN
OPENWRT_WAN4
OPENWRT_WAN6 | список через пробел lan и wan интерфейсов для ipv4 и ipv6 в OpenWRT. НЕ ИНТЕРФЕЙСЫ Linux, ИНТЕРФЕЙСЫ netifd ! по умолчанию "lan" и "wan" | -| IFACE_LAN
IFACE_WAN
IFACE_WAN6 | список через проблем lan и wan интерфейсов для ipv4 и ipv6 в классическом Linux. ИНТЕРФЕЙСЫ Linux ! | -| INIT_APPLY_FW | должны ли применять [стартовые скрипты](#стартовые-скрипты) правила firewall | -| INIT_FW_PRE_UP_HOOK
INIT_FW_POST_UP_HOOK
INIT_FW_PRE_DOWN_HOOK
INIT_FW_POST_DOWN_HOOK | хук-скрипты, вызываемые до, после поднятия и до, после опускания firewall | -| DISABLE_IPV4
DISABLE_IPV6
| отключить версии ip протокола | -| FILTER_TTL_EXPIRED_ICMP | фильтровать "time exceeded" в ответ на пакеты, принадлежащие потокам, прошедшим через zapret | -| GETLIST | [скрипт внутри ipset](#система-ведения-листов), вызываемый из `ipset/get_config.sh` . если не указано - `ipset/get_ipban.sh` | +| Параметр | Назначение | +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------- | +| TMPDIR | временная директория вместо /tmp . полезно, если на устройстве мало памяти и tmpfs в /tmp не хватает | +| WS_USER | пользователь, под которым запускается nfqws2. по умолчанию используется автоматическое значение в зависимости от ОС | +| FWTYPE | тип фаервола - iptables, nftables, ipfw. по умолчанию определяется автоматически | +| SET_MAXELEM | максимальное количество записей в создаваемых ipset-ах | +| IPSET_OPT | опции ipset от iptables | +| IPSET_HOOK | скрипт, который получает имя ipset в $1, выдает в stdout список ip, и они добавляются в ipset | +| IP2NET_OPT4
IP2NET_OPT6 | настройки ip2net для скриптов получения ip листов | +| MDIG_THREADS | количество потоков mdig. используется при ресолвинге хостлистов | +| AUTOHOSTLIST_INCOMING_MAXSEQ
AUTOHOSTLIST_RETRANS_MAXSEQ
AUTOHOSTLIST_RETRANS_THRESHOLD
AUTOHOSTLIST_RETRANS_RESET
AUTOHOSTLIST_FAIL_THRESHOLD
AUTOHOSTLIST_FAIL_TIME
AUTOHOSTLIST_UDP_IN
AUTOHOSTLIST_UDP_OUT | параметры [автохостлистов](#детектор-неудач-автохостлистов) | +| AUTOHOSTLIST_DEBUGLOG | включение autohostlist debug log. лог пишется в `ipset/zapret-hosts-auto-debug.log` | +| GZIP_LISTS | применять ли сжатие gzip для генерируемых хост и ip листов | +| DESYNC_MARK | марк-бит для предотвращения зацикливания | +| DESYNC_MARK_POSTNAT | марк-бит для пометки потоков, идущих по схеме POSTNAT | +| FILTER_MARK | если задан, перехватывает пакеты только с этим битом mark. Полезно для организации особых фильтров, например, по ip источника локальной сети. | +| POSTNAT | использовать режим перехвата после NAT на nftables. По умолчанию - 1. На iptables перехват всегда до NAT. | +| NFQWS2_ENABLE | включение стандартного режима nfqws2 | +| NFQWS2_PORTS_TCP
NFQWS2_PORTS_UDP | порты перехвата для стандартного режима nfqws2 | +| NFQWS2_TCP_PKT_OUT
NFQWS2_TCP_PKT_IN
NFQWS2_UDP_PKT_OUT
NFQWS2_UDP_PKT_IN | ограничители connbytes по tcp/udp и направлению для стандартного режима nfqws2 | +| NFQWS2_PORTS_TCP_KEEPALIVE
NFQWS2_PORTS_UDP_KEEPALIVE | список портов tcp/udp, для которых выключается ограничитель connbytes по исходящему направлению для стандартного режима nfqws2 | +| NFQWS2_OPT | параметры командной строки стандартного режима nfqws2 | +| MODE_FILTER | режим фильтрации : none,ipset,hostlist,autohostlist | +| FLOWOFFLOAD | режим offload : donttouch,none,software,hardware | +| OPENWRT_LAN
OPENWRT_WAN4
OPENWRT_WAN6 | список через пробел lan и wan интерфейсов для ipv4 и ipv6 в OpenWRT. НЕ ИНТЕРФЕЙСЫ Linux, ИНТЕРФЕЙСЫ netifd ! по умолчанию "lan" и "wan" | +| IFACE_LAN
IFACE_WAN
IFACE_WAN6 | список через проблем lan и wan интерфейсов для ipv4 и ipv6 в классическом Linux. ИНТЕРФЕЙСЫ Linux ! | +| INIT_APPLY_FW | должны ли применять [стартовые скрипты](#стартовые-скрипты) правила firewall | +| INIT_FW_PRE_UP_HOOK
INIT_FW_POST_UP_HOOK
INIT_FW_PRE_DOWN_HOOK
INIT_FW_POST_DOWN_HOOK | хук-скрипты, вызываемые до, после поднятия и до, после опускания firewall | +| DISABLE_IPV4
DISABLE_IPV6
| отключить версии ip протокола | +| 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", иначе это работать не будет. @@ -3846,13 +4095,13 @@ ip листы разделяются на ipv4 и ipv6. ipv6 листы имею В зависимости от режима хостлисты могут ресолвиться в ip листы через [mdig](#mdig) или применяться как есть. Если хостлисты применяются как есть в nfqws2, учитываются только имена доменов, а IP адреса и подсети - нет. -| Хостлист | Тип | Назначение | ip листы | -|:---------|:-----|:-----------|:--------| -| zapret-hosts-user.txt | пользовательский | включающий | zapret-ip-user.txt
zapret-ip-user6.txt | -| zapret-hosts-user-exclude.txt | пользовательский | исключающий | zapret-ip-exclude.txt
zapret-ip-exclude6.txt | -| zapret-hosts-user-ipban.txt | пользовательский | заворот трафика | zapret-ip-user-ipban.txt
zapret-ip-user-ipban6.txt | -| -- | генерируемый | заворот трафика | zapret-ip-ipban.txt
zapret-ip-ipban6.txt | -| zapret-hosts.txt | генерируемый | включающий | zapret-ip.txt
zapret-ip6.txt | +| Хостлист | Тип | Назначение | ip листы | +| :---------------------------- | :--------------- | :-------------- | :---------------------------------------------------- | +| zapret-hosts-user.txt | пользовательский | включающий | zapret-ip-user.txt
zapret-ip-user6.txt | +| zapret-hosts-user-exclude.txt | пользовательский | исключающий | zapret-ip-exclude.txt
zapret-ip-exclude6.txt | +| zapret-hosts-user-ipban.txt | пользовательский | заворот трафика | zapret-ip-user-ipban.txt
zapret-ip-user-ipban6.txt | +| -- | генерируемый | заворот трафика | zapret-ip-ipban.txt
zapret-ip-ipban6.txt | +| zapret-hosts.txt | генерируемый | включающий | zapret-ip.txt
zapret-ip6.txt | ### Скрипты ipset @@ -3930,14 +4179,14 @@ IP листы содержат как ipv4, так и ipv6. Имеются только для Linux и OpenWRT. Вариант для Linux - в `init.d/sysv`, для OpenWRT - в `init.d/openwrt`. Основной исполняемый файл - `zapret2`. Требуемое действие передается в аргументе `$1`. Процедура запуска разделена на запуск демонов - процессов nfqws2, и запуск firewall - выставление правил ip/nf tables. -| Команда ($1) | Действие | -|:-------------|:---------| -| start
stop
restart | запуск/останов/перезапуск демонов и firewall. firewall не запускается, если [INIT_APPLY_FW](#файл-config) не равно 1. На openwrt с fw3 (iptables) firewall запускается отдельно, команды работают только с демонами и не трогают firewall | -| start_daemons
stop_daemons
restart_daemons | запуск/останов/перезапуск демонов | -| start_fw
stop_fw
restart_fw | запуск/останов/перезапуск firewall. На openwrt с fw3 (iptables) команды работают, но firewall запускается отдельно через firewall include в `/etc/config/firewall`. Отдельные операции не рекомендованы. | -| reload_ifsets | (только для nftables) перезагрузка сетов wanif и wanif6 | -| list_ifsets | (только для nftables) показ wanif, wanif6 и flowtable | -| list_table | (только для nftables) показ таблицы zapret2 | +| Команда ($1) | Действие | +| :----------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| start
stop
restart | запуск/останов/перезапуск демонов и firewall. firewall не запускается, если [INIT_APPLY_FW](#файл-config) не равно 1. На openwrt с fw3 (iptables) firewall запускается отдельно, команды работают только с демонами и не трогают firewall | +| start_daemons
stop_daemons
restart_daemons | запуск/останов/перезапуск демонов | +| start_fw
stop_fw
restart_fw | запуск/останов/перезапуск firewall. На openwrt с fw3 (iptables) команды работают, но firewall запускается отдельно через firewall include в `/etc/config/firewall`. Отдельные операции не рекомендованы. | +| reload_ifsets | (только для nftables) перезагрузка сетов wanif и wanif6 | +| list_ifsets | (только для nftables) показ wanif, wanif6 и flowtable | +| list_table | (только для nftables) показ таблицы zapret2 | sysv вариант предназначен для любых Linux, не являющихся OpenWRT. На системах с различными системами запуска все равно работает sysv скрипт, а прикрутка к системам запуска представляет собой лишь адаптер, его запускающий. На системах с неподдерживаемыми системами запуска и на прошивках вы сами должны знать куда прикрутить "zapret2 start" и "zapret2 stop", чтобы работал автостарт и останов в рамках вашей системы запуска.