From 0574d609de55a9ba0bee2aa1eadef4ff6000364c Mon Sep 17 00:00:00 2001 From: bol-van Date: Mon, 2 Feb 2026 19:02:15 +0300 Subject: [PATCH] update docs --- docs/manual.en.md | 26 +++---- docs/manual.md | 188 +++++++++++++++++++++++----------------------- 2 files changed, 107 insertions(+), 107 deletions(-) diff --git a/docs/manual.en.md b/docs/manual.en.md index fd59663..e68117c 100644 --- a/docs/manual.en.md +++ b/docs/manual.en.md @@ -565,10 +565,10 @@ pass out quick on $IFACE_WAN proto udp to port { $PORTS_UDP } divert-packet port ## Traffic interception in the Windows kernel -Windows lacks native tools for traffic interception. Instead, a third-party solution is used: the `windivert` driver. +Windows lacks native tools for traffic interception. Instead, a third-party solution is used: the `WinDivert` driver. Control is integrated directly into the `winws2` process. -`windivert` accepts [text-based filters](https://reqrypt.org/windivert-doc.html#filter_language) similar to those used by Wireshark and tcpdump. +`WinDivert` accepts [text-based filters](https://reqrypt.org/windivert-doc.html#filter_language) similar to those used by Wireshark and tcpdump. These filters support filtering by IP (without ipset), ports, and raw payloads. However, they do not support bitwise logical operations, bit shifts, flow tracking, or limiting interception to the first few packets of a connection. The WinDivert driver is no longer under active development. However, signed versions of the driver are available that are compatible with all modern Windows releases, though only for the x86_64 architecture. For ARM64, there is an unsigned driver that requires enabling Test Signing mode. @@ -998,7 +998,7 @@ In the event of a violation, the process is terminated. If the kernel does not s Windows: -- While the `windivert` driver requires administrator privileges, the `winws2` process sets its own integrity level to Low Mandatory Level after initialization. This prevents write access to almost all files and objects protected by a security descriptor. The process can no longer manage services or perform privileged actions. However, the Administrators group remains in the process token, so nothing prevents reading most files if they are accessible to Administrators. Lua lacks built-in tools for reading directory contents, making it difficult for an attacker to discover files of interest. +- While the `WinDivert` driver requires administrator privileges, the `winws2` process sets its own integrity level to Low Mandatory Level after initialization. This prevents write access to almost all files and objects protected by a security descriptor. The process can no longer manage services or perform privileged actions. However, the Administrators group remains in the process token, so nothing prevents reading most files if they are accessible to Administrators. Lua lacks built-in tools for reading directory contents, making it difficult for an attacker to discover files of interest. - All `Se*` privileges are irrevocably removed from the token, except for `SeChangeNotifyPrivilege`. - A Job object is used to prohibit the creation of child processes and restrict desktop interaction - clipboard access, changing desktop settings, changing display settings, etc. @@ -1393,7 +1393,7 @@ All multi-byte numeric values are automatically converted from network byte orde | transport_len | number | packet length excluding L3 headers | | l3_len | number | length of L3 headers, including IP options and IPv6 extension headers | | l4_len | number | length of the L4 header, including TCP options | -| payload | string | L4 payload | +| payload | string | L4 payload or everything after L3 headers in case of raw IP | **ip** @@ -2134,7 +2134,7 @@ Interface table contents : | mtu | number | MTU. for loopback can be 64K or even 0xFFFFFFFF | | flags | number | os-specific bit flags | | ssid | string | wifi SSID if known. SSIDs are obtained only if `--filter-ssid` is used in any profile | -| guid
iftype
index6
speed_xmit
speed_recv
metric4
metric6
conntype
| number | (windows only) additional fields from GetAdaptersAddresses() | +| guid
iftype
index6
speed_xmit
speed_recv
metric4
metric6
conntype
| number | (Windows only) additional fields from GetAdaptersAddresses() | | addr | table | integer indexed array of addresses | Address contents : @@ -2271,8 +2271,8 @@ Returns an array of information about all subsequent, pending instances in the c | func_n | number | instance number within the profile | | func_instance | string | instance name (derived from the function name, instance number, and profile number) | | range | table | effective range of [counters](#in-profile-filters) `--in-range` or `--out-range` depending on the current direction | -| payload | table | effective `--payload-filter` . payload name indexed table. | -| payload_filter | string | effective `--payload-filter`. A comma-separated list of payload names. | +| payload | table | effective payload filter : payload name indexed table. | +| payload_filter | string | effective payload filter : a comma-separated list of payload names. | **range** @@ -4088,7 +4088,7 @@ function udplen(ctx, desync) - arg: pattern_offset - initial offset within the pattern - default payload filter - "known" -The function increases or decreases the length of the UDP L4 payload. When decreasing, part of the information is truncated and lost; when increasing, the extra space is filled with the `pattern`. UDP segmentation is impossible - if the MTU or PMTU is exceeded, the packet will be fragmented by OS on IP level. An error in case of exceeding the MTU will only be reported on Linux; other systems will silently fail to send the packet (windivert and ipdivert have no means of error detection). +The function increases or decreases the length of the UDP L4 payload. When decreasing, part of the information is truncated and lost; when increasing, the extra space is filled with the `pattern`. UDP segmentation is impossible - if the MTU or PMTU is exceeded, the packet will be fragmented by OS on IP level. An error in case of exceeding the MTU will only be reported on Linux; other systems will silently fail to send the packet (WinDivert and ipdivert have no means of error detection). ### dht_dn @@ -5385,13 +5385,13 @@ cygwin prompt is pre-configured with aliases for blockcheck, blockcheck2, winws, ## Windows 7 -Requirements for windows driver signing have changed in 2021. -Official free updates of windows 7 ended in 2020. +Requirements for Windows driver signing have changed in 2021. +Official free updates of Windows 7 ended in 2020. After 2020 for the years paid updates were available (ESU). -One of the updates from ESU enables signatures used in windivert 2.2.2-A. +One of the updates from ESU enables signatures used in WinDivert 2.2.2-A. There are several options : -1. Take `windivert64.sys` and `windivert.dll` version `2.2.0-C` or `2.2.0-D` from [here](https://reqrypt.org/download) and replace existing files. +1. Take `WinDivert64.sys` and `WinDivert.dll` version `2.2.0-C` or `2.2.0-D` from [here](https://reqrypt.org/download) and replace existing files. 2. [Hack ESU](https://hackandpwn.com/windows-7-esu-patching) @@ -5407,7 +5407,7 @@ Then reboot the system. ## Windows ARM64 -The main problem is lack of a signed windivert driver. Therefore, it is required to enable the test signature mode: 'bcdedit/set {current} testsigning on'. +The main problem is lack of a signed WinDivert driver. Therefore, it is required to enable the test signature mode: 'bcdedit/set {current} testsigning on'. There's unsigned WinDivert64.sys driver in [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle). There is also cmd file for rolling the driver to the arm64 Win11. diff --git a/docs/manual.md b/docs/manual.md index f2dc983..b887172 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -38,7 +38,7 @@ - [Структура track](#структура-track) - [Особенности обработки icmp](#особенности-обработки-icmp) - [Особенности обработки raw ip](#особенности-обработки-raw-ip) -- [С интерфейс nfqws2](#с-интерфейс-nfqws2) +- [C интерфейс nfqws2](#c-интерфейс-nfqws2) - [Базовые константы](#базовые-константы) - [Стандартные блобы](#стандартные-блобы) - [Переменные окружения](#переменные-окружения) @@ -149,7 +149,7 @@ - [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) @@ -287,7 +287,7 @@ zapret2 является пакетным манипулятором, основ # Структура проекта Главный компонент zapret2 - программа [nfqws2](#nfqws2) (dvtws2 на BSD, winws2 на Windows), написанная на C, которая и является пакетным манипулятором. -Содержит функции по перехвату пакетов, базовой [фильтрации](#использование-множественных-профилей), рапознавания основных протоколов и пейлоадов, поддержки хост и IP [листов](#фильтрация-по-листам), [автоматических](#детектор-неудач-автохостлистов) хостлистов +Содержит функции по перехвату пакетов, базовой [фильтрации](#использование-множественных-профилей), распознаванию основных протоколов и пейлоадов, поддержке хост и IP [листов](#фильтрация-по-листам), [автоматических](#детектор-неудач-автохостлистов) хостлистов с распознаванием блокировок, систему множественных [профилей](#использование-множественных-профилей) (стратегий), возможности по [отсылке](#прием-и-отсылка-пакетов) raw пакетов и другие сервисные функции. Однако, там нет никаких возможностей собственно для воздействия на трафик. Это вынесено в код на языке Lua, вызываемый из [nfqws2](#nfqws2). @@ -296,8 +296,8 @@ zapret2 является пакетным манипулятором, основ Проект может работать с LuaJIT-2.1+ или с PUC Lua 5.3+. Более старые версии могут иметь несовместимости, не тестируются и не поддерживаются. -Функции перенаправления трафика из ядра в [Linux](#перехват-трафика-в-ядре-linux) возложены на [iptables](#перехват-трафика-с-помощью-iptables) и [nftables](#перехват-трафика-с-помощью-nftables), в [FreeBSD](#перехват-трафика-в-ядре-freebsd) - на [ipfw](#перехват-трафика-в-ядре-freebsd), в [OpenBSD](#перехват-трафика-в-ядре-openbsd) - на [pf](#перехват-трафика-в-ядре-openbsd), в [Windows](#перехват-трафика-в-ядре-windows) - встроены в сам процесс winws2 посредством драйвера windivert. -Схема перехвата трафика из ядра , nfqws2 и lua код составляют минимально рабочее ядро проекта. Все остальное является дополнительным, второстепенным и опциональным. +Функции перенаправления трафика из ядра в [Linux](#перехват-трафика-в-ядре-linux) возложены на [iptables](#перехват-трафика-с-помощью-iptables) и [nftables](#перехват-трафика-с-помощью-nftables), в [FreeBSD](#перехват-трафика-в-ядре-freebsd) - на [ipfw](#перехват-трафика-в-ядре-freebsd), в [OpenBSD](#перехват-трафика-в-ядре-openbsd) - на [pf](#перехват-трафика-в-ядре-openbsd), в [Windows](#перехват-трафика-в-ядре-windows) - встроены в сам процесс winws2 посредством драйвера WinDivert. +Схема перехвата трафика из ядра, nfqws2 и Lua код составляют минимально рабочее ядро проекта. Все остальное является дополнительным, второстепенным и опциональным. Из второстепенных компонент - [скрипты запуска](#скрипты-запуска) под Linux - `init.d`, `common`, `ipset`, `install_easy.sh`, `uninstall_easy.sh` и средство автоматизации тестирования стратегий [blockcheck2](#blockcheck2). Цель скриптов запуска - согласовать процесс поднятия таблиц и запуск инстансов nfqws2, учесть особенности интеграции в различные дистрибутивы (openwrt, systemd, openrc). @@ -305,14 +305,14 @@ zapret2 является пакетным манипулятором, основ Все это можно сделать при желании и собственными средствами, если так удобнее или функционал [скриптов запуска](#скрипты-запуска) не подходит. Скрипты запуска выносят все настройки в файл [config](#файл-config), лежащий в корне проекта. Этот конфиг относится только к ним, nfqws2 ничего о нем не знает. -Для обработки листов предусмотрены 2 программы, написанные на C. [mdig](#mdig) - многопоточный ресолвер хостлистов неограниченного обьема. -[ip2net](#ip2net) - программа для группировки отдельных IP адресов в подсети с целью сокращения их обьема. +Для обработки листов предусмотрены 2 программы, написанные на C. [mdig](#mdig) - многопоточный ресолвер хостлистов неограниченного объема. +[ip2net](#ip2net) - программа для группировки отдельных IP адресов в подсети с целью сокращения их объема. Эти программы используются в скриптах запуска и в [blockcheck2](#blockcheck2). -[Скрипты запуска](#скрипты-запуска) и [инсталлятор](#инсталлятор) поддерживает установку на любые классические дистрибутивы Linux с systemd или openrc , из прошивок - на openwrt. +[Скрипты запуска](#скрипты-запуска) и [инсталлятор](#инсталлятор) поддерживают установку на любые классические дистрибутивы Linux с systemd или openrc, из прошивок - на openwrt. Если система не удовлетворяет указанным требованиям - возможна самостоятельная "доприкрутка" к системе. -MacOS не поддерживается по причине отсутствия подходящего средства перехвата и управления пакетами. Стандартное для BSD средство ipdivert было убрано из ядра производителем. +macOS не поддерживается по причине отсутствия подходящего средства перехвата и управления пакетами. Стандартное для BSD средство ipdivert было убрано из ядра производителем. # Схема обработки трафика @@ -355,7 +355,7 @@ conntrack отслеживает логическое направление п Инстансы вызываются через параметры `--lua-desync`. Каждый инстанс получает набор произвольных параметров, задаваемых в `--lua-desync`. Порядок вызовов имеет принципиальное значение для логики стратегии и выполняется строго в порядке задания параметров `--lua-desync`. -Присутствуют и [внутипрофильные фильтры](#внутрипрофильные-фильтры). Их 3 типа - фильтр `--payload` - список принимаемых инстансом пейлоадов, и 2 диапазонных фильтра `--in-range` и `--out-range`, +Присутствуют и [внутрипрофильные фильтры](#внутрипрофильные-фильтры). Их 3 типа - фильтр `--payload` - список принимаемых инстансом пейлоадов, и 2 диапазонных фильтра `--in-range` и `--out-range`, позволяющих задать диапазон позиций внутри потока, который интересен для инстанса. Внутрипрофильные фильтры после их определения действуют на все последующие инстансы до их переопределения. Главный смысл наличия внутрипрофильных фильтров - сократить число относительно медленных вызовов Lua , принимая максимум решений на стороне C кода. @@ -372,13 +372,13 @@ Lua код может использовать глобальное простр Lua инстанс может создавать копии текущего диссекта, вносить в них изменения, генерировать собственные диссекты, [отправлять](#прием-и-отсылка-пакетов) их через вызовы C кода. Итогом работы каждого инстанса является вердикт - VERDICT_PASS - не делать ничего с текущим диссектом, VERDICT_MODIFY - в конце всей цепочки отослать модифицированное содержимое диссекта, -VERDICT_DROP - дропнуть текущий диссект. Вердикты всех инстансов аггрегируются - MODIFY замещает PASS, а DROP замещает и PASS, и MODIFY. +VERDICT_DROP - дропнуть текущий диссект. Вердикты всех инстансов агрегируются - MODIFY замещает PASS, а DROP замещает и PASS, и MODIFY. -Lua инстанс может сам себя отключить от получения дальнейших пакетов потока по направлению in/out - это назвается [instance cutoff](#instance_cutoff). +Lua инстанс может сам себя отключить от получения дальнейших пакетов потока по направлению in/out - это называется [instance cutoff](#instance_cutoff). Может отключить направление in/out текущего потока от всей Lua обработки - [lua cutoff](#lua_cutoff). -Может запросить [отмену](#execution-plan-cancel) всей дальнейшей цепочки вызовов Lua инстансов по текущему диссекту. Инстанс, принимающий такое решение, берет на себя функцию координации дальнейших действий. +Может запросить [отмену](#execution_plan_cancel) всей дальнейшей цепочки вызовов Lua инстансов по текущему диссекту. Инстанс, принимающий такое решение, берет на себя функцию координации дальнейших действий. Такой инстанс называется оркестратором. Он получает от C кода [план](#execution_plan) дальнейшего выполнения со всеми фильтрами профиля и параметрами вызова всех оставшихся инстансов -и сам принимает решения когда и при каких условиях их вызывать или не вызывать, менять их параметры. Так реализуются динамические сценарии без модификации основных составлящих кода стратегии. +и сам принимает решения когда и при каких условиях их вызывать или не вызывать, менять их параметры. Так реализуются динамические сценарии без модификации основных составляющих кода стратегии. Например, [определение](#детекция-удач-и-неудач) блокировки ресурса и [смена стратегии](#circular), если предыдущая не сработала. Если все инстансы текущего профиля вошли в состояние cutoff по текущему потоку, либо текущая позиция потока находится за верхней границей range фильтров, значит по этому потоку больше не будет Lua @@ -603,29 +603,29 @@ pass out quick on $IFACE_WAN proto udp to port { $PORTS_UDP } divert-packet port ``` > [!CAUTION] -> В FreeBSD другая версия pf и немного другой синтаксис. Однако, фактически pf в FreeBSD сломан, поскольку не работает предотвращение зацикливания. В MacOS хотя и используется pf, ipdivert из ядра убран, правила работать не будут. +> В FreeBSD другая версия pf и немного другой синтаксис. Однако, фактически pf в FreeBSD сломан, поскольку не работает предотвращение зацикливания. В macOS хотя и используется pf, ipdivert из ядра убран, правила работать не будут. ## Перехват трафика в ядре Windows -В Windows нет встроенных средств для перехвата трафика. Используется стороннее решение - драйвер windivert. +В Windows нет встроенных средств для перехвата трафика. Используется стороннее решение - драйвер WinDivert. Управление интегрируется в сам процесс winws2. -windivert принимает [текстовые фильтры](https://reqrypt.org/windivert-doc.html#filter_language), похожие на фильтры wireshark и tcpdump. +WinDivert принимает [текстовые фильтры](https://reqrypt.org/windivert-doc.html#filter_language), похожие на фильтры wireshark и tcpdump. В них есть возможности фильтрации по ip (без ipset), портам и raw пейлоадам. Нет побитовых логических операций и сдвигов. Нет отслеживания потоков и ограничения по первым пакетам. -Драйвер windivert больше не разрабатывается, однако имеются подписанные варианты драйвера, совместимые со всеми современными windows, +Драйвер WinDivert больше не разрабатывается, однако имеются подписанные варианты драйвера, совместимые со всеми современными Windows, но только для архитектуры x86_64. На arm64 есть неподписанный драйвер, требующий тестового режима подписи драйверов. При использовании winws2 на Windows 11 arm64 приходится пользоваться x86_64 версией, поскольку winws2 написан под cygwin, а его нет для arm. Драйвер .sys при этом заменяется на неподписанную arm64 версию. Запуск на Windows 10 arm64 теоретически возможен, но только с 32-битной версией winws2 x86, поскольку эмуляция x64 в Windows 10 не предусмотрена. -windivert является частой целью для нападок антивирусов. Это хакерский инструмент, но вирусом он не является. -Правильнее воспринимать его как замену iptables для windows. +WinDivert является частой целью для нападок антивирусов. Это хакерский инструмент, но вирусом он не является. +Правильнее воспринимать его как замену iptables для Windows. Иногда случаются конфликты со сторонним ПО, использующим драйвера режима ядра - прежде всего антивирусы и фаерволы, вплоть до синих экранов. Практически исправить это нереально хотя бы из-за подписи драйверов, которую получить простому смертному без стоящих за ним корпораций очень непросто и накладно. -windivert не может обеспечить корректного перехвата проходящего трафика при раздаче сети средствами windows и как следствие использовании NAT, +WinDivert не может обеспечить корректного перехвата проходящего трафика при раздаче сети средствами Windows и как следствие использовании NAT, поэтому возможности работы по проходящему трафику не реализованы. Единственный доступный вариант - установить proxy server. winws2 может принимать полные raw фильтры - вы пишите фильтр сами и указываете его в параметре `--wf-raw=` или `--wf-raw=@`. @@ -638,10 +638,10 @@ winws2 может принимать полные raw фильтры - вы пи `--wf-ipp-in`, `--wf-ipp-out` берут список raw IP протоколов (для ipv6 не поддерживается выявление истинного протокола при наличии extension headers). -`--wf-raw-part` принимает частичные windivert фильтры. Синтаксис аналогичен `--wf-raw`. `--wf-raw-part` может быть несколько. +`--wf-raw-part` принимает частичные WinDivert фильтры. Синтаксис аналогичен `--wf-raw`. `--wf-raw-part` может быть несколько. Частичные фильтры встраиваются конструктором в итоговый фильтр по принципу OR. Или указанные порты, или указанные icmp, или указанные ipp, или ваш фильтр1 или ваш фильтр2. -`--wf-raw-filter` - частичный windivert фильтр, обьединяемый по AND с итоговым полным фильтром. Может быть только один. Типичное применение - фильтрация по небольшому списку IP адресов. +`--wf-raw-filter` - частичный WinDivert фильтр, объединяемый по AND с итоговым полным фильтром. Может быть только один. Типичное применение - фильтрация по небольшому списку IP адресов. Например, задача - сделать icmp тоннель до сервера. Перехват всего icmp определенного типа слишком расточителен по процессору и бессмысленен. Намного лучше к `--wf-icmp-in=0` будет добавить `--wf-raw-filter="ip.SrcAddr==1.2.3.4"`. @@ -661,7 +661,7 @@ winws2 может принимать полные raw фильтры - вы пи Предпочтительно по udp протоколам, особенно по тем, где порт не определен, использовать свои `--wf-raw-part` фильтры, чтобы сэкономить на процессоре. Для tcp тоже возможны фильтры, но надо учитывать потребности conntrack. Он нуждается как минимум в SYN пакете, а желательно еще и FIN, RST. Если нужна фильтрация по сообщениям , занимающим более одного tcp сегмента, -такое отфильтровать средствами windivert невозможно - требуется полный перехват порта по направлению. +такое отфильтровать средствами WinDivert невозможно - требуется полный перехват порта по направлению. # nfqws2 @@ -675,7 +675,7 @@ nfqws2 использует стандартный парсер getopt_long_only Чтение параметров из файла реализовано через задание единственной опции `@config_file`. Все остальные параметры командной строки будут проигнорированы. -Опции будут прочитаны из файла, как будто бы вы ввели его содержимое в командой строке. +Опции будут прочитаны из файла, как будто бы вы ввели его содержимое в командной строке. Возможность не поддерживается в Android и OpenBSD версиях. ## Полный список опций @@ -744,7 +744,7 @@ LUA PACKET PASS MODE: --in-range=[(n|a|d|s|p)](-|<)[(n|a|d|s|p)] ; внутрипрофильный фильтр : диапазон счетчиков conntrack для последующих инстансов внутри профиля - входящее направление LUA DESYNC ACTION: - --lua-desync=[:param1=val1[:param2=val2]] ; при обработке профиля вызвать LUA инстанс с указанными параметрами, если соблюдены условия внутрипрофильных фильтров + --lua-desync=[:param1=val1[:param2=val2]] ; при обработке профиля вызвать LUA инстанс с указанными параметрами, если соблюдены условия внутрипрофильных фильтров ``` Специфические параметры nfqws2 : @@ -770,23 +770,23 @@ LUA DESYNC ACTION: Специфические параметры winws2 : ``` - --wf-iface=[.] ; windivert конструктор : номер сетевого интерфейса - --wf-l3=ipv4|ipv6 ; windivert конструктор : версия ip - --wf-tcp-in=[~]port1[-port2] ; windivert конструктор : tcp порты или диапазоны портов для перехвата по входящему направлению. список через запятую - --wf-tcp-out=[~]port1[-port2] ; windivert конструктор : tcp порты или диапазоны портов для перехвата по исходящему направлению. список через запятую - --wf-udp-in=[~]port1[-port2] ; windivert конструктор : udp порты или диапазоны портов для перехвата по входящему направлению. список через запятую - --wf-udp-out=[~]port1[-port2] ; windivert конструктор : udp порты или диапазоны портов для перехвата по исходящему направлению. список через запятую - --wf-tcp-empty=[~]port1[-port2] ; windivert конструктор : перехватывать пустые tcp пакеты ACK. по умолчанию - нет. - --wf-icmp-in=type[:code] ; windivert конструктор : icmp type и code по входящему направлению. если code не задан - любой code. список через запятую - --wf-icmp-out=type[:code] ; windivert конструктор : icmp type и code по исходящему направлению. если code не задан - любой code. список через запятую - --wf-ipp-in=type[:code] ; windivert конструктор : номера raw ip протоколов по входящему направлению. список через запятую - --wf-ipp-out=type[:code] ; windivert конструктор : номера raw ip протоколов по исходящему направлению. список через запятую - --wf-raw-part=|@ ; windivert конструктор : частичный windivert raw фильтр. обьединяется по принципу ИЛИ. может быть несколько - --wf-raw-filter=|@ ; windivert конструктор : частичный windivert raw фильтр. обьединяется по принципу И. может быть только один - --wf-filter-lan=0|1 ; windivert конструктор : отфильтровывать неглобальные IP адреса. по умолчанию - да. - --wf-raw=|@ ; полный windivert фильтр. замещает конструктор. + --wf-iface=[.] ; WinDivert конструктор : номер сетевого интерфейса + --wf-l3=ipv4|ipv6 ; WinDivert конструктор : версия ip + --wf-tcp-in=[~]port1[-port2] ; WinDivert конструктор : tcp порты или диапазоны портов для перехвата по входящему направлению. список через запятую + --wf-tcp-out=[~]port1[-port2] ; WinDivert конструктор : tcp порты или диапазоны портов для перехвата по исходящему направлению. список через запятую + --wf-udp-in=[~]port1[-port2] ; WinDivert конструктор : udp порты или диапазоны портов для перехвата по входящему направлению. список через запятую + --wf-udp-out=[~]port1[-port2] ; WinDivert конструктор : udp порты или диапазоны портов для перехвата по исходящему направлению. список через запятую + --wf-tcp-empty=[~]port1[-port2] ; WinDivert конструктор : перехватывать пустые tcp пакеты ACK. по умолчанию - нет. + --wf-icmp-in=type[:code] ; WinDivert конструктор : icmp type и code по входящему направлению. если code не задан - любой code. список через запятую + --wf-icmp-out=type[:code] ; WinDivert конструктор : icmp type и code по исходящему направлению. если code не задан - любой code. список через запятую + --wf-ipp-in=type[:code] ; WinDivert конструктор : номера raw ip протоколов по входящему направлению. список через запятую + --wf-ipp-out=type[:code] ; WinDivert конструктор : номера raw ip протоколов по исходящему направлению. список через запятую + --wf-raw-part=|@ ; WinDivert конструктор : частичный WinDivert raw фильтр. объединяется по принципу ИЛИ. может быть несколько + --wf-raw-filter=|@ ; WinDivert конструктор : частичный WinDivert raw фильтр. объединяется по принципу И. может быть только один + --wf-filter-lan=0|1 ; WinDivert конструктор : отфильтровывать неглобальные IP адреса. по умолчанию - да. + --wf-raw=|@ ; полный WinDivert фильтр. замещает конструктор. --wf-dup-check[=0|1] ; управление проверкой на повторный запуск с теми же параметрами фильтра --wf ( по умолчанию 1 ) - --wf-save= ; сохранить полный итоговый windivert фильтр в файл + --wf-save= ; сохранить полный итоговый WinDivert фильтр в файл LOGICAL NETWORK FILTER: --ssid-filter=ssid1[,ssid2,ssid3,...] ; список сетей wifi, при наличии подключения к которым перехват включается, а иначе не включается. --nlm-filter=net1[,net2,net3,...] ; список сетей Network List Manager, при наличии подключения к которым перехват включается, а иначе не включается. @@ -797,7 +797,7 @@ LOGICAL NETWORK FILTER: nfqws2 сигнатурно распознает типы пейлоадов отдельно взятых пакетов или групп пакетов. Все пустые пакеты имеют пейлоад empty, неизвестные - unknown. -Протокол потока присваивается после получение первого известного пейлоада и остается с потоком до конца его существования. +Протокол потока присваивается после получения первого известного пейлоада и остается с потоком до конца его существования. При этом последующие пейлоады могут иметь как известный тип, так и неизвестный. В фильтрах по пейлоаду и протоколу потока доступны специальные значения - all и known. All означает любой, known - не empty и не unknown. @@ -840,7 +840,7 @@ nfqws2 <глобальные_параметры> Если не сработал ни один фильтр, выбирается пустой профиль с номером 0, не предполагающий никаких действий с трафиком. Все условия, кроме `--filter-l7` и хостлистов, являются однозначными и известными с момента начала обработки потока (с начала соединения). -В начале как правило еще неизвестнен протокол потока и имя хоста, выделяемое из сообщений потока. +В начале, как правило, еще неизвестнен протокол потока и имя хоста, выделяемое из сообщений потока. Когда эти величины становятся известны, происходит поиск профиля заново. Если выбирается другой профиль - происходит перескок. Таких перескоков может быть до двух, поскольку есть только 2 величины, влияющие на выбор, неизвестные с самого начала. Для протоколов потока tls, http, quic обычно бывает только 1 перескок, поскольку определение протокола и имени хоста @@ -850,7 +850,7 @@ nfqws2 <глобальные_параметры> Если нужно, чтобы стратегия начала работу с самого первого пакета и продолжила работать дальше после изменения профиля, нужно дублировать вызовы во всех профилях, по которым может пройти поток. -4 группы фильтров - tcp, udp, icmp и ipp обьединяются по принципу OR. Если нет ни одного фильтра из этих групп, то +4 группы фильтров - tcp, udp, icmp и ipp объединяются по принципу OR. Если нет ни одного фильтра из этих групп, то считается разрешенным все. Если задается хотя бы один, остальные группы блокируются, если не определены. Фильтр ipp не работает с протоколами tcp, udp и icmp. Проверка пойдет по группам фильтра, соответствующим протоколу. Например, если задано только `--filter-ipp=6`, @@ -865,7 +865,7 @@ icmp автоматически подразумевает и icmpv6 - они о Шаблон - это такой же профиль, только он не идет в работу, а попадает в отдельный список шаблонов. Шаблоном профиль становится через задание параметра `--template=`. Далее он может быть импортирован (`--import=`) в другой профиль или другой шаблон. -Простые параметры - число, строка, bool - импортируются только, если они были заданы в импортируемом шаблоне. При иморте шаблона в шаблон в шаблоне назначения они так же считаются заданными. +Простые параметры - число, строка, bool - импортируются только, если они были заданы в импортируемом шаблоне. При импорте шаблона в другой шаблон в шаблоне назначения они также считаются заданными. Списочные параметры добавляются в конец списка. Такими параметрами является все, что может принимать список значений. Например, хостлисты или `--filter-tcp`. Номер и имя шаблона не копируются. Директив `--import` может быть сколько угодно в любом месте. Предыдущие простые заданные параметры затираются новыми импортированными или заданными в текущем профиле. @@ -884,8 +884,8 @@ nfqws2 <глобальные_параметры> В примере имеется 3 рабочих профиля и 3 шаблона, 1 из которых импортирует настройки другого. -- Профиль prof1 получает обьединение `<базовые параметры 1>` и `<дополнительные параметры 1>`. -- Профиль prof2 получает обьединение `<базовые параметры 2>`, `<базовые параметры 3>` и `<дополнительные параметры 2>` +- Профиль prof1 получает объединение `<базовые параметры 1>` и `<дополнительные параметры 1>`. +- Профиль prof2 получает объединение `<базовые параметры 2>`, `<базовые параметры 3>` и `<дополнительные параметры 2>` - Профиль prof3 получает `<параметры 3>`. Он не импортирует шаблоны. В шаблонах допустимы любые параметры, относящиеся к профилям, включая и фильтры. Глобальные параметры не являются частью профилей и шаблонов. @@ -947,14 +947,14 @@ nfqws2 <глобальные_параметры> При достижении счетчиком `--hostlist-auto-fail-threshold` происходит занесение хоста в лист. -Большинство критериев удачи или неудачи требует анализа входящего и исходящего трафика, поэтому необходим их перехват в достаточном обьеме +Большинство критериев удачи или неудачи требует анализа входящего и исходящего трафика, поэтому необходим их перехват в достаточном объеме для возможности срабатывания критериев. ### Фильтр по наличию сетей Если, допустим, вам нужно применить одну стратегию для wifi, другую для провода, это делается через фильтр, основанный на имени интерфейса. Но что делать, если вы подключаетесь к разным wifi сетям или подключаете провод в разных локациях ? -В случае провода решение есть только на windows, на других системах - нет. Для wifi есть решение на Linux и Windows, на BSD - нет. +В случае провода решение есть только на Windows, на других системах - нет. Для wifi есть решение на Linux и Windows, на BSD - нет. Фильтр по wifi берет список SSID через запятую, однако он реализован по-разному в Linux и Windows. В Linux используется фильтр профиля `--filter-ssid`. Если он задан, nfqws2 пытается получить SSID на интерфейсе, куда этот пакет уходит @@ -962,7 +962,7 @@ nfqws2 <глобальные_параметры> Такая концепция позволяет работать даже если вы подключаетесь к нескольким wifi сетям на разных адаптерах. В Windows концепция иная. Мониторится наличие указанных wifi сетей на всех wifi адаптерах, и если на любом из них SSID есть, -перехват windivert включается, а иначе выключается. Чтобы обслужить wifi сети с разными стратегиями нужно запускать несколько истансов winws2. +перехват WinDivert включается, а иначе выключается. Чтобы обслужить wifi сети с разными стратегиями нужно запускать несколько инстансов winws2. Один будет включаться, остальные - отключаться. Список SSID задается параметром `--ssid-filter`. Другой способ решить вопрос, и не только с wifi, - использование фильтра NLM - Network List Manager. @@ -1037,7 +1037,7 @@ Linux conntrack имеет похожий способ определения н Все IP адреса равнозначны. Вы можете подключаться к интернету, интернет - к вам. Вы - его составная часть с прямой IP адресацией. Но на практике все же к вам подключаться скорее всего не будут, а вы защититесь от таких подключений фаерволом. Поэтому направление все равно по интерфейсу определяется достаточно однозначно. -Но если у вас все-же есть внутренний сервер, вы можете для него запустить отдельный инстанс nfqws2 в серверном режиме, +Но если у вас все же есть внутренний сервер, вы можете для него запустить отдельный инстанс nfqws2 в серверном режиме, а для клиентского трафика - в обычном режиме. В BSD правила ipfw или pf обычно так и пишутся - "xmit wan", "recv wan" + добавляются фильтры по номерам @@ -1052,7 +1052,7 @@ ipcache представляет собой структуру в памяти 1. IP,interface => incoming ttl . Кэшируется TTL/HL первого входящего пакета для последующего применения в Lua функциях (autottl) прямо с первого пакета, когда еще ответа не было. 2. IP => hostname . Кэшируется имя хоста, вне привязки к интерфейсу, для последующего поиска профиля с фильтрами по хостлистам и передачи в Lua функции, когда имя хоста еще неизвестно. -Режим отключен по умолчанию и включается через параметр `ipcache-hostname`. +Режим отключен по умолчанию и включается через параметр `--ipcache-hostname`. Данная техника является экспериментальной. Ее проблема в том, что как такового нет однозначного соответствия между доменом и IP. Множество доменов могут ссылаться на тот же IP адрес. При коллизии происходит замещение имени хоста на последний вариант. Домен может скакать по разным IP на CDN. Сейчас один адрес, через час - другой. Эта проблема решается через время жизни записей кэша : `--ipcache-lifetime`. По умолчанию 2 часа. @@ -1115,13 +1115,13 @@ Linux : Windows : -- Хотя драйвер windivert требует привилегий администратора, после его инициализации процесс winws2 ставит себе low mandatory level. -Это предотвращает доступ на запись практически ко всем файлам и обьектам, защищенным security descriptor. +- Хотя драйвер WinDivert требует привилегий администратора, после его инициализации процесс winws2 ставит себе low mandatory level. +Это предотвращает доступ на запись практически ко всем файлам и объектам, защищенным security descriptor. Процесс больше не может управлять службами и осуществлять привилегированные действия. Однако, группа Administrators остается в токене процесса, поэтому ничто не предотвращает чтение большинства файлов, если на них есть доступ для Administrators. Lua не имеет встроенных средств чтения содержимого каталогов, поэтому обнаружение интересующих файлов для злоумышленника затруднено. - Безвозвратно убираются все Se* привилегии из токена, кроме SeChangeNotifyPrivilege. -- С помощью Job запрещается создание дочерних процессов и ограничивается взаимодействие с десктопом - clipboard, change desktop, change dispay settings и тд +- С помощью Job запрещается создание дочерних процессов и ограничивается взаимодействие с десктопом - clipboard, change desktop, change display settings и тд Есть простой способ передать Lua коду каталог, доступный на запись - параметр `--writeable[=]`. nfqws2 создает каталог, назначает на него такие права, чтобы Lua код смог писать туда файлы, передает имя директории в переменной env `WRITEABLE`. @@ -1138,7 +1138,7 @@ Lua код вызывается в 2 этапа. 2. При обработке профиля через `--lua-desync=function_name:arg1[=val1]:arg2[=val2]:argN[=valN]`. Сначала идет имя функции, затем через двоеточия аргументы и их значения. Все значения являются строками. Если значение не задано, оно равно пустой строке. -Реализовано 2 типа автоматических подстановок на строне C кода. +Реализовано 2 типа автоматических подстановок на стороне C кода. `%var` подставляет значение переменной `desync.var` или `var`, если первая отсутствует. `#var` подставляет длину переменной `desync.var` или `var`, если первая отсутствует. Двоеточия и знаки `%`, `#` в начале могут быть эскейпнуты через `\`. @@ -1164,7 +1164,7 @@ Lua код выполняется с ограниченными правами, Они бывают трех видов - `--payload`, `--in-range`, `--out-range`. Значения фильтров действуют с момента их указания до следующего переопределения. -- `--payload=type1[,type2][,type3]...` принимает список известных пейлоадов через зяпятую, "all" или "known". [Список известных пейлоадов](#распознавание-протоколов). По умолчанию `--payload=all`. +- `--payload=type1[,type2][,type3]...` принимает список известных пейлоадов через запятую, "all" или "known". [Список известных пейлоадов](#распознавание-протоколов). По умолчанию `--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=seq2`. Но последний простой вариант не будет работать корректно, а первый - будет, если seq1 ушел от seq2 не более, чем на 2 GB. -Большее и не отследить через sequence. Нужно всегда учитывать, что при передаче больших обьемов данных они не могут служить счетчиком. +Большее и не отследить через sequence. Нужно всегда учитывать, что при передаче больших объемов данных они не могут служить счетчиком. `p*counter` являются 64-битными счетчиками, поэтому у них этой проблемы нет. #### Особенности обработки icmp @@ -1707,7 +1707,7 @@ mss дублируется в поле `desync.tcp_mss` независимо о Если она находится, выбирается кэшированный профиль (тот, к которому относится прикрепленный пакет). Направление выбирается как обратное относительно найденной записи. Тип пейлоада устанавливается как "ipv4" или "ipv6", тип протокола сеанса - из профиля исходного пакета. -Далее icmp проходит обычным образом по профилю. Нужно учитывать, что в функцию может придти диссект с icmp, без tcp или udp, +Далее icmp проходит обычным образом по профилю. Нужно учитывать, что в функцию может прийти диссект с icmp, без tcp или udp, но с desync.track Если icmp не содержит прикрепленного пакета, он инвалидный или не найдена запись conntrack, icmp проходит самостоятельно @@ -1776,7 +1776,7 @@ desync.track всегда отсутствует. ## Стандартные блобы - fake_default_tls - фейковый tls_client_hello от firefox без kyber, SNI=www.microsoft.com -- fake_default_http - http запрос к +- fake_default_http - http запрос к "www.iana.org" - fake_default_quic - 0x40 + 619*0x00 ## Переменные окружения @@ -2162,7 +2162,7 @@ badsum вынесен в реконструкцию, поскольку чекс | ifout | string | исходящий интерфейс. может использоваться или не использоваться в разных ситуациях | ifout всегда следует передавать таким, каким он пришел в диссекте. -Для windows правильный ifout обязателен. На BSD он не используется. +Для Windows правильный ifout обязателен. На BSD он не используется. На Linux используется только если включены опции `--bind-fix4` или `--bind-fix6` в зависимости от версии ip. fwmark желательно передавать таким, каким он пришел в диссекте. @@ -2277,7 +2277,7 @@ function get_ifaddrs() Получить список IP адресов на всех интерфейсах (аналог ip addr, ifconfig, ipconfig). Возвращается таблица, индексы которой являются именами интерфейсов. -Для Windows имена интерфейсов представлены строками "число.число" - IfIdx.SubIfIdx - как раз то, что выдает и берет windivert. +Для Windows имена интерфейсов представлены строками "число.число" - IfIdx.SubIfIdx - как раз то, что выдает и берет WinDivert. Содержимое интерфейса : @@ -2287,7 +2287,7 @@ function get_ifaddrs() | mtu | number | MTU. для loopback может быть 64K или даже 0xFFFFFFFF | | flags | number | битовые флаги. зависят от ОС | | ssid | string | SSID wifi сети, если известен. имена сетей получаются только при использовании `--filter-ssid` | -| guid
iftype
index6
speed_xmit
speed_recv
metric4
metric6
conntype
| number | (только windows) дополнительные поля из GetAdaptersAddresses() | +| guid
iftype
index6
speed_xmit
speed_recv
metric4
metric6
conntype
| number | (только Windows) дополнительные поля из GetAdaptersAddresses() | | addr | table | таблица адресов с числовыми индексами от 1 | Содержимое адреса : @@ -2425,10 +2425,10 @@ function execution_plan(ctx) | :------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------- | | func | string | имя desync функции | | func_n | number | номер инстанса внутри профиля | -| func_instance | string | название инстанса | производная имени функции, номера инстанса и номера профиля | +| func_instance | string | название инстанса. производная имени функции, номера инстанса и номера профиля | | range | table | эффективный диапазон [счетчиков](#внутрипрофильные-фильтры) `--in-range` или `--out-range` в зависимости от текущего направления | -| payload | table | эффективный `--payload-filter` . таблица с индексами - названиями типа пейлоада | -| payload_filter | string | эффективный `--payload-filter` . список названий пейлоадов через запятую (иное представление payload) | +| payload | table | эффективный фильтр payload . таблица с индексами - названиями типа пейлоада | +| payload_filter | string | эффективный фильтр payload . список названий пейлоадов через запятую (иное представление payload) | **range** @@ -3410,7 +3410,7 @@ Windows заменяет нулевые ip_id на собственную пос | 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_set | установить флаги TCP. флаги представлены списком через запятую : FIN,SYN,RST,PUSH,ACK,FIN,URG,ECE,CWR | | tcp_flags_unset | снять флаги TCP. аналогично tcp_flags_set | | tcp_ts_up | поднять tcp timestamp опцию в самое начало, если она есть | | tcp_nop_del | удалить все TCP опции NOP для освобождения места в заголовке TCP | @@ -3667,7 +3667,7 @@ function apply_execution_plan(desync, instance) function verdict_aggregate(v1, v2) ``` -Аггрегация вердиктов v1 и v2. VERDICT_MODIFY замещает VERDICT_PASS, VERDICT_DROP замещает их обоих. +Агрегация вердиктов v1 и v2. VERDICT_MODIFY замещает VERDICT_PASS, VERDICT_DROP замещает их обоих. ### plan_instance_execute @@ -3676,7 +3676,7 @@ function plan_instance_execute(desync, verdict, instance) ``` Выполняет элемент [execution plan](#execution_plan) `instance` с учетом [instance cutoff](#instance_cutoff) и стандартных фильтров [payload](#внутрипрофильные-фильтры) и [range](#внутрипрофильные-фильтры). -Возвращает аггрегацию verdict и вердикта `instance`. +Возвращает агрегацию verdict и вердикта `instance`. ### plan_instance_pop @@ -3855,7 +3855,7 @@ 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: forced_cutoff - список типов пейлоадов через запятую, при получении которых выполняется [instance cutoff](#instance_cutoff). Если нужно применять wssize бесконечно, можно указать forced_cutoff=no, то есть несуществующий тип пейлоада, который не придет никогда. Меняет tcp.th_win и/или scaling factor в tcp оцпии во всех tcp пакетах потока по направлению до достижения условия "cutoff". Если изменение выполнено - выставляет VERDICT_MODIFY. @@ -4096,7 +4096,7 @@ function fakedsplit(ctx, desync) Цель данной техники - запутать DPI что есть оригинал, а что есть fake. Части одного размера, в одной мусор, в другой - реальные данные. Что выбрать ? Не знаем... Все выглядит как ретрансмиссии, имеет те же sequence и размеры. - К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. -- К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +- К фейкам применяются fooling_opts и reconstruct_opts в полном объеме. - ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". @@ -4139,7 +4139,7 @@ function fakeddisorder(ctx, desync) Кроме запутывания DPI в реальных и фейковых сегментах, добавляется еще и запутывание в их последовательности. - К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. -- К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +- К фейкам применяются fooling_opts и reconstruct_opts в полном объеме. - ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". @@ -4179,7 +4179,7 @@ function hostfakesplit(ctx, desync) 5. Реальная часть после host, либо 2 части : disorder_after..-1, endhost..disorder_after-1 - К оригиналам применяется только fooling_opts.tcp_ts_up. reconstruct_opts не применяются. -- К фейкам применяются fooling_opts и reconstruct_opts в полном обьеме. +- К фейкам применяются fooling_opts и reconstruct_opts в полном объеме. - ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов. В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". @@ -4271,7 +4271,7 @@ function udplen(ctx, desync) - arg: pattern_offset - начальное смещение внутри pattern - payload фильтр по умолчанию - "known" -Функция увеличивает или уменьшает длину L4 пейлоада udp. При уменьшении часть информации обрезается и теряется, при увеличении - заполняется pattern. Сегментация udp невозможна - при превышении MTU или PMTU ОС выполнит фрагментацию на уровне IP. Ошибка в случае превышения MTU будет только на Linux, остальные системы молча не отправят пакет (windivert и ipdivert не имеют средств обнаружения ошибки). +Функция увеличивает или уменьшает длину L4 пейлоада udp. При уменьшении часть информации обрезается и теряется, при увеличении - заполняется pattern. Сегментация udp невозможна - при превышении MTU или PMTU ОС выполнит фрагментацию на уровне IP. Ошибка в случае превышения MTU будет только на Linux, остальные системы молча не отправят пакет (WinDivert и ipdivert не имеют средств обнаружения ошибки). ### dht_dn @@ -4409,7 +4409,7 @@ function automate_failure_check(desync, hrec, crec) ### standard_success_detector -Стандартные детекторы удач и неудач требуют перенаправления входящего и исходящего трафика в обьеме, необходимом для срабатывания их критериев. +Стандартные детекторы удач и неудач требуют перенаправления входящего и исходящего трафика в объеме, необходимом для срабатывания их критериев. По relative sequence - нужны пакеты до указанного rseq + длина максимального пейлоада одного пакета (1460 байт для tcp). ``` @@ -4682,7 +4682,7 @@ blockcheck2 работает на всех поддерживаемых плат Ничего не будет работать, если на заблокированные домены провайдер будет отдавать подмененные IP адреса, если только ваш клиент или ОС не поддерживают передачу запросов через шифрованные каналы (DoH, например). Даже если броузер и заработает из-за встроенного DoH, существуют и другие программы, в которых поддержки нет. Если сама ОС поддерживает шифрованный DNS - можно воспользоваться этой возможностью, а если нет - решение проблемы DNS ложится на вас. -Если IP подменяются только на DNS серверах провайдера, а доступ к другим DNS не блокируется и не подменяется, можно использовать другие DNS. Например, публичные - 1.1.1.1, 8.8.8.8, 9.9.9.9. Если доступ к другим DNS блокируется или подменяется, нужно шифровать DNS канал. Может быть и так, что подмена идет только на порту 53, а на других портах DNS ответы не подменяются. Но такую конфигурацию не поддерживают клиенты. Нужно или сделать прозрачное перенаправление на роутере, или использовать аггрегатор DNS (dnsmasq, например), который поддерживает обращение к DNS на нестандартных портах. +Если IP подменяются только на DNS серверах провайдера, а доступ к другим DNS не блокируется и не подменяется, можно использовать другие DNS. Например, публичные - 1.1.1.1, 8.8.8.8, 9.9.9.9. Если доступ к другим DNS блокируется или подменяется, нужно шифровать DNS канал. Может быть и так, что подмена идет только на порту 53, а на других портах DNS ответы не подменяются. Но такую конфигурацию не поддерживают клиенты. Нужно или сделать прозрачное перенаправление на роутере, или использовать агрегатор DNS (dnsmasq, например), который поддерживает обращение к DNS на нестандартных портах. yandex предоставляет DNS на портах 1253. На openwrt он прописывается довольно просто : @@ -4744,7 +4744,7 @@ blockcheck2 способен содействовать в определени Далее следует проверка частичного IP блока через curl. Исследуется ситуация, когда коннект на порт есть. Задача выяснить происходит ли блокировка на IP блокированного домена при использовании неблокированного домена и наоборот. Если на IP блокированного домена не проходят неблокированные домены, но они проходят на своих родных IP адресах, значит есть частичный блок по IP. Если блокированные домены не проходят на IP неблокированных доменов, а сами неблокированные домены - проходят, значит есть блок по SNI. Блоки по IP и SNI могут сочетаться. -Оценка успеха или неуспеха этих проверок и есть та загводзка, из-за которой интерпретация результата ложится на человека. Что есть успех и не успех ? Это очень сильно варьируется и может зависеть как от DPI, так и от самого сервера. +Оценка успеха или неуспеха этих проверок и есть та загвоздка, из-за которой интерпретация результата ложится на человека. Что есть успех и не успех ? Это очень сильно варьируется и может зависеть как от DPI, так и от самого сервера. Например, ошибка TLS при запросе через SNI iana.org на IP rutracker.org, может свидетельствовать об успехе. Ошибка сертификата может быть как успехом, так и неудачей - неверный сертификат может вернуть как сам сервер, так и DPI в результате MiTM атаки. Вам важно понять вернул ли сервер хоть какой-то ответ и является ли это действительно ответом сервера или является результатом работы DPI. TLS alert при запросе домена, который не хостится на сервере, явление нормальное и частое. Но может так же и быть, что сервер выдает страницу на любой SNI в TLS - тоже нормальная ситуация. @@ -4931,9 +4931,9 @@ blockcheck проверяет доступность одного отдельн 1. Может все начинаться с DNS. blockcheck использует системный или doh, а броузер - наоборот. Такие сайты, как instagram, частично заблокированы по IP. Успех зависит от того, какой именно IP выдается конкретным DNS. Если же у вас DNS отравлен провайдером, а ваш клиент не поддерживает шифрованный DNS, то это сразу конец всем обходам. Вы пойдете на IP адрес заглушки, и , естественно, никакой zapret не поможет. Бывает, провайдер вообще не выдает DNS ответ на заблокированный домен или выдает 127.0.0.1. 2. Сайт - это не один домен и не один URI. Жмете F12 в броузере и во вкладке "сеть" смотрите куда лезет сайт. Он может споткнуться на другом домене. -3. Цель броузера - открыть сайт как можно быстрее, не нагружая пользователя техническими терминами, которые для него неотличимы от китайского языка. Поэтому он лезет на сайт по разным протоколам так, чтобы страница открылась быстрее. Может скакать между ipv4 и ipv6, между tls и quic. Уже 4 комбинации. А ведь для каждого из них отдельный тест блокчека. Все ли они пробились одной стратегией ? Корректно ли вы перенесли эти стратегии в рабочий конфиг ? Правильно ли их обьединили ? +3. Цель броузера - открыть сайт как можно быстрее, не нагружая пользователя техническими терминами, которые для него неотличимы от китайского языка. Поэтому он лезет на сайт по разным протоколам так, чтобы страница открылась быстрее. Может скакать между ipv4 и ipv6, между tls и quic. Уже 4 комбинации. А ведь для каждого из них отдельный тест блокчека. Все ли они пробились одной стратегией ? Корректно ли вы перенесли эти стратегии в рабочий конфиг ? Правильно ли их объединили ? 4. Отдельный важный параметр - kyber. Постквантовая криптография, которая однопакетный запрос TLS/QUIC превращает в 2 или 3 пакетный. Само по себе фактор при обходе DPI. Современные броузеры обычно используют kyber. curl - зависит от его старости и от старости криптобиблиотеки, с которой он слинкован. OpenSSL 3.5.0 выдает kyber, старее - нет. LibreSSL или mbedTLS не выдают kyber. Сейчас. А завтра выдадут, потому что тренд идет в ту сторону. -5. Блокираторы ничем не брезгуют. Бывает они даже привязываются к фингерприту клиента. Что это такое ? Наличие/порядок tls extensions прежде всего, характерный для броузера или curl. Никак нельзя забанить IP адреса, но нужно устранить очередной новый VPN клиент ? Смотрят его handshake, находят уникальные особенности и рубят по ним. Заодно отрубается что-то еще. Но им на это уже плевать. +5. Блокираторы ничем не брезгуют. Бывает они даже привязываются к фингерпринту клиента. Что это такое ? Наличие/порядок tls extensions прежде всего, характерный для броузера или curl. Никак нельзя забанить IP адреса, но нужно устранить очередной новый VPN клиент ? Смотрят его handshake, находят уникальные особенности и рубят по ним. Заодно отрубается что-то еще. Но им на это уже плевать. 6. ECH - технология зашифрованной передачи SNI, чтобы блокираторы не видели к какому ресурсу обращаются. Технология отличная, но, к сожалению, запоздавшая. Точка, когда технология уже окончательно вьелась в стандарты де-факто, не была пройдена. Поэтому могут банить как по самому наличию ECH, так и по внешнему SNI-заглушке. На cloudflare это "cloudflare-ech.com". curl дергает сайт без ECH, а броузер может с ним - вот и разница. 7. Версия TLS протокола. По умолчанию blockcheck2 тестирует TLS 1.2 как самый тяжелый для обхода вариант. Броузер скорее всего полезет по TLS 1.3. Были случаи, когда блокираторы намеренно банили протокол TLS 1.3, потому что его использует и требует популярный метод обхода через VLESS-REALITY. Уровень пофигизма на сопутствующий ущерб уже настолько высок, что поломка множества легальных ресурсов их не останавливает. 8. Знаменитый "16 кб" блок. Как проверить 16 кб блок ? Дернуть curl какой-то URI, на котором сайт выдаст достаточно длинную страницу. Если загрузка виснет посередине - это оно. По умолчанию blockcheck2 на https использует HEAD, чтобы не мучать сервер и экономить трафик - все равно под https ничего не видно. Это можно поменять через [CURL_HTTPS_GET=1](#shell-переменные). Но так вы скорее всего начнете получать сплошные "UNAVAILABLE". Стандартный вариант дает стратегии, которые будут работать при обходе 16кб блока, поэтому более информативен. Почему же они это делают ? Поставлена задача загнать всех под российскую юрисдикцию, а для этого гнобят крупные хостинги - cloudfare, hetzner, akamai, aws и другие. CDN часто используются для скрытого проброса прокси или VPN. Им надо оставить несколько важных сайтов. hp.com - откуда еще драйвера для LaserJet качать ? А hp на одном из таких хостингов. Получается белый список. Следовательно, вам нужен пейлоад, который ему удовлетворяет. Но беда в том, что блокчек , как и сам zapret, - всего лишь инструмент. Он не включает в себя готовых рецептов. Вам самим нужно искать чем пробивать конкретные хостинги. Сейчас это так, а завтра будет еще что-то другое. Автор не будет гнаться за ситуацией, не будет оперативно менять блокчек, чтобы он вам выдавал готовые copy+paste рецепты. Вам нужно самим смотреть на ситуацию и искать решение. Сегодня белые списки в стиле "16 кб" пробиваются или белым SNI, или каким-то другим белым типом протокола, не TLS. Завтра будет что-то другое. [Стандартный чекер](#тест-standard) берет целый список переменных для кустомизации сканирования. Есть возможность подсунуть [что-то до и что-то после](#shell-переменные) стратегии. Наконец, свет клином не сошелся на блокчеке. Иногда удобнее вручную проверять. @@ -4947,7 +4947,7 @@ blockcheck проверяет доступность одного отдельн # Скрипты запуска -Под скриптами запуска понимается обвязка для Linux, позволяющая устанавливать, настраивать, удалять, запускать и останавливать программу. Сюда же входит система обслуживания файлов IP и хост листов. Она поддерживает openwrt и классические Linux с systemd и openrc. Для остальных Linux и прошивок возможна настройка параметров, но обеспечить автозапуск вам нужно самостоятельно. +Под скриптами запуска понимается обвязка для Linux, позволяющая устанавливать, настраивать, удалять, запускать и останавливать программу. Сюда же входит система обслуживания файлов IP и хостлистов. Она поддерживает openwrt и классические Linux с systemd и openrc. Для остальных Linux и прошивок возможна настройка параметров, но обеспечить автозапуск вам нужно самостоятельно. Из прошивок гарантируется работа только на OpenWRT, начиная с 18-й версии. На более старых может работать или частично не работать. На keenetic работает под entware, но только в составе дополнительных "обеспечительных мер", которые выходят за рамки проекта zapret2 и поддерживаются сторонними разработчиками. На остальных прошивках прикрутка ложится целиком на пользователя. Есть и готовые интеграции в разные прошивки, но их поддержка лежит целиком на их авторах. Официально автором zapret они не поддерживаются. @@ -5162,7 +5162,7 @@ custom скрипт может иметь следующие shell функци - **zapret_custom_daemons** - поднятие и останов демонов. $1 = 1 - поднятие, 0 - останов. - **zapret_custom_firewall** - поднятие и снятие правил iptables. $1 = 1 - поднятие, 0 - снятие. - **zapret_custom_firewall_nft** - поднятие правил nftables. останов не требуется, поскольку основной код при останове очищает цепочки nft вместе с custom правилами. -- **zapret_custom_firewall_nft_flush** - вызывается при останове nftables, чтобы можно было удалить обьекты, выходящие за рамки стандартных цепочек - такие, как собственные set-ы или собственные цепочки. +- **zapret_custom_firewall_nft_flush** - вызывается при останове nftables, чтобы можно было удалить объекты, выходящие за рамки стандартных цепочек - такие, как собственные set-ы или собственные цепочки. Если вам не нужны iptables или nftables, функции для соответствующего типа firewall можно не писать. В функциях крайне желательно пользоваться хелперами основного кода - так вы будете следовать идеологии скриптов запуска без необходимости сосредотачиваться на частностях. Можно свободно адресовать переменные [config](#файл-config) и добавлять туда свои. @@ -5585,14 +5585,14 @@ cygwin эмулирует общее пространство PID процесс ## Windows 7 -Требования к подписи драйверов windows изменились в 2021 году. -Официальные бесплатные обновления windows 7 закончились в 2020. +Требования к подписи драйверов Windows изменились в 2021 году. +Официальные бесплатные обновления Windows 7 закончились в 2020. После этого несколько лет продолжали идти платные обновления по программе ESU. -Именно в этих ES* обновлениях находится обновление ядра windows 7, позволяющее загрузить драйвер -windivert 2.2.2-A, который идет в поставке zapret. +Именно в этих ES* обновлениях находится обновление ядра Windows 7, позволяющее загрузить драйвер +WinDivert 2.2.2-A, который идет в поставке zapret. Поэтому варианты следующие : -1) Взять `windivert64.sys` и `windivert.dll` версии 2.2.0-C или 2.2.0-D [отсюда](https://reqrypt.org/download) и заменить эти 2 файла. +1) Взять `WinDivert64.sys` и `WinDivert.dll` версии 2.2.0-C или 2.2.0-D [отсюда](https://reqrypt.org/download) и заменить эти 2 файла. 2) Взломать ESU : [Ссылка 1](https://hackandpwn.com/windows-7-esu-patching) [Ссылка 2](http://www.bifido.net/tweaks-and-scripts/8-extended-security-updates-installer.html) @@ -5607,7 +5607,7 @@ windivert 2.2.2-A, который идет в поставке zapret. > Использовать на свой страх и риск. Более безопасный вариант - скачать последнюю нормальную [довоенную версию : 22.2.10](https://nnmclub.to/forum/viewtopic.php?t=1530323). -Ее достаточно, чтобы windivert 2.2.2-A заработал на windows 7. +Ее достаточно, чтобы WinDivert 2.2.2-A заработал на Windows 7. ## Windows Server @@ -5617,7 +5617,7 @@ winws2 слинкован с wlanapi.dll, который по умолчанию ## Windows ARM64 -Главная проблема - отсутствие подписанного windivert драйвера. Поэтому требуется включение режима тестовой подписи : `bcdedit /set {current} testsigning on`. +Главная проблема - отсутствие подписанного WinDivert драйвера. Поэтому требуется включение режима тестовой подписи : `bcdedit /set {current} testsigning on`. Неподписанный драйвер WinDivert64.sys есть в комплекте [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle). Там же есть и батник для наката драйвера на Win11 arm64.