- [`tpws`](#tpws) - [`winws`](#winws) - [Windows 7 и `windivert`](#windows-7-и-windivert) - [`blockcheck`](#blockcheck) - [Автозапуск `winws`](#автозапуск-winws) - [`zapret-win-bundle`](#zapret-win-bundle) ## `tpws` Запуск `tpws` возможен только в Linux варианте под WSL. Нативного варианта под Windows нет, поскольку он использует epoll, которого под Windows не существует. `tpws` в режиме SOCKS можно запускать под более-менее современными билдами Windows 10 и Windows Server с установленным WSL. Совсем не обязательно устанавливать дистрибутив Ubuntu, как вам напишут почти в каждой статье про WSL, которую вы найдете в сети. `tpws` - статический бинарник, ему дистрибутив не нужен. Установить WSL: `dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all` Скопировать на целевую систему: `binaries/x86_64/tpws_wsl.tgz`. Выполнить: `wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz` Запустить: `wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <параметры_дурения>` Прописать SOCKS `127.0.0.1:1080` в броузер или другую программу. Удаление: `wsl --unregister tpws` Проверено на Windows 10 build 19041 (20.04). Не работают функции `--oob` и `--mss` из-за ограничений реализации WSL. `--disorder` не работает из-за особенностей TCP/IP стека Windows. Может не срабатывать детект RST в `autohostlist`. WSL может глючить со `splice`, приводя к зацикливанию процесса. Может потребоваться `--nosplice`. Не поддерживается TCP user timeout. Чтобы избавиться от сообщений об ошибке, добавляйте `--local-tcp-user-timeout=0 --remote-tcp-user-timeout=0`. Эти сообщения только информативные, на работу они не влияют. ## `winws` Это вариант пакетного фильтра `nfqws` для Windows, построенный на базе `windivert`. Все функции работоспособны, однако функционал `ipset` отсутствует. Фильтры по большому количеству IP адресов невозможны. Работа с проходящим трафиком, например в случае "расшаривания" соединения, не проверялась и не гарантируется. Для работы с `windivert` требуются права администратора. Специфические для unix параметры, такие как `--uid`, `--user` и т.д., исключены. Все остальные параметры аналогичны `nfqws` и `dvtws`. Работа с пакетным фильтром основана на двух действиях. 1) Выделение перенаправляемого трафика в режиме ядра и передача его пакетному фильтру в user mode. 2) Собственно обработка перенаправленных пакетов в пакетном фильтре. В Windows отсутствуют встроенные средства для перенаправления трафика, такие как `iptables`, `nftables`, `pf` или `ipfw`. Поэтому используется сторонний драйвер ядра `windivert`. Он работает, начиная с Windows 7. На системах с включенным Secure Boot могут быть проблемы из-за подписи драйвера. В этом случае отключите Secure Boot или включите режим testsigning. На Windows 7 вероятно будут проблемы с загрузкой `windivert`. Читайте ниже соответствующий раздел. Задача `iptables` в `winws` решается внутренними средствами через фильтры `windivert`. У `windivert` существует собственный язык фильтров, похожий на язык фильтров wireshark. Документация по фильтрам `windivert` [здесь](https://reqrypt.org/windivert-doc.html#filter_language). Чтобы не писать сложные фильтры вручную, предусмотрены различные упрощенные варианты автоматического построения фильтров. ``` --wf-iface=[.] ; числовые индексы интерфейса и суб-интерфейса --wf-l3=ipv4|ipv6 ; фильтр L3 протоколов. по умолчанию включены IPv4 и IPv6. --wf-tcp=[~]port1[-port2] ; фильтр портов для TCP. ~ означает отрицание --wf-udp=[~]port1[-port2] ; фильтр портов для UDP. ~ означает отрицание --wf-raw=|@ ; задать напрямую фильтр windivert из параметра или из файла. имени файла предшествует символ @. --wf-save= ; сохранить сконструированный фильтр windivert в файл для последующей правки вручную --ssid-filter=ssid1[,ssid2,ssid3,...] ; включать winws только когда подключена любая из указанных Wi-Fi сетей --nlm-filter=net1[,net2,net3,...] ; включать winws только когда подключена любая из указанных сетей NLM --nlm-list[=all] ; вывести список сетей NLM. по умолчанию только подключенных, all - всех. ``` Параметры `--wf-l3`, `--wf-tcp`, `--wf-udp` могут брать несколько значений через запятую. Номера интерфейсов можно узнать так: `netsh int ip show int`. Некоторых типы соединений там не увидеть. В этом случае запускайте `winws` с параметром `--debug` и смотрите `IfIdx` там. `SubInterface` используется `windivert`, но практически всегда 0, его можно не указывать. Вероятно он нужен в редких случаях. Конструктор фильтров автоматически включает входящие TCP пакеты с TCP SYNACK и TCP RST для корректной работы функций `autottl` и `autohostlist`. При включении `autohostlist` так же перенаправляются пакеты данных с HTTP redirect с кодами 302 и 307. Всегда добавляется фильтр на исключение не-интернет адресов IPv4 и IPv6. Для сложных нестандартных сценариев могут потребоваться свои фильтры. Логично будет начать со стандартного шаблона, сохраненного через `--wf-save`. Нужно править файл и подсовывать его в параметре `--wf-raw`. Максимальный размер фильтра - 8 Kb. Можно запускать несколько процессов `winws` с разными стратегиями. Однако, не следует делать пересекающиеся фильтры. В `--ssid-filter` можно через запятую задать неограниченное количество имен Wi-Fi сетей (SSID). Если задана хотя бы одна сеть, то `winws` включается только, если подключен указанный SSID. Если SSID исчезает, `winws` отключается. Если SSID появляется снова, `winws` включается. Это нужно, чтобы можно было применять раздельное дурение к каждой отдельной Wi-Fi сети. Названия сетей должны быть написаны в том регистре, в котором их видит система. Сравнение идет с учетом регистра! При этом нет никаких проверок того, куда реально идет трафик. Если одновременно подключен, допустим, Ethernet, и трафик идет туда, то дурение включается и выключается просто по факту наличия Wi-Fi сети, на которую трафик может и не идти. И это может сломать дурение на Ethernet. Поэтому полезно так же будет добавить фильтр `--wf-iface` на индекс интерфейса Wi-Fi адаптера, чтобы не трогать другой трафик. `--nlm-filter` аналогичен `--ssid-filter`, но работает с именами или GUIDами сетей Network List Manager (NLM). Это те сети, которые вы видите в панели управления в разделе "Центр управления сетями и общим доступом". Под сетью подразумевается не конкретный адаптер, а именно сетевое окружение конкретного подключения. Обычно проверяется MAC адрес шлюза. К сети можно подключиться через любой адаптер, и она останется той же самой. Если подключиться, допустим, к разными роутерам по кабелю, то будут разные сети. А если к одному роутеру через 2 разных сетевых карточки на том же компе - будет одна сеть. NLM абстрагирует типы сетевых адаптеров. Он работает как с Wi-Fi, так и с Ethernet и любыми другими. Поэтому это более универсальный метод, чем SSID фильтр. Однако, есть и неприятная сторона. В Windows 7 вы легко могли ткнуть на иконку сети и выбрать тип: private или public. Там же вы могли посмотреть список сетей и объединить их. Чтобы, допустим, вы могли подключаться по кабелю и Wi-Fi к одному роутеру, и система эти подключения воспринимала как одну сеть. В следующих версиях Windows они эти возможности сильно порезали. Похоже нет встроенных средств полноценно управлять network locations в Windows 10/11. Кое-что есть в `powershell`. Можно поковыряться напрямую в реестре здесь: `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList` Нужно менять `ProfileGUID` в `Signatures\Unmanaged`. Имена можно поменять в Profiles. Есть кое-какие сторонние утилиты. Кое-что находится, позволяющее посмотреть и удалить network profiles, но не объединить. Факт, что в ms они это сильно испортили. Движок network list все тот же, и он способен на все то, что было в Windows 7. Можно не бороться с этой проблемой, а просто указывать через запятую те названия сетей или GUIDы, которые выбрала система. Или если у вас только Wi-Fi, то использовать `--ssid-filter`. Там хотя бы есть гарантия, что SSID соответствуют реальности, а система их не назвала как-то по-своему. Если в путях присутствуют национальные символы, то при вызове `winws` из `cmd` или `bat` кодировку нужно использовать OEM. Для русского языка это 866. Пути с пробелами нужно брать в кавычки. Существует неочевидный момент, касающийся запуска `winws` из `cygwin` шелла. Если в директории, где находится `nfqws`, находится копия `cygwin1.dll`, `winws` не запустится. Поэтому в `binaries/win64` существует директория zapret-winws, содержащая полный комплект для запуска без `cygwin`. Его вы и берете для повседневного использования. Если нужен запуск под `cygwin`, то следует запускать из `binaries/win64`. Это нужно для работы `blockcheck`. Из `cygwin` шелла можно посылать `winws` сигналы через `kill` точно так же, как в *nix. Как получить совместимый с Windows 7 и winws `cygwin`: ```powershell curl -O https://www.cygwin.com/setup-x86_64.exe setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215 ``` Следует выбрать установку `curl`. Для сборки из исходников требуется `gcc-core`, `make`, `zlib-devel`. Собирать из директории `nfq` командой `make cygwin`. `winws` требует `cygwin1.dll`, `windivert.dll`, `windivert64.sys`. Их можно взять из `binaries/win64/zapret-winws`. Версию для 32-битных x86 Windows собрать можно, но такие системы уже уходят в прошлое, поэтому если надо - собирайте сами. 32-битный `windivert` можно взять с сайта разработчика. Требуется версия 2.2.2. Для ARM64 Windows нет подписанного драйвера `windivert` и нет `cygwin`. Однако, эмуляция x64 Windows 11 позволяет использовать все, кроме `WinDivert64.sys` без изменений. Но при этом надо заменить `WinDivert64.sys` на неподписанную ARM64 версию и установить режим testsigning. ## Windows 7 и `windivert` Требования к подписи драйверов Windows изменились в 2021 году. Официальные бесплатные обновления Windows 7 закончились в 2020. После этого несколько лет продолжали идти платные обновления по программе ESU. Именно в этих ESU обновлениях находится обновление ядра 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 файла. В `zapret-win-bundle` есть отдельных 2 места, где находится `winws`: `zapret-winws` и `blockcheck/zapret/nfq`. Надо менять в обоих местах. Этот вариант проверен и должен работать. Тем не менее патч 10 летней давности, который включает SHA256 сигнатуры, все еще необходим. 2) Взломать ESU: [раз](https://hackandpwn.com/windows-7-esu-patching/), [два](http://www.bifido.net/tweaks-and-scripts/8-extended-security-updates-installer.html), и обновить систему 3) Использовать UpdatePack7R2 от [simplix](https://blog.simplix.info). Но с этим паком есть проблема. Автор из Украины, он очень обиделся на русских. Если в панели управления стоит регион RU или BY, появляется неприятный диалог. Чтобы эту проблему обойти, можно поставить временно любой другой регион, потом вернуть. Так же нет никаких гарантий, что автор не насовал туда какой-то зловредный код. Использовать на свой страх и риск. Более безопасный вариант - скачать последнюю нормальную довоенную версию: [22.2.10](https://nnmclub.to/forum/viewtopic.php?t=1530323). Ее достаточно, чтобы windivert 2.2.2-A заработал на Windows 7. ## `blockcheck` `blockcheck.sh` написан на posix shell и требует некоторых стандартных утилит posix. В Windows, естественно, этого нет. Потому просто так запустить `blockcheck.sh` невозможно. Для этого требуется скачать и установить `cygwin` так, как описано в предыдущем разделе. Следует запустить от имени администратора cygwin shell через `cygwin.bat`. В нем нужно пройти в директорию с `zapret`. Обратные слэши путей Windows нужно удваивать, менять на прямые слэши, либо использовать отображение на unix path. - Корректный вариант 1: `cd "C:\\Users\\vasya"` - Корректный вариант 2: `cd "C:/Users/vasya"` - Корректный вариант 3: `cd "/cygdrive/c/Users/vasya"` Далее все как в *nix: 1 раз `./install_bin.sh`, затем `./blockcheck.sh`. WSL использовать нельзя, это не то же самое. `cygwin` для обычной работы `winws` не нужен. Разве что вы хотите посылать `winws` SIGHUP для перечитки листов без перезапуска. ## Автозапуск `winws` Для запуска `winws` вместе с Windows есть 2 варианта. Планировщик задач или службы Windows. Можно создавать задачи и управлять ими через консольную программу `schtasks`. В директории `binaries/win64/winws` подготовлены файлы `task_*.cmd`. В них реализовано создание, удаление, старт и стоп одной копии процесса `winws` с параметрами из переменной `%WINWS1%`. Исправьте параметры на нужную вам стратегию. Если для разных фильтров применяется разная стратегия, размножьте код для задач `winws1`, `winws2`, `winws3`,... Аналогично настраивается вариант запуска через службы Windows. Смотрите `service_*.cmd`. Все батники требуется запускать от имени администратора. Управлять задачами можно так же из графической программы управления планировщиком `taskschd.msc`. ## `zapret-win-bundle` Можно не возиться с `cygwin`, а взять [готовый пакет](https://github.com/bol-van/zapret-win-bundle), включающий в себя `cygwin` и `blockcheck`. Там сделан максимум удобств для сосредоточения на самом `zapret`, исключая возню с установкой `cygwin`, заходами в директории, запусками под администратором и прочими сугубо техническими моментами, в которых могут быть ошибки и непонимания, а новичок без базиса знаний может и вовсе запутаться. - `/zapret-winws` - здесь все, что нужно для запуска `winws` в повседневном рабочем режиме. остальное не нужно. - `/zapret-winws/_CMD_ADMIN.cmd` - получить командную строку `cmd` в этой директории от имени администратора для тестирования `winws` с параметрами, вводимыми вручную - `/blockcheck/blockcheck.cmd` - достаточно кликнуть по нему, чтобы пошел `blockcheck` с записью лога в `blockcheck/blockcheck.log` - `/cygwin/cygwin.cmd` - запуск среды `cygwin bash` под текущим пользователем - `/cygwin/cygwin-admin.cmd` - запуск среды `cygwin bash` под администратором В среде `cygwin` уже настроены alias-ы на `winws`, `blockcheck`, `ip2net`, `mdig`. С путями возиться не нужно! Из `cygwin` можно не только тестировать `winws`, но и посылать сигналы. Доступны команды `pidof`, `kill`, `killall`, `pgrep`, `pkill`. Но важно понимать, что таким образом не выйдет посылать сигналы `winws`, запущенному из `zapret-winws`, поскольку там свой `cygwin1.dll`, и они не разделяют общее пространство процессов unix. `zapret-winws` - это отдельный комплект для повседневного использования, не требующий что-то еще, но и не связанный со средой `cygwin`. Среду `cygwin` можно использовать для записи в файл дебаг-лога `winws`. Для этого пользуйтесь командой `tee`: `winws --debug --wf-tcp=80,443 | tee winws.log` `winws.log` будет в `cygwin/home/<имя_пользователя>` Если у вас Windows 7, то блокнот не поймет переводы строк в стиле unix. Воспользуйтесь командой: `unix2dos winws.log`