mirror of
https://github.com/bol-van/zapret.git
synced 2025-03-14 20:31:37 +03:00
Merge branch 'bol-van:master' into master
This commit is contained in:
commit
d3f4924ebb
@ -325,9 +325,9 @@ dvtws, собираемый из тех же исходников (см. [док
|
|||||||
|
|
||||||
* **method** - начало метода HTTP ('GET', 'POST', 'HEAD', ...). Метод обычно всегда находится на позиции 0, но поддерживается и нахождение метода после дурение методом `--methodeol` от tpws. Тогда позиция может стать 1 или 2.
|
* **method** - начало метода HTTP ('GET', 'POST', 'HEAD', ...). Метод обычно всегда находится на позиции 0, но поддерживается и нахождение метода после дурение методом `--methodeol` от tpws. Тогда позиция может стать 1 или 2.
|
||||||
* **host** - начало имени хоста в известном протоколе (http, TLS)
|
* **host** - начало имени хоста в известном протоколе (http, TLS)
|
||||||
* **endhost** - конец имени хоста
|
* **endhost** - байт, следующий за последним байтом имени хоста
|
||||||
* **sld** - начало домена 2 уровня в имени хоста
|
* **sld** - начало домена 2 уровня в имени хоста
|
||||||
* **endsld** - конец домена 2 уровня в имени хоста
|
* **endsld** - байт, следующий за последним байтом домена 2 уровня в имени хоста
|
||||||
* **midsld** - середина домена 2 уровня в имени хоста
|
* **midsld** - середина домена 2 уровня в имени хоста
|
||||||
* **sniext** - начало поля данных SNI extension в TLS. Любой extension состоит из 2-байтовых полей type и length, за ними идет поле данных.
|
* **sniext** - начало поля данных SNI extension в TLS. Любой extension состоит из 2-байтовых полей type и length, за ними идет поле данных.
|
||||||
|
|
||||||
@ -424,29 +424,10 @@ DPI может отстать от потока, если ClientHello его у
|
|||||||
|
|
||||||
В документации по geneva это называется "TCB turnaround". Попытка ввести DPI в заблуждение относительно
|
В документации по geneva это называется "TCB turnaround". Попытка ввести DPI в заблуждение относительно
|
||||||
ролей клиента и сервера.
|
ролей клиента и сервера.
|
||||||
!!! Поскольку режим нарушает работу NAT, техника может сработать только если между атакующим устройством
|
|
||||||
|
Поскольку режим нарушает работу NAT, техника может сработать только если между атакующим устройством
|
||||||
и DPI нет NAT. Атака не сработает через NAT роутер, но может сработать с него.
|
и DPI нет NAT. Атака не сработает через NAT роутер, но может сработать с него.
|
||||||
Для реализации атаки в linux обязательно требуется отключить стандартное правило firewall,
|
Для реализации атаки на проходящий трафик требуются nftables и схема [POSTNAT](#nftables-для-nfqws).
|
||||||
дропающее инвалидные пакеты в цепочке OUTPUT. Например : `-A OUTPUT -m state --state INVALID -j DROP`
|
|
||||||
В openwrt можно отключить drop INVALID в OUTPUT и FORWARD через опцию в /etc/config/firewall:
|
|
||||||
|
|
||||||
```
|
|
||||||
config zone
|
|
||||||
option name 'wan'
|
|
||||||
.........
|
|
||||||
option masq_allow_invalid '1'
|
|
||||||
```
|
|
||||||
|
|
||||||
К сожалению, отключить только в OUTPUT таким образом нельзя. Но можно сделать иначе. Вписать в `/etc/firewall.user`:
|
|
||||||
|
|
||||||
```
|
|
||||||
iptables -D zone_wan_output -m comment --comment '!fw3' -j zone_wan_dest_ACCEPT
|
|
||||||
ip6tables -D zone_wan_output -m comment --comment '!fw3' -j zone_wan_dest_ACCEPT
|
|
||||||
```
|
|
||||||
|
|
||||||
Лучше делать так, потому что отсутствие дропа INVALID в FORWARD может привести к нежелательным утечкам пакетов из LAN.
|
|
||||||
Если не принять эти меры, отсылка SYN,ACK сегмента вызовет ошибку и операция будет прервана.
|
|
||||||
Остальные режимы тоже не сработают. Если поймете, что вам synack не нужен, обязательно верните правило дропа INVALID.
|
|
||||||
|
|
||||||
### РЕЖИМ SYNDATA
|
### РЕЖИМ SYNDATA
|
||||||
|
|
||||||
@ -480,7 +461,7 @@ conntrack - простенький, он не писался с учетом в
|
|||||||
|
|
||||||
`--wssize` позволяет изменить с клиента размер tcp window для сервера, чтобы он послал следующие ответы разбитыми на части.
|
`--wssize` позволяет изменить с клиента размер tcp window для сервера, чтобы он послал следующие ответы разбитыми на части.
|
||||||
Чтобы это подействовало на все серверные ОС, необходимо менять window size в каждом исходящем с клиента пакете до отсылки сообщения,
|
Чтобы это подействовало на все серверные ОС, необходимо менять window size в каждом исходящем с клиента пакете до отсылки сообщения,
|
||||||
ответ на который должен быть разбит (например, TLS ClientHello). Именно поэтому и необходим conntrack, чтобы
|
ответ на которое должен быть разбит (например, TLS ClientHello). Именно поэтому и необходим conntrack, чтобы
|
||||||
знать когда надо остановиться. Если не остановиться и все время устанавливать низкий wssize, скорость упадет катастрофически.
|
знать когда надо остановиться. Если не остановиться и все время устанавливать низкий wssize, скорость упадет катастрофически.
|
||||||
В linux это может быть купировано через connbytes, но в BSD системах такой возможности нет.
|
В linux это может быть купировано через connbytes, но в BSD системах такой возможности нет.
|
||||||
В случае http(s) останавливаемся сразу после отсылки первого http запроса или TLS ClientHello.
|
В случае http(s) останавливаемся сразу после отсылки первого http запроса или TLS ClientHello.
|
||||||
@ -521,7 +502,7 @@ nfqws поддерживает реассемблинг некоторых ви
|
|||||||
На текущий момент это TLS и QUIC ClientHello. Они бывает длинными, если в chrome включить пост-квантовую
|
На текущий момент это TLS и QUIC ClientHello. Они бывает длинными, если в chrome включить пост-квантовую
|
||||||
криптографию tls-kyber, и занимают как правило 2 или 3 пакета. kyber включен по умолчанию, начиная с chromium 124.
|
криптографию tls-kyber, и занимают как правило 2 или 3 пакета. kyber включен по умолчанию, начиная с chromium 124.
|
||||||
chrome рандомизирует фингерпринт TLS. SNI может оказаться как в начале, так и в конце, то есть
|
chrome рандомизирует фингерпринт TLS. SNI может оказаться как в начале, так и в конце, то есть
|
||||||
попасть любой пакет. stateful DPI обычно реассемблирует запрос целиком, и только потом
|
попасть в любой пакет. stateful DPI обычно реассемблирует запрос целиком, и только потом
|
||||||
принимает решение о блокировке.
|
принимает решение о блокировке.
|
||||||
В случае получения TLS или QUIC пакета с частичным ClientHello начинается процесс сборки, а пакеты
|
В случае получения TLS или QUIC пакета с частичным ClientHello начинается процесс сборки, а пакеты
|
||||||
задерживаются и не отсылаются до ее окончания. По окончании сборки пакеты проходит через десинхронизацию
|
задерживаются и не отсылаются до ее окончания. По окончании сборки пакеты проходит через десинхронизацию
|
||||||
|
@ -8,12 +8,15 @@ zapret_custom_firewall()
|
|||||||
{
|
{
|
||||||
# $1 - 1 - add, 0 - stop
|
# $1 - 1 - add, 0 - stop
|
||||||
|
|
||||||
local wan wanif
|
local wan wanif rule
|
||||||
|
|
||||||
# use IFACE_WAN if defined. if not - search for interfaces with default route.
|
[ "$DISABLE_IPV4" = "1" ] || {
|
||||||
wanif=${IFACE_WAN:-$(sed -nre 's/^([^\t]+)\t00000000\t[0-9A-F]{8}\t[0-9A-F]{4}\t[0-9]+\t[0-9]+\t[0-9]+\t00000000.*$/\1/p' /proc/net/route | sort -u | xargs)}
|
# use IFACE_WAN if defined. if not - search for interfaces with default route.
|
||||||
for wan in $wanif; do
|
wanif=${IFACE_WAN:-$(sed -nre 's/^([^\t]+)\t00000000\t[0-9A-F]{8}\t[0-9A-F]{4}\t[0-9]+\t[0-9]+\t[0-9]+\t00000000.*$/\1/p' /proc/net/route | sort -u | xargs)}
|
||||||
ipt_print_op $1 "-o $wan -j MASQUERADE" "keenetic udp fix"
|
for wan in $wanif; do
|
||||||
ipt_add_del $1 POSTROUTING -t nat -o $wan -j MASQUERADE
|
rule="-o $wan -p udp -m mark --mark $DESYNC_MARK/$DESYNC_MARK"
|
||||||
done
|
ipt_print_op $1 "$rule" "keenetic udp fix"
|
||||||
|
ipt_add_del $1 POSTROUTING -t nat $rule -j MASQUERADE
|
||||||
|
done
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
CFLAGS += -std=gnu99 -Os
|
CFLAGS += -std=gnu99 -Os -flto=auto
|
||||||
CFLAGS_BSD = -Wno-address-of-packed-member
|
CFLAGS_BSD = -Wno-address-of-packed-member
|
||||||
CFLAGS_WIN = -static
|
CFLAGS_WIN = -static
|
||||||
LIBS =
|
LIBS =
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
CC ?= cc
|
CC ?= cc
|
||||||
CFLAGS += -std=gnu99 -s -Os -Wno-address-of-packed-member
|
CFLAGS += -std=gnu99 -s -Os -Wno-address-of-packed-member -flto=auto
|
||||||
LIBS = -lz
|
LIBS = -lz
|
||||||
SRC_FILES = *.c crypto/*.c
|
SRC_FILES = *.c crypto/*.c
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
CFLAGS += -std=gnu99 -Os
|
CFLAGS += -std=gnu99 -Os
|
||||||
CFLAGS_BSD = -Wno-address-of-packed-member
|
CFLAGS_BSD = -Wno-address-of-packed-member -flto=auto
|
||||||
CFLAGS_MAC = -mmacosx-version-min=10.8
|
|
||||||
CFLAGS_CYGWIN = -Wno-address-of-packed-member -static
|
CFLAGS_CYGWIN = -Wno-address-of-packed-member -static
|
||||||
LIBS_LINUX = -lnetfilter_queue -lnfnetlink -lz
|
LIBS_LINUX = -lnetfilter_queue -lnfnetlink -lz
|
||||||
LIBS_BSD = -lz
|
LIBS_BSD = -lz
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
CC ?= cc
|
CC ?= cc
|
||||||
CFLAGS += -std=gnu99 -s -Os
|
CFLAGS += -std=gnu99 -s -Os -flto=auto
|
||||||
LIBS = -lz -lpthread
|
LIBS = -lz -lpthread
|
||||||
SRC_FILES = *.c
|
SRC_FILES = *.c
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
CFLAGS += -std=gnu99 -Os
|
CFLAGS += -std=gnu99 -Os -flto=auto
|
||||||
CFLAGS_BSD = -Wno-address-of-packed-member
|
CFLAGS_BSD = -Wno-address-of-packed-member
|
||||||
LIBS = -lz -lpthread
|
LIBS = -lz -lpthread
|
||||||
LIBS_ANDROID = -lz
|
LIBS_ANDROID = -lz
|
||||||
|
Loading…
x
Reference in New Issue
Block a user