Zapret: what's new

Возрождаем кастом для дискорда.
Раньше это был 50-discord, который работал только по media составляющей на диапазоне ip дискорда и портах udp 50000-50099.
Сейчас это 50-discord-media. Он так же работает только по media составляющей, на портах udp 50000-50099 (переназначается в переменной), но вместо ipset-а используется сигнатурное распознавание протокола discord media. По stun он не работает. Нужно использовать дополнительно 50-stun4all, который распознает stun на всех портах и всех ip.
Совместно эти 2 скрипта позволяют избавиться от полного перехвата портов udp 50000-50099, оставляя логику сигнатурного анализа в ядре.
Вариант с полным перехватом портов на linux тоже вообщем то проблем не имеет, тк используется ограничитель коннбайтс (если вы, конечно, не подняли keepalive версию перехвата). Если вдруг пошла выгрузка торрента по этим портам, он перехватит лишь начальные пакеты.

Если кратко : останавливаем zapret, убираем из NFQWS_PORTS_UDP 50000-50099, убираем стратегию --filter-udp=50000-50099, копируем 50-discord-media и 50-stun4all в custom.d, перезапускаем.
Заодно это может решить проблему запрета звонков в воцапе и телеге.
Если не решает, можно поиграться репитами в стратегии.

Почти все меняют стратегию в скрипте. Это просто и понятно.
NFQWS_OPT_DESYNC_DISCORD_MEDIA="${NFQWS_OPT_DESYNC_DISCORD_MEDIA:---dpi-desync=fake}"
Но задумывалось это для иного. Чтобы вы не трогали сам скрипт, а определили переменную в config файле. Конструкция шелл ${var:-default} выдает саму переменную, если она не пустая, а иначе значение default. Если вы ее определите в config, то присваивание дефолтного значения не сработает, останется ваше.

В init.d/windivert.filter.examples написаны готовые windivert фильтры для протоколов discord media, stun, wireguard.
Цель этих фильтров - отсекать полезную нагрузку в режиме ядра, не насилуя процессор перенаправлением целого потока на winws.
Задействуются через winws --wf-raw=@filename.
Однако, язык фильтров windivert не содержит операций с битовыми полями, сдвигов и побитовой логики.
Поэтому фильтры получились более слабыми, способными передавать неправильную нагрузку.
Дофильтрация производится силами winws. Впрочем, лишь немногие проверки не вписались, пропуск более того, что фильтранул бы winws, маловероятен.

Пример инстанса для пробития медиапотоков в discord :
winws --wf-raw=@windivert.discord_media+stun.txt --filter-l7=stun,discord --dpi-desync=fake

В zapret-win-bundle из preset_russia убран discord. Теперь он + stun на все порты идут в preset_discord_media.cmd. В service_install.cmd убран discord из основного инстанса winws1. Настроены параметры для дополнительного инстанса winws2 discord+stun

Для wireguard готовый батник preset_wireguard.cmd

Сразу же возникли умельцы - комбинаторы параметров.
Эта комбинаторика скорее всего приведет к полной ерунде.
wf-raw и wf-tcp/udp мешать нельзя. они не будут вместе работать, т.к. по сути противоречат друг другу. wf-tcp/udp создают фильтр внутри программы, wf-raw берет готовый фильтр извне. --wf-raw имеет приоритет, wf-tcp/udp им замещаются.
Создание единого фильтра возможно, если вы его руками сконструируете и подсунете в --wf-raw.
Потом вам нужно будет его сопровождать, редактировать. Считайте, что это задача равносильна написанию фильтра для wireshark или tcpdump. Синтаксис windivert был наследован от них.
Но с таким уровнем понимания вам этого не осилить

В ядре linux 6.17 появилась опция.

Во многих дистрибутивах она может быть not set.
Это значит, что legacy iptables работать не будут. Не будет модулей ядра.
Если у вас iptables-legacy установлено как альтернатива iptables, а запрет настроен на iptables, то в этом случае запрет до апгрейда ядра работает, а после перестает.
Если попробовать руками сделать iptables, вываливается ошибка. В systemctl status zapret тоже может быть ошибка.

Решение - использовать nftables или хотя бы iptables-nft.
В первом случае поменять FWTYPE в /opt/zapret/config, во втором - установить альтернативу iptables в системе на iptables-nft

Некоторые ругаются на то, что пустые хостлисты равнозначны их отсутствию.

Какой у этого юз кейз ?

Конечно, в процессе разработки были и неоднозначные решения, которые вроде хотелось бы и переделать, но это сломает уже устоявшуюся схему и конфиги.

Конкретно по этому случаю. Хостлисты - автоматически перечитываемые по изменению файлы.

Скрипты запуска предполагают наличие /opt/zapret/ipset/{zapret-hosts-user.txt,zapret-hosts-user-exclude.txt}.

Как сделать так, чтобы можно было не удаляя файлы переключаться между режимами черного и белого списков ? Сейчас этот вопрос решается именно этой “багофичей”. Если вам нужны только исключения, вы оставляете zapret-hosts-user.txt пустым, что равнозначно его НЕуказанию в командной строке nfqws/tpws. Но если вы не перезапуская инстанс туда что-то внесете или оттуда вынесити , изменения подхватятся автоматом, режим белого/черного списка переключится при переключении между состояниями “zapret-hosts-user.txt пуст” и “zapret-hosts-user.txt не пуст”. Если файл удалять, то кто потом знает какое имя правильное и где он должен быть ? Или придется городить еще настройки в конфиге типа учитывать один файл, не учитывать другой. Изменение потребует перезапуска инстанса.

Другой момент состоит в том, что nfqws/tpws при запуске требуют наличие всех указанных листов. Они не умеют подразумевать и ожидать появление файла, если вдруг его захотят создать. Скрипты добавляют в командную строку только листы, файлы которых есть. Если потом файл добавят, то nfqws/tpws о нем ничего не знают. Потребуется перезапуск инстанса. Если файл удалят в процессе, то список в памяти останется, он не очистится автоматом. nfqws/tpws будут пытаться проверять наличие файла, и при его появлении вновь его перечитают.

Если даже сделать функцию ожидания файла, то это чревато разными очепятками. Параметр принимается, в имени файла пропущена буква, создают файл, ничего не работает. Сейчас же идет сразу отлуп. Как по критерию наличия файла, так и по правам доступа. Считаю, что сразу тыкать носом в ошибки - это лучшая стратегия, чем куча криво настроенных чайниками инстансов, которые волшебно-шамански работают, но по сути полны ерунды. Такая ерунда случалась, когда не было проверки на права доступа под сброшенными привилегиями сразу. У людей работало, но при попытке перечитать реально были ошибки, функция перечитки не работала. При апгрейде, когда была сделана проверка на права, у них “просто перестал работать zapret”. Догадались почему ? Это тычок носом, который они не поняли, в проблему, которая была и раньше, но теперь прога отказалась работать с этой проблемой.

Напоминаю, что zapret состоит из ядра - демонов nfqws и tpws, и они НИЧЕГО не знают о файле config. Они работают только с командной строкой. Скрипты запуска суть обертка, чтобы выставить нужные ip/nf tables и поднять nfqws/tpws с нужными параметрами.

Сделано так, как сделано. Если вы знаете этот момент и делаете для себя, вам не составит труда при опустошении списка добавить туда бредостроку, чтобы он оставался не пустым. Сборщикам тоже по умолчанию стоит это делать. Добавьте “строку_не_удалять” в файл, если он изначально ожидается пустым, но требует функционала включающего списка.

Теперь отвечу почему в автохостлисте “сделана затычка”, которая автоматически делает его непустым.
Да потому что профиль с авто хост листом приоритетный, он выбирается вне зависимости от включения текущего домена в хост лист. Автолист работает как по уже включенным доменам, так и по невключенным. Для первых производится дурение, для вторых - тестирование на предмет ситуаций, похожих на блокировку. Если же домен в exclude листе того же профиля, то не делается ничего, и поиск профиля дальше не продолжается. Автолист профиль - это всегда “приехали” для всего, что подпадет под другие фильтры, не связанные с хостлистами.
Изначально автохостлист пуст, и это не означает отсутствие автохостлиста.

Оказалось, что @ih payload expressions в nft (inner header), используемые в некоторых кастомах, не работают на ядре 5.10, которое в openwrt 22, и работают на ядре 5.15, которое в openwrt 23.

userspace прога nft поддерживает негласно @ih, начиная с 1.0.1 (в openwrt 22 - 1.0.2), гласно - с 1.0.6.

Замена nft на 1.1.1 на openwrt 22 не помогает. Возвращается ошибка “not supported”, которая, очевидно, лезет с ядра. Если же запустить nft 1.0.2 на новом ядре, @ih работает нормально.

Минимальная версия LTS убунты, на которой все сразу из коробки работает, 22.04 LTS

На 20.04 можно поискать в репах обновы ядра, а nft собрать с исходников. Или откатиться на iptables

Владельцам openwrt 22 рекомендуется апгрейд

Не касается zapret, но все же может быть полезным.
Оказывается, в nftables можно не только проверять байты пейлоада через raw payload expressions, а еще их менять.
Это можно использовать для целей, аналогичных этому продукту

Можно уродовать протокол, чтобы DPI его не сек.
Например, wireguard передает в handshake 0x01000000
На выход делаем
udp length 156 @ih,0,32 0x01000000 @ih,0,32 set 0xaabbccdd
На вход
udp length 156 @ih,0,32 0xaabbccdd @ih,0,32 set 0x01000000

И получается что-то вроде амнезии-wg-лайт чисто на nftables без софта.
Для связки между внешними IP адресами можно уродовать ip protocol number, как это делает ipobfs.

К следующей версии расширяются возможности встроенного конструктора windivert фильтров.
Можно использовать множественные параметры --wf-raw-part, содержащие куски windivert фильтров, которые будут собраны конструктором в итоговый фильтр по следующей схеме :

PROLOG and GLOBAL_FILTER and (PART1 or PART2 or ... or PARTN or TCPUDP) and LAN_FILTER

  • PROLOG - это технический момент. отсекает impostor и loopback.
  • GLOBAL_FILTER - реализация --wf-iface и --wf-l3
  • PART1 .. PARTN - содержимое всех --wf-raw-part
  • TCPUDP - то, что конструктор собирает на основе --wf-tcp,--wf-udp, учитывая наличие autohostlist и параметров --dup и --orig-ttl. При наличии автолистов где-либо в профилях автоматически перехватывается часть входящего трафика, содержащая RST и HTTP REDIRECT. При наличии dup или orig отключается механизм отбрасывания пустых исходящих ack пакетов, который нужен для значительной экономии CPU.
  • LAN_FILTER - опциональная отфильтровка не-глобальных ipv4 и ipv6 адресов. Таких, как 192.168.x.x. Включена по умолчанию. Может быть выключена параметром --wf-filter-lan=0

Зачем это надо ? Чтобы вы не запутались в полных фильтрах на 2-3 кб и чтобы не пришлось их потом сопровождать собственными силами. Чтобы не запускать несколько инстансов winws, когда можно легко обойтись одним.

Пример --wf-raw-part, выделяющий пакеты stun :

  outbound and
  udp.PayloadLength>=20 and
  udp.Payload32[1]=0x2112A442 and udp.Payload[0]<0x40

Фильтрация windivert производится в ядре. Это несравнимо легче по ресурсам, чем перенаправлять пакеты в пространство user mode, чтобы winws принимал решение. Поэтому пользуйтесь по максимуму возможностями windivert.
Например, если вам нужно дурить wireguard на все порты, вам придется перенаправить все порты на winws. Или же написать windivert фильтр, который отсечет wireguard по содержимому пакета.
Разница в нагрузке на процессор колоссальна. В первом случае - до 100% одного ядра cpu в зависимости от обьема исходящего udp трафика (привет, торрент и uTP), во втором - близко к 0.
Кроме нагрузки на процессор еще можете порезать себе скорость, тк одно ядро не будет справляться с обработкой вашего гигабитного интернета. А на старых ноутах еще и получите самолетный вой системы охлаждения, приводящий к ее износу.

Новая вариация fakedsplit - hostfakesplit.
Использует фиксированные маркеры host,endhost. Применимо к протоколам, имеющим хост , то есть tls и http.
Если хост отсутствует или уже разрезан по пакетам (не повезло с kyber), дурение не применяется.
Опциональный дополнительные маркер, не включаемый по умолчанию, - midhost (--dpi-desync-hostfakesplit-midhost), который должен быть между host и endhost, иначе он не применяется.
Порядок отправки :

  1. Оригинал до host
  2. Фейк длиной endhost-host, генерируемый на лету рандомно каждый раз. Представляет собой набор символов a-z,0-9. В случае длины более 7 ставится точка за 3 символа до конца, чтобы имитировать TLD. Примеры : a8zjai, jja94hva.cjh.
  3. Оригинал на тех же позициях, что и 2. Если работает midhost маркер, то режется на 2 части, иначе отсылается полностью без разреза.
  4. Повтор фейка
  5. Оригинал после host

В результате испытаний выяснено, что на большинстве доменов без специальных правил блокировки, при отсутствии разреза midhost , позволяет побороть защиту от TTL и md5sig, а так же открыть TLS1.2 без отдельного фейка.
Разрез по midhost не дает DPI отстать от потока , он проверяет ответ сервера, что ломает TLS 1.2
На googlevideo работает на TLS1.2 с разрезом midsld (тк DPI сечет подстроку “googlevideo” специальным правилом на диапазонах IP гугла), но не срабатывает обход защиты от TTL , зато срабатыват md5sig.

Дебаг логи применений :

sending hostfakesplit before_host part 0-114 len=115 : 16 03 01 00 E1 01 00 00 DD 03 03 AE 67 62 84 58 F1 D0 25 9F CB E1 8F 54 1B A5 AF F8 2B 56 C3 A2 ... : ............gb.X..%....T....+V.. 
generated fake host: 4my1gssix.mie
sending hostfakesplit fake host 115-127 len=13 : 34 6D 79 31 67 73 73 69 78 2E 6D 69 65 : 4my1gssix.mie
sending hostfakesplit real host 115-127 len=13 : 72 75 74 72 61 63 6B 65 72 2E 6F 72 67 : rutracker.org
sending hostfakesplit fake(2) host 115-127 len=13 : 34 6D 79 31 67 73 73 69 78 2E 6D 69 65 : 4my1gssix.mie
sending hostfakesplit after_host part 128-229 len=102 : 00 0B 00 04 03 00 01 02 00 0A 00 0C 00 0A 00 1D 00 17 00 1E 00 19 00 18 00 10 00 0E 00 0C 02 68 ... : ...............................h


sending hostfakesplit before_host part 0-114 len=115 : 16 03 01 00 E1 01 00 00 DD 03 03 5C A8 D1 C9 FA C2 5B B4 77 A8 73 1B B9 FE 70 59 05 67 91 86 E2 ... : ...........\.....[.w.s...pY.g...
generated fake host: zo635d35d.zlq
sending hostfakesplit fake host 115-127 len=13 : 7A 6F 36 33 35 64 33 35 64 2E 7A 6C 71 : zo635d35d.zlq
sending hostfakesplit real host part 1 115-118 len=4 : 72 75 74 72 : rutr
sending hostfakesplit real host part 2 119-127 len=9 : 61 63 6B 65 72 2E 6F 72 67 : acker.org
sending hostfakesplit fake(2) host 115-127 len=13 : 7A 6F 36 33 35 64 33 35 64 2E 7A 6C 71 : zo635d35d.zlq
sending hostfakesplit after_host part 128-229 len=102 : 00 0B 00 04 03 00 01 02 00 0A 00 0C 00 0A 00 1D 00 17 00 1E 00 19 00 18 00 10 00 0E 00 0C 02 68 ... : ...............................h

Небольшое дополнение к предыдущему.

Можно переопределить шаблон генерации с помощью --dpi-desync-hostfakesplit-mod=host=<hostname>. В последнем случае справа всегда будет указанный hostname.
Слева он будет дополнен до размера оригинального хоста как поддомен со случайными символами. Пример : “www.networksolutions.com” → “h8xmdba4tv7a8.google.com”.
Если размер оригинального хоста меньше шаблона, шаблон будет порезан : “habr.com” → “ogle.com”.
Если размер оригинального хоста больше шаблона на 1, получится инвалидный пустой поддомен : “www.xxx.com” => “.google.com”.
Поэтому стоит использовать максимально короткие хосты из разрешенных : “ya.ru”, “vk.com”.

Еще одно дополнение к hostfakesplit.
Режим --dpi-desync-hostfakesplit-mod=altorder=1 меняет порядок сегментов на такой, чтобы DPI получил оригинал запроса с подмененным хостом, состоящий из последовательных сегментов.

оригинал до хоста, фейк хоста, оригинал после хоста, оригинал хоста (+опционально нарезка маркером midhost).

Вариации fakedsplit с разным количеством фейков. некоторые фейки могут ломать обход. особенно РКНовцы не любят фейки, идущие первыми

  • fakedsplit (altorder=0). нарезаем запрос на 2 части, обрамляя каждую часть фейками : фейк 1-й части, 1 часть, фейк 1-й части, фейк 2-й части, 2 часть, фейк 2-й части
  • fakedsplit (altorder=1). меньше фейков : 1 часть, фейк 1-й части, фейк 2-й части, 2 часть, фейк 2-й части
  • fakedsplit (altorder=2). меньше фейков : 1 часть, фейк 2-й части, 2 часть, фейк 2-й части
  • fakedsplit (altorder=3). меньше фейков : 1 часть, фейк 2-й части, 2 часть

Режим задается в параметре --dpi-desync-fakedsplit-mod=altorder=N

--dpi-desync-fake-tcp-mod=seq применяет ко множественным tcp фейкам увеличение sequence. Как будто это один фейк, порезанный на части tcp сегментацией.

Дополнительная фишка --dpi-desync-fake-tls=!+offset .
Означает взять стандартный фейк, применить к нему fake-tls-mod, отрезать offset байт с начала.
Типичный способ применения --dpi-desync-fake-tls=0x1603 --dpi-desync-fake-tls=!+2 --dpi-desync-tls-mod=rnd,rndsni,dupsid --dpi-desync-fake-tcp-mod=seq
Можно так же взять tls с kyber, порезать самостоятельно его на 2 файла, чтобы каждый вместе с хедерами влезал в MTU. Или же просто снять с шарка содержимое 2-3 пакетов kyber от броузера и каждый записать в файл. Таким образом реализуется отсылка kyber tls fake. Правда, при этом не будет работать fake-tls-mod. Фейк должен быть pre-composed.

Многие параметры, загружающие двоичные данные из файлов, поддерживают загрузку из hex-строки или из файла. hex строка начинается с “0x”. Имя файла можно писать как есть или использовать префикс “@”. Если перед префиксом “@” указано “+<число>”, то это означает смещение полезных данных внутри файла. Файл может загружаться целиком с нулевой позиции, к нему могут применяться модификации, требующие полного файла (TLS), но передача пойдет с позиции offset. offset должен быть меньше длины файла. Если к блоку данных применяется мод, который уменьшает размер данных, и offset окажется не меньше новой длины данных, будет ошибка.

решил отказаться от preset_russia в bundle
больше никаких одно кликов
тк пошло противодействие в реальном времени

После некоторого перерыва добил, наконец, порядок ip_id во всех вариантах сплита.
Теперь они учитывают и много-пакетные запросы, чтобы имитировать последовательный порядок между пакетами и сплит-частями, либо обратный порядок disorder частей внутри группы.

fakedsplit и fakeddisorder претерпели изменения по умолчанию. Добавилось обрамление фейками частей многопакетных запросов, где нет сплит-позиций. Тем самым точнее натягиваются кастомные паттерны на кибер-TLS. Паттерн для fakedsplit теперь ограничен 32 кб, что позволяет туда загонять и кибер-фейки TLS. Они должны корректно размазаться по кибер-оригиналу, учитывая смещения в оригинальной и искусственной TCP сегментации.

--dpi-desync-fakedsplit-mod=altorder=N работает на fakedsplit и fakeddisorder
Младшие 2 бита определяют вариант фейкования части, где есть сплит-позиция. Биты 3..4 определяют вариант фейкования части, где сплит-позиции нет. Для первого есть 4 варианта - 0,1,2,3 , для второго 3 варианта - 0,1,2 (умножается на 8 и складывается с первым числом).
Например, для сплит-части вариант 1, для части без сплита - вариант 2. Получаем 1+2*8 = 17.

Спойлер

Режимы altorder для fakedsplit для части многопакетного запроса, где есть сплит-позиция :

  • altorder=0. фейк 1-й части, 1 часть, фейк 1-й части, фейк 2-й части, 2 часть, фейк 2-й части
  • altorder=1. 1 часть, фейк 1-й части, фейк 2-й части, 2 часть, фейк 2-й части
  • altorder=2. 1 часть, фейк 2-й части, 2 часть, фейк 2-й части
  • altorder=3. 1 часть, фейк 2-й части, 2 часть

Режимы altorder для fakeddisorder для части многопакетного запроса, где есть сплит-позиция :

  • altorder=0. фейк 2-й части, 2 часть, фейк 2-й части, фейк 1-й части, 1 часть, фейк 1-й части
  • altorder=1. 2 часть, фейк 2-й части, фейк 1-й части, 1 часть, фейк 1-й части
  • altorder=2. 2 часть, фейк 1-й части, 1 часть, фейк 1-й части
  • altorder=3. 2 часть, фейк 1-й части, 1 часть

Режимы altorder для fakedsplit и fakeddisorder для части многопакетного запроса, где нет сплит-позиции :

  • altorder=0. фейк, оригинал, фейк
  • altorder=8. оригинал, фейк
  • altorder=16. оригинал

Итоговое число altorder=N вычисляется как сумма чисел из этих двух групп. По умолчанию altorder=0

Как и обещал, preset_russia покинул win bundle.
Остался preset_example.cmd на его основе.
Его цель - обьяснить как пишутся батники для винды для запуска winws, а не дать однокнопочное лекарство. Лекарство вы ищите сами.

start "zapret: http,https,quic" /min "%~dp0winws.exe" ^
--wf-tcp=80,443  ^
--wf-raw-part=@"%~dp0windivert.filter\windivert_part.discord_media.txt" ^
--wf-raw-part=@"%~dp0windivert.filter\windivert_part.stun.txt" ^
--wf-raw-part=@"%~dp0windivert.filter\windivert_part.wireguard.txt" ^
--wf-raw-part=@"%~dp0windivert.filter\windivert_part.quic_initial_ietf.txt" ^
--filter-tcp=80 --dpi-desync=fake,fakedsplit --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --new ^
--filter-tcp=443 --hostlist="%~dp0files\list-youtube.txt" --dpi-desync=fake,multidisorder --dpi-desync-split-pos=1,midsld --dpi-desync-repeats=11 --dpi-desync-fooling=md5sig --dpi-desync-fake-tls-mod=rnd,dupsid,sni=www.google.com --new ^
--filter-tcp=443 --dpi-desync=fake,multidisorder --dpi-desync-split-pos=midsld --dpi-desync-repeats=6 --dpi-desync-fooling=badseq,md5sig --new ^
--filter-l7=quic --hostlist="%~dp0files\list-youtube.txt" --dpi-desync=fake --dpi-desync-repeats=11 --dpi-desync-fake-quic="%~dp0files\quic_initial_www_google_com.bin" --new ^
--filter-l7=quic --dpi-desync=fake --dpi-desync-repeats=11

Что здесь примечательного. Мы одним инстансом дурим как обычный tcp веб, так и wireguard на любых портах, и stun на любых портах, и discord media на портах 50000..50099, и даже quic на любых портах. При этом произошел отказ от полного перехвата udp портов. А это значит не будет лишней нагрузки на проц. Для этого и был создан --wr-raw-part.

К сожалению, в 72 версии сломался обход googlevideo.com со стратегиями fakedsplit потому, что измененная схема вычисления ip_id в ipv4 перестала проходить довольно старую защиту googlevideo.
Там секут слово “googlevideo” в отдельных пакетах и повторяющиеся ненулевые ip_id.
В 72.1 (уже в исходниках) есть параметр --ip-id=seq|seqgroup|rnd|zero.

  • seq - берется ip_id текущего пакета. далее каждый последующий (фейки, реальные сегменты) увеличивают или уменьшают значение на 1. multidisorder прибавляет к текущему значению ip_id количество частей, потом с каждой частью отнимает 1. В старых версиях по умолчанию было для BSD
  • seqgroup - то же самое, но если идет подмешивание фейков того же размера, что и оригинал, то оригинал и фейки имеют одинаковый ip_id. Цель была сделать фейки и не фейки как можно более похожими, чтобы нельзя было понять что есть фейк. Эта схема была единственной в 72, и она не пошла для googlevideo.
  • rnd - каждый генерируемый пакет имеет случайный ненулевой ip_id
  • zero - всегда устанавливать нулевое значение. linux и bsd отправят 0, windows сама присвоит увеличивающийся ip_id. эта схема была по умолчанию в более старых версиях для linux и windows.

в 72.1 значение по умолчанию - seq. единообразно для всех систем, гуглвидео пробивает на fakedsplit

--ip-id относится к профилю, это не глобальный параметр, то есть можно в каждой стратегии задавать свою схему генерации ip_id

гуглвидео пробивают все варианты, кроме seqgroup

Что новенького в 72.2

  • --wssize-forced-cutoff=0 . говорят, что иногда требуется дурить даже после client hello, ограничиваясь лишь cutoff или connbytes. Отменяет forced wssize cutoff при получении http request или tls client hello.
  • Манипуляции tcp флагами в desync,dup и orig. --dpi-desync-tcp-flags-set, --dpi-desync-tcp-flags-unset, --orig-tcp-flags-set, --orig-tcp-flags-unset, --dup-tcp-flags-set , --dup-tcp-flags-unset. Можно поиграться и получить что-нибудь интересненькое. Параметры берут десятичное или 0xHEX число 12 бит или список названий флагов через запятую. Старшие 4 бита относятся к полю reserved, в которое уже успели поместить один из флагов - AE (Accurate ECN). Остальные 3 пока не задействованы. В списке они значатся как R1,R2,R3 от младшего к старшему. Полный список флагов : FIN,SYN,RST,PSH,ACK,URG,ECE,CWR,AE,R1,R2,R3 . Не стоит забывать, что данные манипуляции могут сломать NAT, особенно на базе linux. При использовании NAT для применения на проходящий трафик могут потребоваться nftables.
  • --dup-ip-id=same|zero|seq|rnd. same - оставить тем же самым (по умолчанию), остальное как в --ip-id

После раздумий пришел к выводу, что буду переводить всю обработку стратегий на LUA. Все это множество параметров desync, orig, dup, methodeol и прочее уходит, в C логике остается управление профилями, включая сверку листов, коннтрак, реассемблинг tls, декрипт и реассемблинг quic, некоторые хелперы. Чтобы в LUA пошел только сам алгоритм плевания пакетами в нужном качестве, количестве, и только когда нужно, не дергая интерпретатор лишний раз в целях экономии ЦПУ.
Это пойдет в проект zapret2, текущий останется как есть.
Чтобы что-то там послать, сплитнуть, вы будете писать небольшую прогу на LUA, работающую с представлениями ip , tcp, udp хедеров в виде структур (таблиц lua) и пейлоадами в формате string (binary blob). Сами будете увеличивать сиквенсы, добавлять md5 тцп опшины, ипв6 экстенжин хедеры и тому подобное.
Операции отсылки, дополнительной сегментации для вписывание в mss, ip фрагментации будут вынесены в функции на C, которые можно вызывать из lua.
Цель - чтобы юзер сосредоточился на написании программы-стратегии без заботы о низкоуровневых деталях, тем не менее имея весь арсенал несложного, но полноценного языка программирования для написания сколько угодно простых или сложных вариантов, без необходимости компиляции в машинный код. Прога должна сказать запрету что и как посылать, а посылать будет он сам.
Конечно, для чайников никак и никуда не зайдет, но зато свобода манипуляций возрастает многократно, что и требуется в новых условиях файн-тунед воздействий

Небольшой ситуативный фикс для блокчека на тему 16 кб блоков.
Изначально блокчек всегда применял метод GET для http и HEAD для https.
Потому что DPI видит что внутри http, и может не реагировать на метод HEAD.
А под https DPI не может видеть что внутри.
HEAD убирает тело ответа, оставляя лишь заголовки. Это экономит ресурсы сервера, ресурсы на передачу, возможно, большого ответа.
И это правильно, такое поведение остается по умолчанию.
Но иногда DPI рубит соединение через какое-то количество пакетов. Тогда надо дергать полноценный GET, чтобы сервак вернул достаточно длинный ответ. Причем он это может сделать, а может нет. Не все сервера отдают длинный ответ на главной странице. Зависит от сайта.
Поэтому сделано 2 нововведения.

  1. Допускается использовать вместо доменов домен с URI. Было rutracker.org, стало rutracker.org/forum/index.php. Здесь вы должны сами подогнать такой URL, чтобы возвращался интересующий вас ответ. Если такой ответ возвращает главная страница /, URI указывать не нужно.
  2. Но по умолчанию даже при наличии URI будет дергаться HEAD под https. Чтобы это изменить, нужно задать переменную CURL_HTTPS_GET=1.

Пример : CURL_HTTPS_GET=1 DOMAINS="rutracker.org/forum/index.php" ./blockcheck.sh

Однако, в случае с 16 кб блоком обычно имеет место белый список по SNI и/или протоколам. Поэтому голый блокчек с такими опциями может вообще ничего не выдать. Все будет с ошибкой. Нужно подсовывать дополнительные опции (конкретные фейки, SNI, …) через EXTRA параметры.
Для контроля правильности запроса можно использовать CURL_CMD=1

Нововведение пока в исходниках. Для применения к релизу скопировать common/base.sh и blockcheck.sh. Бандл под винду уже обновлен.