Merge branch 'md'

This commit is contained in:
bol-van 2024-11-05 16:10:02 +03:00
commit 7f4356aa7e
4 changed files with 281 additions and 191 deletions

View File

@ -1,11 +1,15 @@
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt.
# Windows quick start
Как обычно, компьютерная грамотность ложится полностью на вас.
Вы должны уметь работать с консолью windows и иметь минимальные навыки обращения с командными файлами bat,cmd.
Если грамотность отсутствует и возникает куча "как" на базовых вещах, значит эта программа не для вас.
Разработчик не будет отвечать на вопросы из серии школы компьютерной грамотности.
Если вы все-таки хотите продолжать, задавайте вопросы в дискуссиях на github или на форумах.
Возможно, кто-то вам поможет. Но не надо писать issue на github. Они будут закрываться сразу.
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню [readme.md](./readme.md).
> [!CAUTION]
> Как обычно, компьютерная грамотность ложится полностью на вас.
> Вы должны уметь работать с консолью windows и иметь минимальные навыки обращения с командными файлами `bat`, `cmd`.
> Если грамотность отсутствует и возникает куча _"как?"_ на базовых вещах, значит эта программа не для вас.
> Разработчик не будет отвечать на вопросы из серии школы компьютерной грамотности.
> Если вы все-таки хотите продолжать, задавайте вопросы в дискуссиях на github или на форумах.
> Возможно, кто-то вам поможет. Но не надо писать issue на github. Они будут закрываться сразу.
## Немного разъяснений
Обход DPI является хакерской методикой. Под этим словом понимается метод, которому сопротивляется окружающая среда,
которому автоматически не гарантирована работоспособность в любых условиях и на любых ресурсах,
@ -18,32 +22,34 @@
Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы.
Есть решение самое простое, а есть "как положено".
> [!NOTE]
> Есть решение самое простое, а есть "как положено".
САМОЕ ПРОСТОЕ РЕШЕНИЕ
## САМОЕ ПРОСТОЕ РЕШЕНИЕ
Совсем ничего не могу, все очень сложно, дайте мне таблетку.
_"Совсем ничего не могу, все очень сложно, дайте мне таблетку."_ ©Простой пользователь
Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip
Запустите zapret-winws/preset_russia.cmd от имени администратора.
Возможно, заведется сразу. Этот вариант похож на "2_any_country.cmd" из GoodbyeDPI.
1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip.
2) Запустите `zapret-winws/preset_russia.cmd` от имени администратора. Возможно, заведется сразу.
То же самое с ограничителем по автоматически создаваемому хост-листу preset_russia_autohostlist.cmd.
Что такое autohostlist - читайте readme.txt. Проще говоря, мы обходим только то, что долго и упорно не хочет открываться.
То же самое с ограничителем по автоматически создаваемому хост-листу `preset_russia_autohostlist.cmd`.
Что такое `autohostlist` - читайте [readme.md](./readme.md). Проще говоря, мы обходим только то, что долго и упорно не хочет открываться.
Сначала не будет, но надо пытаться много раз, и тогда сработает, а дальше будет всегда срабатывать.
Остальное не будет ломаться. Использовать только, если первый вариант тоже работает.
Не помогла таблетка ? Это вовсе не значит, что ничего не получится. Но придется делать по-нормальному.
Не помогла _"таблетка"_ ? Это вовсе не значит, что ничего не получится. Но придется делать по нормальному.
РЕШЕНИЕ "КАК ПОЛОЖЕНО"
## РЕШЕНИЕ "КАК ПОЛОЖЕНО"
1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip
1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip.
2) Если у вас Windows 7 x64, читайте docs/windows.txt. Без описанной там подготовки может не работать.
Для 32-битных систем Windows нет готового полного варианта, но есть собранные бинарники :
https://github.com/bol-van/zapret-win32
На windows 11 arm64 выполните arm64/install_arm64.cmd от имени администратора и перезагрузите компьютер.
Читайте docs/windows.txt
2) Если у вас Windows 7 x64, читайте [docs/windows.md](./windows.md). Без описанной там подготовки может не работать.
> [!WARNING]
> Для 32-битных систем Windows нет готового полного варианта.
На windows 11 arm64 выполните `arm64/install_arm64.cmd` от имени администратора и перезагрузите компьютер.
Читайте [docs/windows.md](./windows.md)
Имейте в виду, что антивирусы могут плохо реагировать на windivert.
cygwin так же имеет внушительный список несовместимостей с антивирусами, хотя современные антивирусы
@ -54,15 +60,15 @@ cygwin так же имеет внушительный список несовм
4) Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит
5) Запустите blockcheck\blockcheck.cmd. blockcheck в начале проверяет DNS.
Если выводятся сообщения о подмене адресов, то нужно будет решить проблему с DNS.
blockcheck перейдет в этом случае на DoH и будет пытаться получить и использовать реальные IP адреса.
5) Запустите `blockcheck\blockcheck.cmd`. blockcheck в начале проверяет **DNS**.
Если выводятся сообщения о подмене адресов, то нужно будет решить проблему с **DNS**.
blockcheck перейдет в этом случае на **DoH** _(DNS over HTTPS)_ и будет пытаться получить и использовать реальные IP адреса.
Но если вы не настроите решение этой проблемы, обход будет работать только для тех программ,
которые сами реализуют механизмы SecureDNS. Для других программ обход работать не будет.
Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов
от провайдера на публичные (1.1.1.1, 8.8.8.8), либо в случае перехвата провайдером обращений
к сторонним серверам - через специальные средства шифрования DNS запросов, такие как dnscrypt, DoT, DoH.
от провайдера на публичные (`1.1.1.1`, `8.8.8.8`), либо в случае перехвата провайдером обращений
к сторонним серверам - через специальные средства шифрования DNS запросов, такие как [dnscrypt](https://www.dnscrypt.org/), **DoT** _(DNS over TLS)_, **DoH**.
В современных броузерах чаще всего DoH включен по умолчанию, но curl будет использовать обычный системный DNS.
win11 поддерживает системные DoH из коробки. Они не настроены по умолчанию.
В последних билдах win10 существует неофициальный обходной путь для включения DoH.
@ -71,13 +77,17 @@ win11 поддерживает системные DoH из коробки. Он
Тут все разжевано как и где это включается : https://hackware.ru/?p=13707
6) blockcheck позволяет выявить рабочую стратегию обхода блокировок.
Лог скрипта будет сохранен в blockcheck\blockcheck.log.
Запомните найденные стратегии.
Лог скрипта будет сохранен в `blockcheck\blockcheck.log`.
Запомните/Перепишите найденные стратегии.
Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале.
Вероятно, все остальные домены блокированы подобным образом, но не факт.
В большинстве случаев можно обьединить несколько стратегий в одну универсальную, и это крайне желательно.
Необходимо понимать как работают стратегии.
> [!WARNING]
> Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале.
> Вероятно, все остальные домены блокированы подобным образом, но не факт.
> [!TIP]
> В большинстве случаев можно обьединить несколько стратегий в одну универсальную, и это крайне желательно.
Необходимо понимать [как работают стратегии](./readme.md/#nfqws).
zapret не может пробить блокировку по IP адресу. Для проверки нескольких доменов вводите их через пробел.
Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов
@ -86,8 +96,8 @@ zapret не может пробить блокировку по IP адресу.
blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки.
В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях.
Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель
--dpi-desync-fooling, чтобы не сломать сайты на более коротких дистанциях.
md5sig наиболее совместим, но работатет только на linux серверах.
`--dpi-desync-fooling`, чтобы не сломать сайты на более коротких дистанциях.
_md5sig_ наиболее совместим, но работатет только на linux серверах.
badseq может работать только на https и не работать на http.
Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL
с каждым из этих ограничителей.
@ -97,85 +107,97 @@ badseq может работать только на https и не работа
она стабильна, на третьих полный хаос, и проще отказаться.
Далее, имея понимание что работает на http, https, quic, нужно сконструировать параметры запуска winws
с использованием мультистратегии. Как работают мультистратегии описано в readme.txt.
с использованием мультистратегии. Как работают мультистратегии описано в [readme.md](./readme.md).
Прежде всего вам нужно собрать фильтр перехватываемого трафика. Это делается через параметры
--wf-l3, --wf-tcp, --wf-udp.
--wf-l3 относится к версии ip протокола - ipv4 или ipv6.
--wf-tcp и --wf-udp содержат перечень портов или диапазонов портов через запятую.
`--wf-l3`, `--wf-tcp`, `--wf-udp`.
`--wf-l3` относится к версии ip протокола - ipv4 или ipv6.
`--wf-tcp` и `--wf-udp` содержат перечень портов или диапазонов портов через запятую.
Пример стандартного фильтра для перехвата http, https, quic : --wf-tcp=80,443 --wf-udp=443
Пример стандартного фильтра для перехвата http, https, quic : `--wf-tcp=80,443` `--wf-udp=443`
Фильтр должен быть минимально необходимым. Перехват лишнего трафика приведет только к бессмысленному
расходованию ресурсов процессора и замедлению интернета.
> [!WARNING]
> Фильтр должен быть минимально необходимым. Перехват лишнего трафика приведет только к бессмысленному расходованию ресурсов процессора и замедлению интернета.
Если кратко по мультистратегии, то обычно параметры конструируются так :
"--filter-udp=443 'параметры для quic' --new
--filter-tcp=80,443 'обьединенные параметры для http и https'"
```
--filter-udp=443 'параметры для quic' --new
--filter-tcp=80,443 'обьединенные параметры для http и https'
```
Или так :
"--filter-udp=443 "параметры для quic" --new
```
--filter-udp=443 'параметры для quic' --new
--filter-tcp=80 'параметры для http' --new
--filter-tcp=443 'параметры для https'"
--filter-tcp=443 'параметры для https'
```
Если стратегии отличаются по версии ip протокола, и вы не можете их обьединить, фильтр пишется так :
"--filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" --new
```
--filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" --new
--filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' --new
--filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' --new
--filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" --new
--filter-l3=ipv6 --filter-tcp=80 'параметры для http ipv6' --new
--filter-l3=ipv6 --filter-tcp=443 'параметры для https ipv6'"
--filter-l3=ipv6 --filter-tcp=80 "параметры для http ipv6" --new
--filter-l3=ipv6 --filter-tcp=443 "параметры для https ipv6"
```
Но здесь совсем "копи-пастный" вариант.
Но здесь совсем _"копи-пастный"_ вариант.
Чем больше вы обьедините стратегий и сократите их общее количество, тем будет лучше.
Если вам не нужно дурение отдельных протоколов, лучше всего будет их убрать из системы перехвата трафика через
параметры --wf-* и убрать соответствующие им профили мультистратегии.
параметры `--wf-*` и убрать соответствующие им профили мультистратегии.
tcp 80 - http, tcp 443 - https, udp 443 - quic.
Если используются методы нулевой фазы десинхронизации (--mss, --wssize, --dpi-desync=syndata) и фильтрация hostlist,
Если используются методы нулевой фазы десинхронизации (`--mss`, `--wssize`, `--dpi-desync=syndata`) и фильтрация hostlist,
то все параметры, относящиеся к этим методам, следует помещать в отдельные профили мультистратегии, которые получат
управление до определения имени хоста. Необходимо понимать алгоритм работы мультистратегий.
"--filter-tcp=80 'параметры для http' --new
```
--filter-tcp=80 'параметры для http' --new
--filter-tcp=443 'параметры для https' --hostlist=d:/users/user/temp/list.txt --new
--filter-tcp=443 --wssize 1:6"
--filter-tcp=443 --wssize 1:6
```
autohostlist профиль приоритетен, поэтому wssize нужно писать туда :
"--filter-tcp=80 'параметры для http' --new
--filter-tcp=443 'параметры для https' --wssize 1:6 --hostlist-auto=d:/users/user/temp/autolist.txt"
```
--filter-tcp=80 'параметры для http' --new
--filter-tcp=443 'параметры для https' --wssize 1:6 --hostlist-auto=d:/users/user/temp/autolist.txt
```
В этих примерах wssize будет применяться всегда к порту tcp 443, а хостлист будет игнорироваться.
К http применять wssize вредно и бессмысленно.
7) Протестируйте найденные стратегии на winws. winws следует брать из zapret-winws.
7) Протестируйте найденные стратегии на winws. Winws следует брать из zapret-winws.
Для этого откройте командную строку windows от имени администратора в директории zapret-winws.
Проще всего это сделать через _CMD_ADMIN.cmd. Он сам поднимет права и зайдет в нужную директорию.
Проще всего это сделать через `_CMD_ADMIN.cmd`. Он сам поднимет права и зайдет в нужную директорию.
8) Обеспечьте удобную загрузку обхода блокировок.
Есть 2 варианта. Ручной запуск через ярлык или автоматический при старте системы, вне контекста текущего пользователя.
Последний вариант разделяется на запуск через планировщик задач и через службы windows.
Если хотите ручной запуск, скопируйте preset_russia.cmd в preset_my.cmd и адаптируйте его под ваши параметра запуска.
Потом можно создать ярлык на рабочем столе на preset_my.cmd. Не забудьте, что требуется запускать от имени администратора.
Если хотите ручной запуск, скопируйте `preset_russia.cmd` в `preset_my.cmd` (`<вашеазвание>.cmd`) и адаптируйте его под ваши параметра запуска.
Потом можно создать ярлык на рабочем столе на `preset_my.cmd`. Не забудьте, что требуется запускать от имени администратора.
Но лучше будет сделать неинтерактивный автоматический запуск вместе с системой.
В zapret-winws есть командные файлы task_*, предназначенные для управления задачами планировщика.
Там следует поменять содержимое переменной WINWS1 на свою стратегию.
В zapret-winws есть командные файлы `task_*`, предназначенные для управления задачами планировщика.
Там следует поменять содержимое переменной `WINWS1` на свою стратегию.
Если вы не можете обьединить несколько стратегий для разных протоколов в одну, дублируйте код в каждом из cmd
для поддержки нескольких задач : winws1,winws2,winws3.
для поддержки нескольких задач : _winws1_, _winws2_, _winws3_.
После создания задач запустите их. Проверьте, что обход встает после перезагрузки windows.
Аналогично настраиваются и службы windows. Смотрите service_*.cmd
Аналогично настраиваются и службы windows. Смотрите `service_*.cmd`
9) Если ломаются отдельные незаблокированные ресурсы, нужно пользоваться ограничивающим
ipset или хост листом. Читайте основной талмуд readme.txt ради подробностей.
ipset или хост листом. Читайте основной талмуд [readme.md](./readme.md) ради подробностей.
Но еще лучше будет подбирать такие стратегии, которые ломают минимум.
Есть стратегии довольно безобидные, а есть сильно ломающие, которые подходят только для точечного пробития отдельных ресурсов,
когда ничего лучше нет. Хорошая стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков - ttl, fooling.
Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
В некоторых случаях вы не обойдетесь без знаний и основного "талмуда".
Подробности и полное техническое описание расписаны в readme.txt
> [!CAUTION]
> Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
> В некоторых случаях вы не обойдетесь без знаний и основного "талмуда".
Подробности и полное техническое описание расписаны в [readme.md](./readme.md)

View File

@ -1,8 +1,46 @@
# Multilanguage README
# zapret v.67
# Multilanguage/Мультиязычный README
___
[![en](https://img.shields.io/badge/lang-en-red.svg)](https://github.com/bol-van/zapret/tree/master/docs/readme.en.md)
[![ru](https://img.shields.io/badge/lang-ru-green.svg)](https://github.com/bol-van/zapret/tree/master/docs/readme.md)
***
- [What is it for](#what-is-it-for)
- [How it works](#how-it-works)
- [How to put this into practice in the linux system](#how-to-put-this-into-practice-in-the-linux-system)
- [ip6tables](#ip6tables)
- [nftables](#nftables)
- [When it will not work](#when-it-will-not-work)
- [nfqws](#nfqws)
- [DPI desync attack](#dpi-desync-attack)
- [DPI desync combos](#dpi-desync-combos)
- [SYNACK mode](#synack-mode)
- [SYNDATA mode](#syndata-mode)
- [Virtual Machines](#virtual-machines)
- [CONNTRACK](#conntrack)
- [Reassemble](#reassemble)
- [UDP support](#udp-support)
- [IP fragmentation](#ip-fragmentation)
- [multiple strategies](#multiple-strategies)
- [tpws](#tpws)
- [multiple strategies](#multiple-strategies-1)
- [Ways to get a list of blocked IP](#ways-to-get-a-list-of-blocked-ip)
- [Domain name filtering](#domain-name-filtering)
- [**autohostlist** mode](#autohostlist-mode)
- [Choosing parameters](#choosing-parameters)
- [Screwing to the firewall control system or your launch system](#screwing-to-the-firewall-control-system-or-your-launch-system)
- [Installation](#installation)
- [Checking ISP](#checking-isp)
- [desktop linux system](#desktop-linux-system)
- [OpenWRT](#openwrt)
- [Android](#android)
- [FreeBSD, OpenBSD, MacOS](#freebsd-openbsd-macos)
- [Windows (WSL)](#windows-wsl)
- [Other devices](#other-devices)
- [Donations](#donations)
***
## What is it for
@ -155,7 +193,7 @@ follows all standards. For example, we are routed to squid. Connection goes thro
## nfqws
This program is a packet modifier and a NFQUEUE queue handler.
For BSD systems there is dvtws. Its built from the same source and has almost the same parameters (see bsd.en.md).
For BSD systems there is dvtws. Its built from the same source and has almost the same parameters (see [bsd.en.md](./bsd.en.md)).
nfqws takes the following parameters:
```
@ -1280,11 +1318,11 @@ Now its possible to run `/data/local/tmp/zapret/tpws` from any app such as taske
### FreeBSD, OpenBSD, MacOS
see docs/bsd.en.md
see [docs/bsd.en.md](./bsd.en.md)
### Windows (WSL)
see docs/windows.en.md
see [docs/windows.en.md](./windows.en.md)
### Other devices
@ -1314,4 +1352,5 @@ If this is the case then run another script in background and add some delay the
Are welcome here :
<img src=https://cdn-icons-png.flaticon.com/16/14446/14446252.png alt="USDT" style="vertical-align: middle;"/> USDT 0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E
<img src=https://cdn-icons-png.flaticon.com/16/5968/5968260.png alt="USDT" style="vertical-align: middle;"/> BTC bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve

View File

@ -66,7 +66,7 @@ VPN.
> *Linux/openwrt:* [docs/quick_start.txt](./quick_start.txt)
>
>*Windows:* [docs/quick_start_windows.txt](./quick_start_windows.txt)
>*Windows:* [docs/quick_start_windows.md](./quick_start_windows.md)
## Как это работает
@ -2058,7 +2058,7 @@ curl: (7) Failed to connect to www.ru port 80: Host is unreachable
## Windows
Описано в [docs/windows.txt](./windows.txt)
Описано в [docs/windows.md](./windows.md)
## Другие прошивки

View File

@ -1,55 +1,68 @@
tpws
----
# Windows
Запуск tpws возможен только в Linux варианте под WSL.
## tpws
Запуск tpws возможен только в Linux варианте под **WSL** _(Windows Subsystem for Linux)_.
Нативного варианта под Windows нет, поскольку он использует epoll, которого под windows не существует.
tpws в режиме socks можно запускать под более-менее современными билдами windows 10 и windows server
с установленным WSL. Совсем не обязательно устанавливать дистрибутив убунту, как вам напишут почти в каждой
статье про 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 :
`dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
Удаление : wsl --unregister tpws
Скопировать на целевую систему `binaries/x86_64/tpws_wsl.tgz`.
Проверено на windows 10 build 19041 (20.04).
Выполнить :
`wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
Не работают функции --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".
Запустить :
`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`
> [!NOTE]
> Проверено на 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
-----
## winws
Это вариант пакетного фильтра nfqws для Windows, построенный на базе windivert.
Все функции работоспособны, однако функционал ipset отсутствует. Фильтры по большому количеству IP адресов невозможны.
Работа с проходящим трафиком, например в случае "расшаривания" соединения, не проверялась и не гарантируется.
Для работы с windivert требуются права администратора.
Специфические для unix параметры, такие как --uid, --user и тд, исключены. Все остальные параметры аналогичны nfqws и dvtws.
Специфические для unix параметры, такие как `--uid`, `--user` и тд, исключены. Все остальные параметры аналогичны nfqws и dvtws.
Работа с пакетным фильтром основана на двух действиях.
Первое - выделение перенаправляемого трафика в режиме ядра и передача его пакетному фильтру в user mode.
Второе - собственно обработка перенаправленных пакетов в пакетном фильтре.
Работа с пакетным фильтром основана на двух действиях :
1) Выделение перенаправляемого трафика в режиме ядра и передача его пакетному фильтру в user mode.
2) Собственно обработка перенаправленных пакетов в пакетном фильтре.
В windows отсутствуют встроенные средства для перенаправления трафика, такие как iptables, nftables, pf или ipfw.
В windows отсутствуют встроенные средства для перенаправления трафика, такие как _iptables_, _nftables_, _pf_ или _ipfw_.
Поэтому используется сторонний драйвер ядра windivert. Он работает, начиная с windows 7. На системах с включенным
secure boot могут быть проблемы из-за подписи драйвера. В этом случае отключите secureboot или включите режим testsigning.
secure boot могут быть проблемы из-за подписи драйвера. В этом случае отключите `secureboot` или включите режим `testsigning`.
На windows 7 вероятно будут проблемы с загрузкой windivert. Читайте ниже соответствующий раздел.
Задача iptables в winws решается внутренними средствами через фильтры windivert.
Задача _iptables_ в **winws** решается внутренними средствами через фильтры windivert.
У windivert существует собственный язык фильтров, похожий на язык фильтров wireshark.
Документация по фильтрам windivert : https://reqrypt.org/windivert-doc.html#filter_language
[Документация по фильтрам windivert.](https://reqrypt.org/windivert-doc.html#filter_language)
Чтобы не писать сложные фильтры вручную, предусмотрены различные упрощенные варианты автоматического построения фильтров.
```
--wf-iface=<int>[.<int>] ; числовые индексы интерфейса и суб-интерфейса
--wf-l3=ipv4|ipv6 ; фильтр L3 протоколов. по умолчанию включены ipv4 и ipv6.
--wf-tcp=[~]port1[-port2] ; фильтр портов для tcp. ~ означает отрицание
@ -59,170 +72,186 @@ secure boot могут быть проблемы из-за подписи дра
--ssid-filter=ssid1[,ssid2,ssid3,...] ; включать winws только когда подключена любая из указанных wifi сетей
--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, его можно не указывать. Вероятно он нужен в редких случаях.
Параметры `--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.
сохраненного через `--wf-save`. Нужно править файл и подсовывать его в параметре `--wf-raw`. Максимальный размер фильтра - **8 Kb**.
Можно запускать несколько процессов winws с разными стратегиями. Однако, не следует делать пересекающиеся фильтры.
Можно запускать несколько процессов **winws** с разными стратегиями. Однако, не следует делать пересекающиеся фильтры.
В --ssid-filter можно через запятую задать неограниченное количество имен wifi сетей (SSID). Если задана хотя бы одна сеть,
то winws включается только, если подключен указанный SSID. Если SSID исчезает, winws отключается. Если SSID появляется снова,
В `--ssid-filter` можно через запятую задать неограниченное количество имен wifi сетей (**SSID**). Если задана хотя бы одна сеть,
то winws включается только, если подключен указанный **SSID**. Если **SSID** исчезает, winws отключается. Если **SSID** появляется снова,
winws включается. Это нужно, чтобы можно было применять раздельное дурение к каждой отдельной wifi сети.
Названия сетей должны быть написаны в том регистре, в котором их видит система. Сравнение идет с учетом регистра !
Названия сетей должны быть написаны в том регистре, в котором их видит система. Сравнение идет с учетом регистра!
При этом нет никаких проверок куда реально идет трафик. Если одновременно подключен, допустим, ethernet,
и трафик идет туда, то дурение включается и выключается просто по факту наличия wifi сети, на которую трафик может и не идти.
И это может сломать дурение на ethernet. Поэтому полезно так же будет добавить фильтр --wf-iface на индекс интерфейса wifi адаптера,
И это может сломать дурение на ethernet. Поэтому полезно так же будет добавить фильтр `--wf-iface` на индекс интерфейса wifi адаптера,
чтобы не трогать другой трафик.
--nlm-filter аналогичен --ssid-filter, но работает с именами или GUIDами сетей Network List Manager (NLM).
`--nlm-filter` аналогичен `--ssid-filter`, но работает с именами или GUIDами сетей Network List Manager (NLM).
Это те сети, которые вы видите в панели управления в разделе "Центр управления сетями и общим доступом".
Под сетью подразумевается не конкретный адаптер, а именно сетевое окружение конкретного подключения.
Обычно проверяется mac адрес шлюза. К сети можно подключиться через любой адаптер, и она останется той же самой.
Если подключиться, допустим, к разными роутерам по кабелю, то будут разные сети.
А если к одному роутеру через 2 разных сетевых карточки на том же компе - будет одна сеть.
NLM абстрагирует типы сетевых адаптеров. Он работает как с wifi, так и с ethernet и любыми другими.
Поэтому это более универсальный метод, чем ssid фильтр.
Поэтому это более универсальный метод, чем **SSID** фильтр.
Однако, есть и неприятная сторона. В windows 7 вы легко могли ткнуть на иконку сети и выбрать тип : private или public.
Там же вы могли посмотреть список сетей и обьединить их. Чтобы, допустим, вы могли подключаться по кабелю и wifi
к одному роутеру, и система эти подключения воспринимала как одну сеть.
В следующих версиях windows они эти возможности сильно порезали. Похоже нет встроенных средств полноценно управлять
network locations в win10/11. Кое-что есть в powershell.
Можно поковыряться напрямую в реестре здесь : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList
Нужно менять ProfileGUID в Signatures\Unmanaged. Имена можно поменять в Profiles.
network locations в win10/11. Кое-что есть в **powershell**.
Можно поковыряться напрямую в реестре здесь :
`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList`
Нужно менять ProfileGUID в `Signatures\Unmanaged`. Имена можно поменять в Profiles.
Есть кое-какие сторонние утилиты. Кое-что находится, позволяющее посмотреть и удалить network profiles, но не обьединить.
Факт, что в ms они это сильно испортили. Движок network list все тот же, и он способен на все то, что было в win7.
Можно не бороться с этой проблемой, а просто указывать через запятую те названия сетей или GUIDы, которые выбрала система.
Или если у вас только wifi, то использовать --ssid-filter. Там хотя бы есть гарантия, что SSID соответствуют реальности,
Или если у вас только wifi, то использовать `--ssid-filter`. Там хотя бы есть гарантия, что **SSID** соответствуют реальности,
а система их не назвала как-то по-своему.
Если в путях присутствуют национальные символы, то при вызове winws из cmd или bat кодировку нужно использовать OEM.
Если в путях присутствуют национальные символы, то при вызове winws из `cmd` или `bat` кодировку нужно использовать **OEM**.
Для русского языка это 866. Пути с пробелами нужно брать в кавычки.
При использовании опции @<config_file> кодировка в файле должна быть UTF-8 без BOM mark.
При использовании опции @<config_file> кодировка в файле должна быть **UTF-8** без **BOM mark**.
Существует неочевидный момент, каcаемый запуска winws из cygwin шелла. Если в директории, где находится winws, находится
копия cygwin1.dll, winws не запустится.
Если нужен запуск под cygwin, то следует удалить или переместить cygwin1.dll из binaries/win64. Это нужно для работы blockcheck.
Из cygwin шелла можно посылать winws сигналы через kill точно так же, как в *nix.
Существует неочевидный момент, каcаемый запуска **winws** из cygwin shell\`а. Если в директории, где находится winws, находится
копия `cygwin1.dll`, **winws** не запустится.
Если нужен запуск под cygwin, то следует удалить или переместить `cygwin1.dll` из `binaries/win64`. Это нужно для работы blockcheck.
Из cygwin шелла можно посылать winws сигналы через `kill` точно так же, как в `*nix`.
Как получить совместимый с windows 7 и winws cygwin :
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 cygwin64" или "make cygwin32" для 64 и 32 битных версий соответственно.
winws требует cygwin1.dll, windivert.dll, windivert64.sys или windivert32.sys.
Их можно взять из binaries/win64 и binaries/win32.
`curl -O https://www.cygwin.com/setup-x86_64.exe`
Для arm64 windows нет подписанного драйвера windivert и нет cygwin.
`setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215`
> [!IMPORTANT]
> Следует выбрать установку curl.
Для сборки из исходников требуется _gcc-core_,_make_,_zlib-devel_.
Собирать из директории nfq командой `make cygwin64` или `make cygwin32` для 64 и 32 битных версий соответственно.
**winws** требует `cygwin1.dll`, `windivert.dll`, `windivert64.sys` или `windivert32.sys`.
Их можно взять из `binaries/win64` и `binaries/win32`.
Для _arm64_ windows нет подписанного драйвера windivert и нет cygwin.
Однако, эмуляция x64 windows 11 позволяет использовать все, кроме WinDivert64.sys без изменений.
Но при этом надо заменить WinDivert64.sys на неподписанную arm64 версию и установить режим testsigning.
Но при этом надо заменить WinDivert64.sys на неподписанную _arm64_ версию и установить режим testsigning.
Windows 7 и windivert
---------------------
## Windows 7 и windivert
Требования к подписи драйверов windows изменились в 2021 году.
Официальные бесплатные обновления windows 7 закончились в 2020.
После этого несколько лет продолжали идти платные обновления по программе ESU.
Именно в этих ESU обновлениях находится обновление ядра windows 7, позволяющиее загрузить драйвер
windivert 2.2.2-A, который идет в поставке zapret.
После этого несколько лет продолжали идти платные обновления по программе **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
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.
В [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle) есть отдельных 2 места, где находится **winws** : [_zapret-winws_](https://github.com/bol-van/zapret-win-bundle/tree/master/zapret-winws) и [_blockcheck/zapret/nfq_](https://github.com/bol-van/zapret-win-bundle/tree/master/blockcheck).
Надо менять в обоих местах.
Этот вариант проверен и должен работать. Тем не менее патч 10 летней давности, который включает SHA256
сигнатуры, все еще необходим.
2) Взломать ESU :
> [!NOTE]
> Этот вариант проверен и должен работать. Тем не менее патч 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, появляется неприятный диалог.
Чтобы эту проблему обойти, можно поставить временно любой другой регион, потом вернуть.
Так же нет никаких гарантий, что автор не насовал туда какой-то зловредный код.
Использовать на свой страх и риск.
> [!WARNING]
> Но с этим паком есть проблема. Автор из Украины, он очень обиделся на русских.
> Если в панели управления стоит регион RU или BY, появляется неприятный диалог.
> Чтобы эту проблему обойти, можно поставить временно любой другой регион, потом вернуть.
> Так же нет никаких гарантий, что автор не насовал туда какой-то зловредный код.
> Использовать на свой страх и риск.
Более безопасный вариант - скачать последнюю нормальную довоенную версию : 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.
blockcheck
----------
## blockcheck
blockcheck.sh написан на posix shell и требует некоторых стандартных утилит posix. В windows, естественно, этого нет.
Потому просто так запустить blockcheck.sh невозможно.
Для этого требуется скачать и установить cygwin так , как описано в предыдущем разделе.
Следует запустить от имени администратора cygwin shell через cygwin.bat.
`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"
Существует неочевидный момент, каcаемый запуска winws из cygwin шелла. Если в директории, где находится winws, находится
копия cygwin1.dll, winws не запустится. Нужно переименовать файл cygwin1.dll.
Далее все как в *nix : 1 раз ./install_bin.sh , затем ./blockcheck.sh.
Корректные варианты :
- `cd C:\\Users\\vasya`
- `cd C:/Users/vasya`
- `cd /cygdrive/c/Users/vasya`
Существует неочевидный момент, каcаемый запуска **winws** из _cygwin_ шелла. Если в директории, где находится **winws**, есть копия `cygwin1.dll`, **winws** не запустится. Нужно переименовать файл `cygwin1.dll`.
Далее все как в _*nix_ : 1 раз `./install_bin.sh` , затем `./blockcheck.sh`.
WSL использовать нельзя, это не то же самое.
cygwin для обычной работы winws не нужен.
_cygwin_ для обычной работы **winws** не нужен.
Однако, хотя такой способ и работает, использование winws сильно облегчает zapret-win-bundle.
Там нет проблемы с cygwin.dll.
Однако, хотя такой способ и работает, использование **winws** сильно облегчает [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle).
Там нет проблемы с `cygwin.dll`.
автозапуск winws
----------------
## Автозапуск winws
Для запуска winws вместе с windows есть 2 варианта. Планировщик задач или службы windows.
Для запуска **winws** вместе с windows есть 2 варианта. Планировщик задач или службы windows.
Можно создавать задачи и управлять ими через консольную программу schtasks.
В директории binaries/win64/winws подготовлены файлы task_*.cmd .
В них реализовано создание, удаление, старт и стоп одной копии процесса winws с параметрами из переменной %WINWS1%.
В директории `binaries/win64/winws` подготовлены файлы `task_*.cmd` .
В них реализовано создание, удаление, старт и стоп одной копии процесса winws с параметрами из переменной `%WINWS1%`.
Исправьте параметры на нужную вам стратегию. Если для разных фильтров применяется разная стратегия, размножьте код
для задач winws1,winws2,winws3,...
для задач _winws1_,_winws2_,_winws3_,_..._
Аналогично настраивается вариант запуска через службы windows. Смотрите service_*.cmd.
Аналогично настраивается вариант запуска через службы windows. Смотрите `service_*.cmd`.
Все батники требуется запускать от имени администратора.
Управлять задачами можно так же из графической программы управления планировщиком taskschd.msc
Управлять задачами можно так же из графической программы управления планировщиком `taskschd.msc`
zapret-win-bundle
-----------------
## Zapret-win-bundle
Можно не возиться с cygwin, а взять готовый пакет, включающий в себя cygwin и blockcheck : https://github.com/bol-van/zapret-win-bundle
Там сделан максимум удобств для сосредоточения на самом zapret, исключая возню с установкой cygwin,
Можно не возиться с _cygwin_, а взять готовый пакет, включающий в себя _cygwin_ и _blockcheck_ : https://github.com/bol-van/zapret-win-bundle
Там сделан максимум удобств для сосредоточения на самом zapret, исключая возню с установкой _cygwin_,
заходами в директории, запусками под администратором и прочими сугубо техническими моментами, в которых могут быть
ошибки и непонимания, а новичок без базиса знаний может и вовсе запутаться.
/zapret-winws - здесь все, что нужно для запуска winws в повседневном рабочем режиме. остальное не нужно.
/zapret-winws/_CMD_ADMIN.cmd - получить командную строку cmd в этой директории от имени администратора для тестирования winws
`/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 под администратором
`/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_ уже настроены alias-ы на winws,blockcheck,ip2net,mdig. С путями возиться не нужно!
> [!TIP]
> Из 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/<имя_пользователя>
`winws --debug --wf-tcp=80,443 | tee winws.log`
`winws.log` будет в `cygwin/home/<имя_пользователя>`
Если у вас windows 7, то блокнот не поймет переводы строк в стиле unix. Воспользуйтесь командой
unix2dos winws.log
`unix2dos winws.log`
Поскольку 32-битные windows мало востребованы, zapret-win-bundle существует только в варианте для windows x64/arm64.
> [!CAUTION]
> Поскольку 32-битные windows мало востребованы, _zapret-win-bundle_ существует только в варианте для windows _x64/arm64_.