mirror of
https://github.com/bol-van/zapret.git
synced 2026-09-17 22:12:00 +09:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7364bab8a7 | |||
| 1f48453989 | |||
| dc5efebee2 | |||
| 10c9499647 | |||
| a50082df92 | |||
| 0c33bbfb37 | |||
| ea1be413a6 | |||
| 850d4023fb | |||
| 4872b8e4e8 | |||
| 75eaefa950 | |||
| 582ade3190 | |||
| efd369bb0e | |||
| 784465bdcf | |||
| 40a80cd328 | |||
| 73f21b0524 | |||
| 34698479d0 | |||
| 0830633f42 | |||
| fc837e14fa | |||
| 0e288262b5 | |||
| dce049d6b8 | |||
| d103602d86 | |||
| aaf8f18a7d | |||
| de19cc3cd4 | |||
| 1e56703d4b | |||
| cd0f1c4bdf | |||
| 135b152497 | |||
| 56456c1e0c | |||
| d6a8d1dc33 | |||
| 04b3b6abcb | |||
| fd58ecf8a5 |
@@ -1,3 +1,4 @@
|
|||||||
* text=auto eol=lf
|
* text=auto eol=lf
|
||||||
*.cmd eol=crlf
|
*.cmd eol=crlf
|
||||||
*.bat eol=crlf
|
*.bat eol=crlf
|
||||||
|
init.d/windivert.filter.examples/** eol=crlf
|
||||||
|
|||||||
@@ -7,13 +7,19 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
1. Здесь не место для вопросов, касающихся компьютерной грамотности и навыков использования ОС
|
Issues - это место для обращений к разработчику.
|
||||||
2. Здесь не место для вопросов "у меня не работает" без технических подробностей
|
Discussions - место для обсуждения вопросов между пользователями.
|
||||||
3. Здесь не место для вопросов "как мне открыть ютуб", "что писать в ...", "перестало открываться".
|
Не тратье время разработчика на ерунду. Вам не будут здесь обьяснять как скопировать, что "писать в", почему сразу же закрывается окно, почему не открывается сайт или госуслуги. Здесь не место обсуждению любых шаманств , т.е. манипуляций без понимания, в стиле 4pda.
|
||||||
4. Здесь не место для обсуждения сборок
|
Пишите только конкретные проблемы на техническом уровне в оригинальном zapret (не в сборках), которые вы заметили, и которые являются или могут являться багами в софте.
|
||||||
5. Вирусов здесь нет. У вас либо чья-то сборка, либо ваш антивирус давно пора отправить на покой. Антивирусы в основном жалуются на upx и windivert, которые убраны НЕ будут. upx - это паковщик для сокращения требуемого места на openwrt, windivert - замена iptables для windows, потенциальный инструмент хакера или компонент зловредной программы, но сам по себе вирусом не является. Не согласны - удаляйте софт. За агрессивные наезды "почему автор распространяет вирусы" молча схватите бан.
|
Или если вы считаете, что ваше обращение обосновано, технически грамотно и по адресу.
|
||||||
|
Все, что будет нарушать эти критерии, может быть молча удалено, закрыто или перенесено в дискуссии на усмотрение разработчика.
|
||||||
|
Если сомневаетесь - пишите лучше сразу в дискуссии.
|
||||||
|
|
||||||
Все означенное обсуждать в дискуссиях или на форумах.
|
Прочитайте для начала docs/quick_start.md или docs/quick_start_windows.md.
|
||||||
При нарушении будет закрываться или конвертироваться в дискуссии.
|
Там обьясняется для кого этот софт, какие требуются знания, почему это не простая волшебная таблетка.
|
||||||
Issue только для обсуждения проблем самого софта. Неработа стратегии или ваше неумение настроить - это ваша проблема, а не проблема софта.
|
|
||||||
Однокнопочные решения дают только сборщики, поэтому "открытие сайта" не является функцией программы, и нет смысла жаловаться, что он не открывается. Но можно это обсудить в дискуссиях. Не захламляйте issues !
|
Вирусов здесь нет. У вас либо чья-то сборка, либо ваш антивирус давно пора отправить на покой. Антивирусы в основном жалуются на upx и windivert, которые убраны НЕ будут. upx - это паковщик для сокращения требуемого места на openwrt, windivert - замена iptables для windows, потенциальный инструмент хакера или компонент зловредной программы, но сам по себе вирусом не является. Не согласны - удаляйте софт. За агрессивные наезды "почему автор распространяет вирусы" молча схватите бан.
|
||||||
|
|
||||||
|
|
||||||
|
Here is the place for bugs only. All questions, especially user-like questions (non-technical) go to Discussions.
|
||||||
|
There're also no viruses here. All virus claims and everyting non-technical and non-bugs will be instantly deleted, closed or moved to Discussions.
|
||||||
|
|||||||
@@ -534,3 +534,10 @@ nfqws: ts fooling
|
|||||||
blockcheck: test ts fooling
|
blockcheck: test ts fooling
|
||||||
blockcheck: auto enable tcp timestamps in windows
|
blockcheck: auto enable tcp timestamps in windows
|
||||||
tpws,nfqws: special handling of IP-like hostnames. strip :port from hostname:port
|
tpws,nfqws: special handling of IP-like hostnames. strip :port from hostname:port
|
||||||
|
|
||||||
|
v71.4
|
||||||
|
|
||||||
|
nfqws,tpws: fix possible crashes or high memory usage if hostlist has duplicate hostnames
|
||||||
|
init.d: custom scripts 50-discord-media, 50-stun4all
|
||||||
|
init.d: windivert filters for discord media, stun, wireguard
|
||||||
|
readme: hardware problems description
|
||||||
|
|||||||
+6
-3
@@ -1,4 +1,4 @@
|
|||||||
# zapret v71.3
|
# zapret v71.4
|
||||||
|
|
||||||
# SCAMMER WARNING
|
# SCAMMER WARNING
|
||||||
|
|
||||||
@@ -701,6 +701,9 @@ Set up bridge networking.
|
|||||||
|
|
||||||
### IPTABLES for nfqws
|
### IPTABLES for nfqws
|
||||||
|
|
||||||
|
> [!CAUTION]
|
||||||
|
> Starting from Linux kernel 6.17 there's CONFIG_NETFILTER_XTABLES_LEGACY parameter which is not set by default. Many distributions will likely not turn it on making iptables-legacy non working. This is part of iptables deprecation. However iptables-nft still works because their backend is based on nftables.
|
||||||
|
|
||||||
This is the common way to redirect some traffic to nfqws :
|
This is the common way to redirect some traffic to nfqws :
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -1145,7 +1148,7 @@ If `MODE_FILTER=hostlist` all present lists are passed to **nfqws** or **tpws**.
|
|||||||
If all include lists are empty it works like no include lists exist at all.
|
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.
|
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" .
|
Subdomains auto apply. For example, "ru" in the list affects "\*.ru" .
|
||||||
`^` prefix symbol disables subdomain match.
|
`^` prefix symbol disables subdomain match.
|
||||||
|
|
||||||
**tpws** and **nfqws** automatically reload lists if their modification time or file size is changed.
|
**tpws** and **nfqws** automatically reload lists if their modification time or file size is changed.
|
||||||
@@ -1243,7 +1246,7 @@ Change postnat scheme mark bit
|
|||||||
|
|
||||||
If uncommented pass to zapret only packets marked with this bit
|
If uncommented pass to zapret only packets marked with this bit
|
||||||
|
|
||||||
`#FILTER_MARK_POSTNAT=0x10000000`
|
`#FILTER_MARK=0x10000000`
|
||||||
|
|
||||||
Bit must be set in your own rules.
|
Bit must be set in your own rules.
|
||||||
* iptables - in mangle PREROUTING and mangle OUTPUT before zapret rules (iptables -I _after_ zapret rules application).
|
* iptables - in mangle PREROUTING and mangle OUTPUT before zapret rules (iptables -I _after_ zapret rules application).
|
||||||
|
|||||||
+74
-3
@@ -1,4 +1,4 @@
|
|||||||
# zapret v71.3
|
# zapret v71.4
|
||||||
|
|
||||||
# ВНИМАНИЕ, остерегайтесь мошенников
|
# ВНИМАНИЕ, остерегайтесь мошенников
|
||||||
|
|
||||||
@@ -43,6 +43,7 @@ zapret является свободным и open source.
|
|||||||
- [IPTABLES ДЛЯ NFQWS](#iptables-для-nfqws)
|
- [IPTABLES ДЛЯ NFQWS](#iptables-для-nfqws)
|
||||||
- [NFTABLES ДЛЯ NFQWS](#nftables-для-nfqws)
|
- [NFTABLES ДЛЯ NFQWS](#nftables-для-nfqws)
|
||||||
- [FLOW OFFLOADING](#flow-offloading)
|
- [FLOW OFFLOADING](#flow-offloading)
|
||||||
|
- [ОСОБЕННОСТИ ЖЕЛЕЗОК](#особенности-железок)
|
||||||
- [ДУРЕНИЕ СО СТОРОНЫ СЕРВЕРА](#дурение-со-стороны-сервера)
|
- [ДУРЕНИЕ СО СТОРОНЫ СЕРВЕРА](#дурение-со-стороны-сервера)
|
||||||
- [tpws](#tpws)
|
- [tpws](#tpws)
|
||||||
- [TCP СЕГМЕНТАЦИЯ В TPWS](#tcp-сегментация-в-tpws)
|
- [TCP СЕГМЕНТАЦИЯ В TPWS](#tcp-сегментация-в-tpws)
|
||||||
@@ -817,6 +818,9 @@ wireless extensions считаются deprecated и на новых ядрах
|
|||||||
|
|
||||||
### IPTABLES ДЛЯ NFQWS
|
### IPTABLES ДЛЯ NFQWS
|
||||||
|
|
||||||
|
> [!CAUTION]
|
||||||
|
> Начиная с ядер Linux 6.17 присутствует параметр конфигурации ядра CONFIG_NETFILTER_XTABLES_LEGACY, который по умолчанию в дистрибутиве может быть "not set". Отсутствие этой настройки выключает iptables-legacy. Это часть процесса депрекации iptables. Тем не менее iptables-nft будут работать, поскольку используют backend nftables.
|
||||||
|
|
||||||
iptables для задействования атаки на первые пакеты данных в tcp соединении :
|
iptables для задействования атаки на первые пакеты данных в tcp соединении :
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -931,6 +935,73 @@ iptables target `FLOWOFFLOAD` - это проприетарное изобрет
|
|||||||
Управление offload в nftables реализовано в базовом ядре linux без патчей.
|
Управление offload в nftables реализовано в базовом ядре linux без патчей.
|
||||||
nftables - единственный способ включения offload на классическом Linux.
|
nftables - единственный способ включения offload на классическом Linux.
|
||||||
|
|
||||||
|
### ОСОБЕННОСТИ ЖЕЛЕЗОК
|
||||||
|
|
||||||
|
На устройствах mediatek замечены 2 проблемы.
|
||||||
|
|
||||||
|
Драйвер mediatek ethernet отбрасывает tcp и udp пакеты с неверной чексуммой на аппаратном уровне, это не отключается.
|
||||||
|
Как следствие не будет работать fooling badsum через роутер, но будет с него.
|
||||||
|
|
||||||
|
Другая проблема mediatek, затрагивающая как ethernet, так и wireless, проявляется на udp, когда включен offload rx-gro-list.
|
||||||
|
Пока отсутствует nfqueue, все хорошо. Как только nfqueue появляется, часть пакетов выпадает.
|
||||||
|
Особенно заметно это проявляется на дурении QUIC с kyber.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>shell код лечения</b></summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
append_separator_list()
|
||||||
|
{
|
||||||
|
# $1 - var name to receive result
|
||||||
|
# $2 - separator
|
||||||
|
# $3 - quoter
|
||||||
|
# $4,$5,... - elements
|
||||||
|
local _var="$1" sep="$2" quo="$3" i
|
||||||
|
|
||||||
|
eval i="\$$_var"
|
||||||
|
shift; shift; shift
|
||||||
|
while [ -n "$1" ]; do
|
||||||
|
if [ -n "$i" ] ; then
|
||||||
|
i="$i$sep$quo$1$quo"
|
||||||
|
else
|
||||||
|
i="$quo$1$quo"
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
eval $_var="\$i"
|
||||||
|
}
|
||||||
|
resolve_lower_devices()
|
||||||
|
{
|
||||||
|
# $1 - bridge interface name
|
||||||
|
[ -d "/sys/class/net/$1" ] && {
|
||||||
|
find "/sys/class/net/$1" -follow -maxdepth 1 -name "lower_*" |
|
||||||
|
{
|
||||||
|
local l lower lowers
|
||||||
|
while read lower; do
|
||||||
|
lower="$(basename "$lower")"
|
||||||
|
l="${lower#lower_*}"
|
||||||
|
[ "$l" != "$lower" ] && append_separator_list lowers ' ' '' "$l"
|
||||||
|
done
|
||||||
|
printf "$lowers"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# it breaks nfqueue
|
||||||
|
lans=$(resolve_lower_devices br-lan)
|
||||||
|
for int in $lans; do
|
||||||
|
ethtool -K $int rx-gro-list off
|
||||||
|
done
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
Этот код нужно вызывать после вставания интерфейса LAN, когда все bridge members уже занесены в bridge.
|
||||||
|
Можно использовать хук в `/etc/hotplug.d/iface`. Должен быть установлен `ethtool`.
|
||||||
|
|
||||||
|
Проблемы mediatek были подтверждены на MT7621 (TP-Link Archer C6U v1) и MT7981 (Xiaomi AX3000T).
|
||||||
|
Другие чипсеты могут быть так же подвержены проблеме, а могут и не быть. Более широкой статистики нет.
|
||||||
|
|
||||||
|
|
||||||
### ДУРЕНИЕ СО СТОРОНЫ СЕРВЕРА
|
### ДУРЕНИЕ СО СТОРОНЫ СЕРВЕРА
|
||||||
|
|
||||||
Это тоже возможно.
|
Это тоже возможно.
|
||||||
@@ -1510,7 +1581,7 @@ LISTS_RELOAD=- отключает перезагрузку листов.
|
|||||||
Файл есть, но несмотря на это дурится все, кроме exclude.
|
Файл есть, но несмотря на это дурится все, кроме exclude.
|
||||||
Если вам нужен именно такой режим - не обязательно удалять `zapret-hosts-users.txt`. Достаточно сделать его пустым.
|
Если вам нужен именно такой режим - не обязательно удалять `zapret-hosts-users.txt`. Достаточно сделать его пустым.
|
||||||
|
|
||||||
Поддомены учитываются автоматически. Например, строчка "ru" вносит в список "*.ru". Строчка "*.ru" в списке не сработает.
|
Поддомены учитываются автоматически. Например, строчка "ru" вносит в список "\*.ru". Строчка "\*.ru" в списке не сработает.
|
||||||
Можно использовать символ `^` в начале хоста, чтобы отказаться от автоматического учета поддоменов.
|
Можно использовать символ `^` в начале хоста, чтобы отказаться от автоматического учета поддоменов.
|
||||||
|
|
||||||
Список доменов РКН может быть получен скриптами
|
Список доменов РКН может быть получен скриптами
|
||||||
@@ -1848,7 +1919,7 @@ nfqws начнет получать адреса пакетов из локал
|
|||||||
`DESYNC_MARK_POSTNAT=0x20000000`
|
`DESYNC_MARK_POSTNAT=0x20000000`
|
||||||
|
|
||||||
***Если раскоментировано, пометка пакетов, которые должны быть обработаны zapret.***\
|
***Если раскоментировано, пометка пакетов, которые должны быть обработаны zapret.***\
|
||||||
`#FILTER_MARK_POSTNAT=0x10000000`
|
`#FILTER_MARK=0x10000000`
|
||||||
|
|
||||||
Бит должен быть установлен вашими собственными правилами.
|
Бит должен быть установлен вашими собственными правилами.
|
||||||
* Для iptables - в цепочках mangle PREROUTING и mangle OUTPUT перед правилами zapret (iptables -I _после_ применения правил zapret).
|
* Для iptables - в цепочках mangle PREROUTING и mangle OUTPUT перед правилами zapret (iptables -I _после_ применения правил zapret).
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# this custom script runs desync to all discord media packets
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
NFQWS_OPT_DESYNC_DISCORD_MEDIA="${NFQWS_OPT_DESYNC_DISCORD_MEDIA:---dpi-desync=fake}"
|
||||||
|
DISCORD_MEDIA_PORT_RANGE="${DISCORD_MEDIA_PORT_RANGE:-50000-50099}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_DISCORD_MEDIA
|
||||||
|
alloc_qnum QNUM_DISCORD_MEDIA
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
local opt="--qnum=$QNUM_DISCORD_MEDIA $NFQWS_OPT_DESYNC_DISCORD_MEDIA"
|
||||||
|
do_nfqws $1 $DNUM_DISCORD_MEDIA "$opt"
|
||||||
|
}
|
||||||
|
# size = 156 (8 udp header + 148 payload) && payload starts with 0x01000000
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local DISABLE_IPV6=1
|
||||||
|
local port_range=$(replace_char - : $DISCORD_MEDIA_PORT_RANGE)
|
||||||
|
local f="-p udp --dport $port_range -m u32 --u32"
|
||||||
|
# this is simplified test to skip writing monstrous rule. instead of checking 64 bytes for zeroes only check 2 dwords for zero
|
||||||
|
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=0x52&&0>>22&0x3C@8=0x00010046&&0>>22&0x3C@16=0&&0>>22&0x3C@76=0" '' $QNUM_DISCORD_MEDIA
|
||||||
|
}
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
# stop logic is not required
|
||||||
|
|
||||||
|
local DISABLE_IPV6=1
|
||||||
|
local f="udp dport $DISCORD_MEDIA_PORT_RANGE udp length == 82 @ih,0,32 0x00010046 @ih,64,128 0x00000000000000000000000000000000 @ih,192,128 0x00000000000000000000000000000000 @ih,320,128 0x00000000000000000000000000000000 @ih,448,128 0x00000000000000000000000000000000"
|
||||||
|
nft_fw_nfqws_post "$f" '' $QNUM_DISCORD_MEDIA
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# this custom script runs desync to all stun packets
|
||||||
|
|
||||||
|
# can override in config :
|
||||||
|
NFQWS_OPT_DESYNC_STUN="${NFQWS_OPT_DESYNC_STUN:---dpi-desync=fake}"
|
||||||
|
|
||||||
|
alloc_dnum DNUM_STUN4ALL
|
||||||
|
alloc_qnum QNUM_STUN4ALL
|
||||||
|
|
||||||
|
zapret_custom_daemons()
|
||||||
|
{
|
||||||
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
|
local opt="--qnum=$QNUM_STUN4ALL $NFQWS_OPT_DESYNC_STUN"
|
||||||
|
do_nfqws $1 $DNUM_STUN4ALL "$opt"
|
||||||
|
}
|
||||||
|
# size = 156 (8 udp header + 148 payload) && payload starts with 0x01000000
|
||||||
|
zapret_custom_firewall()
|
||||||
|
{
|
||||||
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
|
local f='-p udp -m u32 --u32'
|
||||||
|
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=28:65535&&0>>22&0x3C@12=0x2112A442&&0>>22&0x3C@8&0xC0000003=0" "$f 44>>16=28:65535&&52=0x2112A442&&48&0xC0000003=0" $QNUM_STUN4ALL
|
||||||
|
}
|
||||||
|
zapret_custom_firewall_nft()
|
||||||
|
{
|
||||||
|
# stop logic is not required
|
||||||
|
|
||||||
|
local f="udp length >= 28 @ih,32,32 0x2112A442 @ih,0,2 0 @ih,30,2 0"
|
||||||
|
nft_fw_nfqws_post "$f" "$f" $QNUM_STUN4ALL
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
# this custom script runs desync to all wireguard handshake initiation packets
|
# this custom script runs desync to all wireguard handshake initiation packets
|
||||||
|
# NOTE : this works for original wireguard and may not work for 3rd party implementations such as xray
|
||||||
|
|
||||||
# can override in config :
|
# can override in config :
|
||||||
NFQWS_OPT_DESYNC_WG="${NFQWS_OPT_DESYNC_WG:---dpi-desync=fake}"
|
NFQWS_OPT_DESYNC_WG="${NFQWS_OPT_DESYNC_WG:---dpi-desync=fake}"
|
||||||
@@ -10,7 +11,7 @@ zapret_custom_daemons()
|
|||||||
{
|
{
|
||||||
# $1 - 1 - add, 0 - stop
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
local opt="--qnum=$QNUM_WG4ALL $NFQWS_OPT_DESYNC_WG"
|
local opt="--qnum=$QNUM_WG4ALL $NFQWS_OPT_DESYNC_WG"
|
||||||
do_nfqws $1 $DNUM_WG4ALL "$opt"
|
do_nfqws $1 $DNUM_WG4ALL "$opt"
|
||||||
}
|
}
|
||||||
# size = 156 (8 udp header + 148 payload) && payload starts with 0x01000000
|
# size = 156 (8 udp header + 148 payload) && payload starts with 0x01000000
|
||||||
@@ -18,13 +19,13 @@ zapret_custom_firewall()
|
|||||||
{
|
{
|
||||||
# $1 - 1 - run, 0 - stop
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
local f='-p udp -m u32 --u32'
|
local f='-p udp -m u32 --u32'
|
||||||
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=0x9c&&0>>22&0x3C@8=0x01000000" "$f 44>>16=0x9c&&48=0x01000000" $QNUM_WG4ALL
|
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=0x9c&&0>>22&0x3C@8=0x01000000" "$f 44>>16=0x9c&&48=0x01000000" $QNUM_WG4ALL
|
||||||
}
|
}
|
||||||
zapret_custom_firewall_nft()
|
zapret_custom_firewall_nft()
|
||||||
{
|
{
|
||||||
# stop logic is not required
|
# stop logic is not required
|
||||||
|
|
||||||
local f="udp length 156 @th,64,32 0x01000000"
|
local f="udp length 156 @ih,0,32 0x01000000"
|
||||||
nft_fw_nfqws_post "$f" "$f" $QNUM_WG4ALL
|
nft_fw_nfqws_post "$f" "$f" $QNUM_WG4ALL
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
Цель этих фильтров - отсекать полезную нагрузку в режиме ядра, не насилуя процессор перенаправлением целого потока на winws.
|
||||||
|
Задействуются через `winws --wf-raw=@filename`.
|
||||||
|
Однако, язык фильтров windivert не содержит операций с битовыми полями, сдвигов и побитовой логики.
|
||||||
|
Поэтому фильтры получились более слабыми, способными передавать неправильную нагрузку.
|
||||||
|
Дофильтрация производится силами winws.
|
||||||
|
|
||||||
|
Описание языка фильтров : https://reqrypt.org/windivert-doc.html#filter_language
|
||||||
|
Пример инстанса для пробития медиапотоков в discord : `winws --wf-raw=@windivert.discord_media+stun.txt --filter-l7=stun,discord --dpi-desync=fake`
|
||||||
|
|
||||||
|
|
||||||
|
These filters are invoked using `winws --wf-raw=@filename`.
|
||||||
|
Filters are kernel mode and save great amount of CPU.
|
||||||
|
However windivert cannot filter by bit fields, lacks shift and bitwise logic operations.
|
||||||
|
Filters are relaxed and can pass wrong payloads. Finer filtering is done by winws.
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
!impostor and !loopback and
|
||||||
|
(outbound and
|
||||||
|
((ip and
|
||||||
|
udp.DstPort>=50000 and udp.DstPort<=50099 and
|
||||||
|
udp.PayloadLength=74 and
|
||||||
|
udp.Payload32[0]=0x00010046 and
|
||||||
|
udp.Payload32[2]=0 and
|
||||||
|
udp.Payload32[3]=0 and
|
||||||
|
udp.Payload32[4]=0 and
|
||||||
|
udp.Payload32[5]=0 and
|
||||||
|
udp.Payload32[6]=0 and
|
||||||
|
udp.Payload32[7]=0 and
|
||||||
|
udp.Payload32[8]=0 and
|
||||||
|
udp.Payload32[9]=0 and
|
||||||
|
udp.Payload32[10]=0 and
|
||||||
|
udp.Payload32[11]=0 and
|
||||||
|
udp.Payload32[12]=0 and
|
||||||
|
udp.Payload32[13]=0 and
|
||||||
|
udp.Payload32[14]=0 and
|
||||||
|
udp.Payload32[15]=0 and
|
||||||
|
udp.Payload32[16]=0 and
|
||||||
|
udp.Payload32[17]=0)
|
||||||
|
or
|
||||||
|
(udp.PayloadLength>=20 and
|
||||||
|
udp.Payload32[1]=0x2112A442 and udp.Payload[0]<0x40)) and
|
||||||
|
( ((ip.DstAddr < 127.0.0.1 or ip.DstAddr > 127.255.255.255) and (ip.DstAddr < 10.0.0.0 or ip.DstAddr > 10.255.255.255) and (ip.DstAddr < 192.168.0.0 or ip.DstAddr > 192.168.255.255) and (ip.DstAddr < 172.16.0.0 or ip.DstAddr > 172.31.255.255) and (ip.DstAddr < 169.254.0.0 or ip.DstAddr > 169.254.255.255)) or
|
||||||
|
((ipv6.DstAddr > ::1) and (ipv6.DstAddr < 2001::0 or ipv6.DstAddr >= 2001:1::0) and (ipv6.DstAddr < fc00::0 or ipv6.DstAddr >= fe00::0) and (ipv6.DstAddr < fe80::0 or ipv6.DstAddr >= fec0::0) and (ipv6.DstAddr < ff00::0 or ipv6.DstAddr >= ffff::0))
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
!impostor and !loopback and
|
||||||
|
(outbound and
|
||||||
|
udp.DstPort>=50000 and udp.DstPort<=50099 and
|
||||||
|
udp.PayloadLength=74 and
|
||||||
|
udp.Payload32[0]=0x00010046 and
|
||||||
|
udp.Payload32[2]=0 and
|
||||||
|
udp.Payload32[3]=0 and
|
||||||
|
udp.Payload32[4]=0 and
|
||||||
|
udp.Payload32[5]=0 and
|
||||||
|
udp.Payload32[6]=0 and
|
||||||
|
udp.Payload32[7]=0 and
|
||||||
|
udp.Payload32[8]=0 and
|
||||||
|
udp.Payload32[9]=0 and
|
||||||
|
udp.Payload32[10]=0 and
|
||||||
|
udp.Payload32[11]=0 and
|
||||||
|
udp.Payload32[12]=0 and
|
||||||
|
udp.Payload32[13]=0 and
|
||||||
|
udp.Payload32[14]=0 and
|
||||||
|
udp.Payload32[15]=0 and
|
||||||
|
udp.Payload32[16]=0 and
|
||||||
|
udp.Payload32[17]=0 and
|
||||||
|
(ip.DstAddr < 127.0.0.1 or ip.DstAddr > 127.255.255.255) and (ip.DstAddr < 10.0.0.0 or ip.DstAddr > 10.255.255.255) and (ip.DstAddr < 192.168.0.0 or ip.DstAddr > 192.168.255.255) and (ip.DstAddr < 172.16.0.0 or ip.DstAddr > 172.31.255.255) and (ip.DstAddr < 169.254.0.0 or ip.DstAddr > 169.254.255.255)
|
||||||
|
)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
!impostor and !loopback and
|
||||||
|
(outbound and
|
||||||
|
udp.PayloadLength>=20 and
|
||||||
|
udp.Payload32[1]=0x2112A442 and udp.Payload[0]<0x40 and
|
||||||
|
( ((ip.DstAddr < 127.0.0.1 or ip.DstAddr > 127.255.255.255) and (ip.DstAddr < 10.0.0.0 or ip.DstAddr > 10.255.255.255) and (ip.DstAddr < 192.168.0.0 or ip.DstAddr > 192.168.255.255) and (ip.DstAddr < 172.16.0.0 or ip.DstAddr > 172.31.255.255) and (ip.DstAddr < 169.254.0.0 or ip.DstAddr > 169.254.255.255)) or
|
||||||
|
((ipv6.DstAddr > ::1) and (ipv6.DstAddr < 2001::0 or ipv6.DstAddr >= 2001:1::0) and (ipv6.DstAddr < fc00::0 or ipv6.DstAddr >= fe00::0) and (ipv6.DstAddr < fe80::0 or ipv6.DstAddr >= fec0::0) and (ipv6.DstAddr < ff00::0 or ipv6.DstAddr >= ffff::0))
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
!impostor and !loopback and
|
||||||
|
(outbound and
|
||||||
|
udp.PayloadLength=148 and
|
||||||
|
udp.Payload[0]=0x01 and
|
||||||
|
( ((ip.DstAddr < 127.0.0.1 or ip.DstAddr > 127.255.255.255) and (ip.DstAddr < 10.0.0.0 or ip.DstAddr > 10.255.255.255) and (ip.DstAddr < 192.168.0.0 or ip.DstAddr > 192.168.255.255) and (ip.DstAddr < 172.16.0.0 or ip.DstAddr > 172.31.255.255) and (ip.DstAddr < 169.254.0.0 or ip.DstAddr > 169.254.255.255)) or
|
||||||
|
((ipv6.DstAddr > ::1) and (ipv6.DstAddr < 2001::0 or ipv6.DstAddr >= 2001:1::0) and (ipv6.DstAddr < fc00::0 or ipv6.DstAddr >= fe00::0) and (ipv6.DstAddr < fe80::0 or ipv6.DstAddr >= fec0::0) and (ipv6.DstAddr < ff00::0 or ipv6.DstAddr >= ffff::0))
|
||||||
|
)
|
||||||
|
)
|
||||||
+7
-4
@@ -25,7 +25,7 @@
|
|||||||
memcpy(elem->str, keystr, keystr_len); \
|
memcpy(elem->str, keystr, keystr_len); \
|
||||||
elem->str[keystr_len] = 0; \
|
elem->str[keystr_len] = 0; \
|
||||||
oom = false; \
|
oom = false; \
|
||||||
HASH_ADD_KEYPTR(hh, *ppool, elem->str, strlen(elem->str), elem); \
|
HASH_ADD_KEYPTR(hh, *ppool, elem->str, keystr_len, elem); \
|
||||||
if (oom) \
|
if (oom) \
|
||||||
{ \
|
{ \
|
||||||
free(elem->str); \
|
free(elem->str); \
|
||||||
@@ -33,9 +33,12 @@
|
|||||||
return false; \
|
return false; \
|
||||||
}
|
}
|
||||||
#define ADD_HOSTLIST_POOL(etype, ppool, keystr, keystr_len, flg) \
|
#define ADD_HOSTLIST_POOL(etype, ppool, keystr, keystr_len, flg) \
|
||||||
ADD_STR_POOL(etype,ppool,keystr,keystr_len); \
|
etype *elem_find; \
|
||||||
elem->flags = flg;
|
HASH_FIND(hh, *ppool, keystr, keystr_len, elem_find); \
|
||||||
|
if (!elem_find) { \
|
||||||
|
ADD_STR_POOL(etype,ppool,keystr,keystr_len); \
|
||||||
|
elem->flags = flg; \
|
||||||
|
}
|
||||||
|
|
||||||
#undef uthash_nonfatal_oom
|
#undef uthash_nonfatal_oom
|
||||||
#define uthash_nonfatal_oom(elt) ut_oom_recover(elt)
|
#define uthash_nonfatal_oom(elt) ut_oom_recover(elt)
|
||||||
|
|||||||
+7
-4
@@ -25,7 +25,7 @@
|
|||||||
memcpy(elem->str, keystr, keystr_len); \
|
memcpy(elem->str, keystr, keystr_len); \
|
||||||
elem->str[keystr_len] = 0; \
|
elem->str[keystr_len] = 0; \
|
||||||
oom = false; \
|
oom = false; \
|
||||||
HASH_ADD_KEYPTR(hh, *ppool, elem->str, strlen(elem->str), elem); \
|
HASH_ADD_KEYPTR(hh, *ppool, elem->str, keystr_len, elem); \
|
||||||
if (oom) \
|
if (oom) \
|
||||||
{ \
|
{ \
|
||||||
free(elem->str); \
|
free(elem->str); \
|
||||||
@@ -33,9 +33,12 @@
|
|||||||
return false; \
|
return false; \
|
||||||
}
|
}
|
||||||
#define ADD_HOSTLIST_POOL(etype, ppool, keystr, keystr_len, flg) \
|
#define ADD_HOSTLIST_POOL(etype, ppool, keystr, keystr_len, flg) \
|
||||||
ADD_STR_POOL(etype,ppool,keystr,keystr_len); \
|
etype *elem_find; \
|
||||||
elem->flags = flg;
|
HASH_FIND(hh, *ppool, keystr, keystr_len, elem_find); \
|
||||||
|
if (!elem_find) { \
|
||||||
|
ADD_STR_POOL(etype,ppool,keystr,keystr_len); \
|
||||||
|
elem->flags = flg; \
|
||||||
|
}
|
||||||
|
|
||||||
#undef uthash_nonfatal_oom
|
#undef uthash_nonfatal_oom
|
||||||
#define uthash_nonfatal_oom(elt) ut_oom_recover(elt)
|
#define uthash_nonfatal_oom(elt) ut_oom_recover(elt)
|
||||||
|
|||||||
Reference in New Issue
Block a user