From 2a0e9521539234eee3b775928b15ea30122961bb Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 6 Mar 2025 16:06:55 +0300 Subject: [PATCH] update docs --- docs/changes.txt | 6 +++++- docs/readme.en.md | 7 ++++--- docs/readme.md | 53 ++++++++++++++++++++++++----------------------- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 818e99a..d8b0084 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -453,8 +453,12 @@ nfqws,tpws: hostlist/ipset track not only file mod time but also file size nfqws,tpws,ipset: return lists reload on HUP nfqws,blockcheck: --dpi-desync-fake-tls-mod -v70.3 +v70.1 nfqws: --dpi-desync-fake-tls-mod=dupsid nfqws,tpws: test accessibility of list files after privs drop nfqws,tpws: --version + +v70.4 + +nfqws,tpws: ^ prefix in hostlist to disable subdomain matches diff --git a/docs/readme.en.md b/docs/readme.en.md index 28188dc..09e55b0 100644 --- a/docs/readme.en.md +++ b/docs/readme.en.md @@ -1,4 +1,4 @@ -# zapret v70.3 +# zapret v70.4 # SCAMMER WARNING @@ -185,9 +185,9 @@ nfqws takes the following parameters: --dpi-desync-udplen-pattern=|0xHEX ; udp tail fill pattern --dpi-desync-start=[n|d|s]N ; apply dpi desync only to packet numbers (n, default), data packet numbers (d), relative sequence (s) greater or equal than N --dpi-desync-cutoff=[n|d|s]N ; apply dpi desync only to packet numbers (n, default), data packet numbers (d), relative sequence (s) less than N - --hostlist= ; apply dpi desync only to the listed hosts (one host per line, subdomains auto apply, gzip supported, multiple hostlists allowed) + --hostlist= ; apply dpi desync only to the listed hosts (one host per line, subdomains auto apply if not prefixed with `^`, gzip supported, multiple hostlists allowed) --hostlist-domains= ; comma separated fixed domain list - --hostlist-exclude= ; do not apply dpi desync to the listed hosts (one host per line, subdomains auto apply, gzip supported, multiple hostlists allowed) + --hostlist-exclude= ; do not apply dpi desync to the listed hosts (one host per line, subdomains auto apply if not prefixed with `^`, gzip supported, multiple hostlists allowed) --hostlist-exclude-domains= ; comma separated fixed domain list --hostlist-auto= ; detect DPI blocks and build hostlist automatically --hostlist-auto-fail-threshold= ; how many failed attempts cause hostname to be added to auto hostlist (default : 3) @@ -984,6 +984,7 @@ If all include lists are empty it works like no include lists exist at all. If you need "all except" mode you dont have to delete zapret-hosts-users.txt. Just make it empty. Subdomains auto apply. For example, "ru" in the list affects "*.ru" . +`^` prefix symbol disables subdomain match. **tpws** and **nfqws** automatically reload lists if their modification time or file size is changed. HUP signal forcibly reloads all lists. diff --git a/docs/readme.md b/docs/readme.md index 09f14f4..0783b70 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1,4 +1,4 @@ -# zapret v70.3 +# zapret v70.1 # ВНИМАНИЕ, остерегайтесь мошенников @@ -205,7 +205,7 @@ dvtws, собираемый из тех же исходников (см. [док --dpi-desync-udplen-pattern=|0xHEX ; чем добивать udp пакет в режиме udplen. по умолчанию - нули --dpi-desync-start=[n|d|s]N ; применять dpi desync только в исходящих пакетах (n), пакетах данных (d), относительных sequence (s) по номеру больше или равно N --dpi-desync-cutoff=[n|d|s]N ; применять dpi desync только в исходящих пакетах (n), пакетах данных (d), относительных sequence (s) по номеру меньше N ---hostlist= ; действовать только над доменами, входящими в список из filename. поддомены автоматически учитываются. +--hostlist= ; действовать только над доменами, входящими в список из filename. поддомены автоматически учитываются, если хост не начинается с '^'. ; в файле должен быть хост на каждой строке. ; список читается при старте и хранится в памяти в виде иерархической структуры для быстрого поиска. ; при изменении времени модификации файла он перечитывается автоматически по необходимости @@ -280,7 +280,7 @@ dvtws, собираемый из тех же исходников (см. [док Такие пакеты будут наверняка отброшены принимающим узлом, но так же и DPI, если он ориентируется на sequence numbers. По умолчанию смещение seq выбирается -10000. Практика показала, что некоторые DPI не пропускают seq вне определенного окна. Однако, такое небольшое смещение может вызвать проблемы при существенной потоковой передаче и - потере пакетов. Если вы используете `--dpi-desync-any-protocol`, может понадобится установить badseq increment + потере пакетов. Если вы используете `--dpi-desync-any-protocol`, может понадобиться установить badseq increment 0x80000000. Это обеспечит надежную гарантию, что поддельный пакет не вклинится в tcp window на сервере. Так же было замечено, что badseq ломает логику некоторых DPI при анализе http, вызывая зависание соединения. Причем на тех же DPI TLS с badseq работает нормально. @@ -295,7 +295,7 @@ dvtws, собираемый из тех же исходников (см. [док * `hopbyhop` относится только к ipv6. Добавляется ipv6 extenstion header `hop-by-hop options`. В варианте `hopbyhop2` добавляются 2 хедера, что является нарушением стандарта и гарантированно отбрасывается стеком протоколов во всех ОС. Один хедер hop-by-hop принимается всеми ОС, однако на некоторых каналах/провайдерах такие пакеты могут фильтроваться и - не доходить. Расчет идет на то, что DPI проанализирует пакет с hop-by-hop, но он либо не дойдет до адресата всилу + не доходить. Расчет идет на то, что DPI проанализирует пакет с hop-by-hop, но он либо не дойдет до адресата в силу фильтров провайдера, либо будет отброшен сервером, потому что хедера два. * `datanoack` высылает фейки со снятым tcp флагом ACK. Сервера такое не принимают, а DPI может принять. Эта техника может ломать NAT и не всегда работает с iptables, если используется masquerade, даже с локальной системы (почти всегда @@ -530,8 +530,8 @@ window size итоговый размер окна стал максимальн ### РЕАССЕМБЛИНГ nfqws поддерживает реассемблинг некоторых видов запросов. -На текущий момент это TLS и QUIC ClientHello. Они бывает длинными, если в chrome включить пост-квантовую -криптографию tls-kyber, и занимают как правило 2 или 3 пакета. kyber включен по умолчанию, начиная с chromium 124. +На текущий момент это TLS и QUIC ClientHello. Они бывают длинными, если в chrome включить пост-квантовую +криптографию tls-kyber, и занимают, как правило, 2 или 3 пакета. kyber включен по умолчанию, начиная с chromium 124. chrome рандомизирует фингерпринт TLS. SNI может оказаться как в начале, так и в конце, то есть попасть в любой пакет. stateful DPI обычно реассемблирует запрос целиком, и только потом принимает решение о блокировке. @@ -620,7 +620,7 @@ options ip6table_raw raw_before_defrag=1 При использовании iptables и NAT, похоже, что нет способа прицепить обработчик очереди после NAT. Пакет попадает в nfqws с source адресом внутренней сети, затем фрагментируется и уже не обрабатывается NAT. -Так и уходит во внешюю сеть с src ip 192.168.x.x. Следовательно, метод не срабатывает. +Так и уходит во внешнюю сеть с src ip 192.168.x.x. Следовательно, метод не срабатывает. Видимо единственный рабочий метод - отказаться от iptables и использовать nftables. Хук должен быть с приоритетом 101 или выше. @@ -644,7 +644,7 @@ L7 протокол становится известен обычно посл Если имя хоста удовлетворяет листам, выбирается этот профиль. Иначе идет переход к следующему. Может так случиться, что до получения имени хоста или узнавания L7 протокола соединение идет по одному профилю, а при выяснении этих параметров профиль меняется на лету. Это может произойти даже дважды - при выяснении L7 -и имени хоста. Чаще всего это выяснение совмещается в одно действие, поскольку по одному пакету как правило узнается и L7, и хост. +и имени хоста. Чаще всего это выяснение совмещается в одно действие, поскольку по одному пакету, как правило, узнается и L7, и хост. Поэтому если у вас есть параметры дурения нулевой фазы, тщательно продумывайте что может произойти при переключении стратегии. Смотрите debug log, чтобы лучше понять что делает nfqws. Нумерация профилей идет с 1 до N. Последним в цепочке создается пустой профиль с номером 0. @@ -658,7 +658,7 @@ L7 протокол становится известен обычно посл > [!IMPORTANT] > user-mode реализация ipset создавалась не как удобная замена *nix версии, реализованной в ядре. -> Вариант в ядре работает гораздо эффективнее. Это создавалось для систем без подержки ipset в ядре. +> Вариант в ядре работает гораздо эффективнее. Это создавалось для систем без подд3ержки ipset в ядре. > Конкретно - Windows и ядра Linux, собранные без nftables и ipset модулей ядра. Например, в android нет ipset. ### IPTABLES ДЛЯ NFQWS @@ -678,7 +678,7 @@ iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp ``` mark нужен, чтобы сгенерированный поддельный пакет не попал опять к нам на обработку. nfqws выставляет fwmark при его отсылке. -хотя nfqws способен самостоятельно различать помеченные пакеты, фильтр в iptables по mark нужен при использовании connbytes, +Хотя nfqws способен самостоятельно различать помеченные пакеты, фильтр в iptables по mark нужен при использовании connbytes, чтобы не допустить изменения порядка следования пакетов. Процессинг очереди - процесс отложенный. Если ядро имеет пакеты на отсылку вне очереди - оно их отправляет незамедлительно. Изменение правильного порядка следования пакетов при десинхронизации ломает всю идею. @@ -691,7 +691,7 @@ mark нужен, чтобы сгенерированный поддельный * 3 - стандартная ситуация приема одного пакета запроса * 4-6 - на случай ретрансмиссии или запроса длиной в несколько пакетов (TLSClientHello с kyber, например) -Для режима autottl необходимо перенаправление входящего `SYN,ACK` пакета или первого пакета соединения (что обычно есть тоже самое). +Для режима autottl необходимо перенаправление входящего `SYN,ACK` пакета или первого пакета соединения (что обычно есть то же самое). Для режима autohostlist необходимы входящие RST и http redirect. Можно построить фильтр на tcp flags для выделения `SYN,ACK` и модуле u32 для поиска характерных паттернов http redirect, но проще использовать connbytes для выделения нескольких начальных входящих пакетов. @@ -855,7 +855,7 @@ tpws - это transparent proxy. --mss= ; установить MSS для клиента. может заставить сервер разбивать ответы, но существенно снижает скорость --tamper-start=[n] ; начинать дурение только с указанной байтовой позиции или номера блока исходяшего потока (считается позиция начала принятого блока) --tamper-cutoff=[n] ; закончить дурение на указанной байтовой позиции или номере блока исходящего потока (считается позиция начала принятого блока) ---hostlist= ; действовать только над доменами, входящими в список из filename. поддомены автоматически учитываются. +--hostlist= ; действовать только над доменами, входящими в список из filename. поддомены автоматически учитываются, если хост не начинается с '^'. ; в файле должен быть хост на каждой строке. ; список читается при старте и хранится в памяти в виде иерархической структуры для быстрого поиска. ; при изменении времени модификации файла он перечитывается автоматически по необходимости @@ -892,7 +892,7 @@ tpws, как и nfqws, поддерживает множественную се Однако, если в момент send уже имеется неотосланный буфер, то ОС присоединит данные к нему, никакой отсылки отдельным пакетом не будет. Но в этом случае и так нет никакой гарантии, что какой-то блок сообщения пойдет в начале пакета, на что собственно и заточены DPI. -Разбиение будет производится согласно MSS, который зависит от MTU исходящего интерфейса. +Разбиение будет производиться согласно MSS, который зависит от MTU исходящего интерфейса. Таким образом DPI, смотрящие в начало поля данных TCP пакета, будут поломаны в любом случае. Протокол http относится к запрос-ответным протоколам. Новое сообщение посылается только тогда, когда сервер получил запрос и полностью вернул ответ. Значит запрос фактически был не только отослан, @@ -1080,7 +1080,7 @@ route_localnet : динамически вписывать в команду. В любом случае требуются дополнительные усилия. Использование route_localnet тоже имеет потенциальные проблемы с безопасностью. Вы делаете доступным все, что висит на `127.0.0.0/8` для локальной подсети < внутренний_интерфейс>. Службы обычно привязываются к `127.0.0.1`, поэтому можно средствами iptables запретить входящие -на `127.0.0.1` не с интерфейса lo, либо повесить tpws на любой другой IP из из `127.0.0.0/8`, например на `127.0.0.127`, +на `127.0.0.1` не с интерфейса lo, либо повесить tpws на любой другой IP из `127.0.0.0/8`, например на `127.0.0.127`, и разрешить входящие не с lo только на этот IP. ``` @@ -1322,10 +1322,11 @@ LISTS_RELOAD=- отключает перезагрузку листов. При режимах фильтрации `MODE_FILTER=hostlist` или `MODE_FILTER=autohostlist` система запуска передает **nfqws** или **tpws** все листы, файлы которых присутствуют. Передача происходит через замену маркеров `` и `` на реальные параметры `--hostlist`, `--hostlist-exclude`, `--hostlist-auto`. Если вдруг листы include присутствуют, но все они пустые, то работа аналогична отсутствию include листа. -Файл есть, но не смотря на это дурится все, кроме exclude. +Файл есть, но несмотря на это дурится все, кроме exclude. Если вам нужен именно такой режим - не обязательно удалять `zapret-hosts-users.txt`. Достаточно сделать его пустым. Поддомены учитываются автоматически. Например, строчка "ru" вносит в список "*.ru". Строчка "*.ru" в списке не сработает. +Можно использовать символ `^` в начале хоста, чтобы отказаться от автоматического учета поддоменов. Список доменов РКН может быть получен скриптами ``` @@ -1359,7 +1360,7 @@ tpws и nfqws решают нужно ли применять дурение в Крайне рекомендовано использовать ограничитель `connbytes`, чтобы **nfqws** не обрабатывал гигабайты. По этой же причине не рекомендуется использование режима на BSD системах. Там нет фильтра `connbytes`. -На linux системах при использовании nfqws и фильтра connbytes может понадобится : +На linux системах при использовании nfqws и фильтра connbytes может понадобиться : `sysctl net.netfilter.nf_conntrack_tcp_be_liberal=1` Было замечено, что некоторые DPI в России возвращают RST с неверным ACK. Это принимается tcp/ip стеком linux, но через раз приобретает статус INVALID в conntrack. Поэтому правила с `connbytes` срабатывают @@ -1374,7 +1375,7 @@ linux, но через раз приобретает статус INVALID в con свое клиенту. Применяется нечасто, поскольку броузеры на такое ругаются. **nfqws** и **tpws** могут сечь варианты 1-3, 4 они не распознают. -Всилу специфики работы с отдельными пакетами или с TCP каналом tpws и nfqws распознают эти ситуации +В силу специфики работы с отдельными пакетами или с TCP каналом tpws и nfqws распознают эти ситуации по-разному. Что считается ситуацией, похожей на блокировку : 1) **nfqws** Несколько ретрансмиссий первого запроса в TCP сеансе, в котором имеется host. @@ -1400,7 +1401,7 @@ linux, но через раз приобретает статус INVALID в con Если сайт не ведет себя как заблокированный, значит обход применен не будет. В противном случае терять все равно нечего. Однако, могут быть временные сбои сервера, приводящие к ситуации, аналогичной блокировке. -Могут происходит ложные срабатывания. Если такое произошло, стратегия может начать ломать +Могут происходить ложные срабатывания. Если такое произошло, стратегия может начать ломать незаблокированный сайт. Эту ситуацию, увы, придется вам контролировать вручную. Заносите такие домены в `ipset/zapret-hosts-user-exclude.txt`, чтобы избежать повторения. Чтобы впоследствии разобраться почему домен был занесен в лист, можно включить `autohostlist debug log`. @@ -1747,7 +1748,7 @@ DISABLE_IPV6=1 ``` Количество потоков для многопоточного DNS ресолвера mdig (1..100). -Чем их больше, тем быстрее, но не обидется ли на долбежку ваш DNS сервер?\ +Чем их больше, тем быстрее, но не обидится ли на долбежку ваш DNS сервер?\ `MDIG_THREADS=30` Место для хранения временных файлов. При скачивании огромных реестров в `/tmp` места может не хватить. @@ -1901,7 +1902,7 @@ nfset-ы принадлежат только одной таблице, след custom скрипты - это маленькие shell программы, управляющие нестандартными режимами применения zapret или частными случаями, которые не могут быть интегрированы в основную часть без загромождения и замусоривания кода. -Для применеия custom следует помещать файлы в следующие директории в зависимости от вашей системы: +Для применения custom следует помещать файлы в следующие директории в зависимости от вашей системы: ``` /opt/zapret/init.d/sysv/custom.d /opt/zapret/init.d/openwrt/custom.d @@ -1991,7 +1992,7 @@ zapret_custom_firewall_nft поднимает правила nftables. Под OpenWrt все уже сразу готово для использования системы в качестве роутера. Имена интерфейсов WAN и LAN известны из настроек системы. Под другими системами роутер вы настраиваете самостоятельно. Инсталлятор в это не вмешивается. -инсталлятор в зависимости от выбранного режима может спросить LAN и WAN интерфейсы. +Инсталлятор в зависимости от выбранного режима может спросить LAN и WAN интерфейсы. Нужно понимать, что заворот проходящего трафика на **tpws** в прозрачном режиме происходит до выполнения маршрутизации, следовательно возможна фильтрация по LAN и невозможна по WAN. Решение о завороте на **tpws** локального исходящего трафика принимается после выполнения маршрутизации, @@ -2172,7 +2173,7 @@ Wifi сеть - обычно `wlan0`. tpws работает обычным образом. -`nfqueue` поломан, можно собрать фиксящий модуль https://github.com/im-0/unfuck-nfqueue-on-e3372h, +`nfqueue` поломан, можно собрать фиксящий модуль https://github.com/im-0/unfuck-nfqueue-on-e3372h, используя исходники с huawei open source. Исходники содержат тулчейн и полусобирающееся, неактуальное ядро. Конфиг можно взять с рабочего модема из `/proc/config.gz`. С помощью этих исходников умельцы могут собрать модуль `unfuck_nfqueue.ko`. @@ -2225,10 +2226,10 @@ curl: (7) Failed to connect to www.ru port 80: Host is unreachable ## Другие прошивки -Для статических бинариков не имеет значения на чем они запущены: PC, android, приставка, роутер, любой другой девайс. +Для статических бинарников не имеет значения на чем они запущены: PC, android, приставка, роутер, любой другой девайс. Подойдет любая прошивка, дистрибутив linux. Статические бинарники запустятся на всем. Им нужно только ядро с необходимыми опциями сборки или модулями. -Но кроме бинариков в проекте используются еще и скрипты, в которых задействуются некоторые +Но кроме бинарников в проекте используются еще и скрипты, в которых задействуются некоторые стандартные программы. Основные причины почему нельзя просто так взять и установить эту систему на что угодно: @@ -2266,14 +2267,14 @@ entware содержит репозиторий user-mode компонент, к _Подробное описание настроек для других прошивок выходит за рамки данного проекта._ OpenWrt является одной из немногих относительно полноценных linux систем для embedded devices. -Она характеризуется следующими вещами, которые и послужили основой выбора именно этой прошивк: +Она характеризуется следующими вещами, которые и послужили основой выбора именно этой прошивки: * полный root доступ к девайсу через shell. на заводских прошивках чаще всего отсутствует, на многих альтернативных есть * корень r/w. это практически уникальная особенность OpenWrt. заводские и большинство альтернативных прошивок построены на базе squashfs root (r/o), а конфигурация хранится в специально отформатированной области встроенной памяти, называемой nvram. не имеющие r/w корня системы сильно кастрированы. они не имеют возможности доустановки ПО из репозитория без специальных вывертов и заточены в основном на чуть более продвинутого, чем обычно, пользователя и управление имеющимся функционалом через веб интерфейс, - но функционал фиксированно ограничен. альтернативные прошивки как правило могут монтировать r/w раздел + но функционал фиксированно ограничен. альтернативные прошивки, как правило, могут монтировать r/w раздел в какую-то область файловой системы, заводские обычно могут монтировать лишь флэшки, подключенные к USB, и не факт, что есть поддержка unix файловых системы. может быть поддержка только fat и ntfs. * возможность выноса корневой файловой системы на внешний носитель (extroot) или создания на нем оверлея (overlay)