mirror of
https://github.com/bol-van/zapret.git
synced 2025-05-24 22:32:58 +03:00
nfqws: conntrack
This commit is contained in:
@@ -189,3 +189,7 @@ limited MacOS support
|
||||
v38
|
||||
|
||||
MacOS easy install
|
||||
|
||||
v39
|
||||
|
||||
nfqws: conntrack, wssize
|
||||
|
@@ -135,7 +135,9 @@ nfqws takes the following parameters:
|
||||
--qnum=<nfqueue_number>
|
||||
--wsize=<window_size> ; set window size. 0 = do not modify (obsolete !)
|
||||
--wsize=<winsize>[:<scale_factor>] ; change window size in SYN,ACK packets. default is not to change scale factor (OBSOLETE !)
|
||||
--wssize=<winsize>[:<scale_factor>] ; change window size in all packets except SYN,ACK. default scale factor is 0.
|
||||
--wssize=<winsize>[:<scale_factor>] ; change window size in outgoing packets. default scale factor is 0. (see CONNTRACK)
|
||||
--wssize-cutoff=N ; apply server wsize only to packet numbers less than N
|
||||
--ctrack-timeouts=S:E:F ; internal conntrack timeouts for SYN, ESTABLISHED and FIN stages. default 60:300:60
|
||||
--hostcase ; change Host: => host:
|
||||
--hostspell=HoSt ; exact spelling of the "Host" header. must be 4 chars. default is "host"
|
||||
--hostnospace ; remove space after Host: and add it to User-Agent: to preserve packet size
|
||||
@@ -220,8 +222,8 @@ If, instead of ACK or SACK, there is an RST packet with minimal delay, DPI cuts
|
||||
If the RST is after a full ACK after a delay of about ping to the server, then probably DPI acts
|
||||
on the server response. The DPI may be satisfied with good ClientHello and stop monitoring the TCP session
|
||||
without checking ServerHello. Then you were lucky. 'fake' option could work.
|
||||
If it does not stop monitoring and persistently checks the ServerHello, also performing reconstruction of TCP segments,
|
||||
doing something about it is hardly possible without the help of the server.
|
||||
If it does not stop monitoring and persistently checks the ServerHello, --wssize parameter may help (see CONNTRACK).
|
||||
Otherwise it is hardly possible to overcome this without the help of the server.
|
||||
The best solution is to enable TLS 1.3 support on the server. TLS 1.3 sends the server certificate in encrypted form.
|
||||
This is recommendation to all admins of blocked sites. Enable TLS 1.3. You will give more opportunities to overcome DPI.
|
||||
|
||||
@@ -253,6 +255,37 @@ Hypervisor forcibly changes ttl and does not forward fake packets.
|
||||
Set up bridge networking.
|
||||
|
||||
|
||||
CONNTRACK
|
||||
nfqws is equipped with minimalicstic connection tracking system (conntrack)
|
||||
It's enabled if some specific DPI circumvention methods are involved. At the moment it's --wssize parameter.
|
||||
Conntrack can track connection phase : SYN,ESTABLISHED,FIN , packet counts in both directions , sequence numbers.
|
||||
It can be fed with unidirectional or bidirectional packets.
|
||||
A SYN or SYN,ACK packet creates an entry in the conntrack table.
|
||||
That's why iptables redirection must start with the first packet although can be cut later using connbytes filter.
|
||||
A connection is deleted from the table as soon as it's no more required to satisfy nfqws needs or when a timeout happens.
|
||||
There're 3 timeouts for each connection state. They can be changed in --ctrack-timeouts parameter.
|
||||
|
||||
--wssize changes tcp window size for the server to force it to send split replies.
|
||||
In order for this to affect all server operating systems, it is necessary to change the window size in each outgoing packet
|
||||
before sending the message, the answer to which must be split (for example, TLS ClientHello).
|
||||
That's why conntrack is required to know when to stop applying low window size.
|
||||
If you do not stop and set the low wssize all the time, the speed will drop catastrophically.
|
||||
Linux can overcome this using connbytes filter but other OS may not include similar filter.
|
||||
In http(s) case wssize stops after the first http request or TLS ClientHello.
|
||||
If you deal with a non-http(s) protocol you need --wssize-cutoff. It sets the number of the outgoing packet where wssize stops.
|
||||
If your protocol is prone to long inactivity, you should increase ESTABLISHED phase timeout using --ctrack-timeouts.
|
||||
Default timeout is low - only 5 mins.
|
||||
Don't forget that nfqws feeds with redirected packets. If you have limited redirection with connbytes
|
||||
ESTABLISHED entries can remain in the table until dropped by timeout.
|
||||
To diagnose conntrack state send SIGUSR1 signal to nfqws : killall -SIGUSR1 nfqws.
|
||||
nfqws will dump current conntrack table to stdout.
|
||||
|
||||
Typically, in a SYN packet, client sends TCP extension "scaling factor" in addition to window size.
|
||||
scaling factor is the power of two by which the window size is multiplied : 0=>1, 1=>2, 2=>4, ..., 8=>256, ...
|
||||
The wssize parameter specifies the scaling factor after a colon.
|
||||
Scaling factor can only decrease, increase is blocked to prevent the server from exceeding client's window size.
|
||||
To force a TLS server to fragment ServerHello message to avoid hostname detection on DPI use --wssize=1:6
|
||||
|
||||
tpws
|
||||
-----
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
zapret v.38
|
||||
zapret v.39
|
||||
|
||||
English
|
||||
-------
|
||||
@@ -179,7 +179,9 @@ nfqws
|
||||
--uid=uid[:gid] ; менять uid процесса
|
||||
--qnum=N ; номер очереди N
|
||||
--wsize=<winsize>[:<scale_factor>] ; менять tcp window size на указанный размер в SYN,ACK. если не задан scale_factor, то он не меняется (устарело !)
|
||||
--wssize=<winsize>[:<scale_factor>] ; менять tcp window size на указанный размер во всех пакетах, кроме SYN,ACK. scale_factor по умолчанию 0.
|
||||
--wssize=<winsize>[:<scale_factor>] ; менять tcp window size на указанный размер в исходящих пакетах. scale_factor по умолчанию 0. (см. conntrack !)
|
||||
--wssize-cutoff=N ; применять изменение server window size в исходящих пакетах по номеру меньше N
|
||||
--ctrack-timeouts=S:E:F ; таймауты внутреннего conntrack в состояниях SYN, ESTABLISHED, FIN. по умолчанию 60:300:60
|
||||
--hostcase ; менять регистр заголовка "Host:" по умолчанию на "host:".
|
||||
--hostnospace ; убрать пробел после "Host:" и переместить его в конец значения "User-Agent:" для сохранения длины пакета
|
||||
--hostspell=HoST ; точное написание заголовка Host (можно "HOST" или "HoSt"). автоматом включает --hostcase
|
||||
@@ -265,8 +267,9 @@ disorder2 и split2 не предполагают отсылку фейк пак
|
||||
тогда вероятно DPI реагирует на ответ сервера.
|
||||
DPI может отстать от потока, если ClientHello его удовлетворил и не проверять ServerHello.
|
||||
Тогда вам повезло. Вариант fake может сработать.
|
||||
Если же он не отстает и упорно проверяет ServerHello, еще и выполняя реконструкцию сегментов TCP,
|
||||
то сделать с этим что-либо вряд ли возможно без помощи со стороны сервера.
|
||||
Если же он не отстает и упорно проверяет ServerHello, то можно попробовать заставить сервер высылать ServerHello частями
|
||||
через параметр --wssize (см. conntrack).
|
||||
Если и это не помогает, то сделать с этим что-либо вряд ли возможно без помощи со стороны сервера.
|
||||
Лучшее решение - включить на сервере поддержку TLS 1.3. В нем сертификат сервера передается в зашифрованном виде.
|
||||
Это рекомендация ко всем админам блокируемых сайтов. Включайте TLS 1.3. Так вы дадите больше возможностей преодолеть DPI.
|
||||
|
||||
@@ -306,6 +309,41 @@ mark нужен, чтобы сгенерированный поддельный
|
||||
Изнутри VM от virtualbox и vmware в режиме NAT не работают многие техники пакетной магии nfqws.
|
||||
Принудительно заменяется ttl, не проходят фейк пакеты. Необходимо настроить сеть в режиме bridge.
|
||||
|
||||
CONNTRACK
|
||||
nfqws оснащен ограниченной реализацией слежения за состоянием tcp соединений (conntrack).
|
||||
Он включается для реализации некоторых методов противодействия DPI. На текущий момент это параметр --wssize.
|
||||
conntrack способен следить за фазой соединения : SYN,ESTABLISHED,FIN , количеством пакетов в каждую сторону, sequence numbers.
|
||||
conntrack способен "кормиться" пакетами в обе или только в одну сторону.
|
||||
Соединение попадает в таблицу при обнаружении пакетов с выставленными флагами SYN или SYN,ACK.
|
||||
Поэтому если необходим conntrack, в правилах перенаправления iptables соединение должно идти на nfqws с самого первого пакета,
|
||||
хотя затем может обрываться по фильтру connbytes.
|
||||
conntrack - простенький, он не писался с учетом всевозможных атак на соединение, он не проверяет
|
||||
пакеты на валидность sequence numbers или чексумму. Его задача - лишь обслуживание нужд nfqws, он обычно
|
||||
кормится только исходящим трафиком, потому нечувствителен к подменам со стороны внешней сети.
|
||||
Соединение удаляется из таблицы, как только отпадает нужда в слежении за ним или по таймауту неактивности.
|
||||
Существуют отдельные таймауты на каждую фазу соединения. Они могут быть изменены параметром --ctrack-timeouts.
|
||||
|
||||
--wssize позволяет изменить с клиента размер tcp window для сервера, чтобы он послал следующие ответы разбитыми на части.
|
||||
Чтобы это подействовало на все серверные ОС, необходимо менять window size в каждом исходящем с клиента пакете до отсылки сообщения,
|
||||
ответ на который должен быть разбит (например, TLS ClientHello). Именно поэтому и необходим conntrack, чтобы
|
||||
знать когда надо остановиться. Если не остановиться и все время устанавливать низкий wssize, скорость упадет катастрофически.
|
||||
В linux это может быть купировано через connbytes, но в BSD системах такой возможности нет.
|
||||
В случае http(s) останавливаемся сразу после отсылки первого http запроса или TLS ClientHello.
|
||||
Если вы имеете дело с не http(s), то вам потребуется параметр --wssize-cutoff. Он устанавливает номер исходящего
|
||||
пакета, с которого действие wssize прекращается. Если ваш протокол склонен к долгому бездействию, следует увеличить
|
||||
таймаут фазы ESTABLISHED через параметр --ctrack-timeouts. Таймаут по умолчанию низкий - всего 5 минут.
|
||||
Не забывайте, что nfqws кормится приходящими на него пакетами. Если вы ограничили поступление пакетов через connbytes,
|
||||
то в таблице могут остаться повисшие соединения в фазе ESTABLISHED, которые отвалятся только по таймауту.
|
||||
Для диагностики состояния conntrack пошлите сигнал SIGUSR1 процессу nfqws : killall -SIGUSR1 nfqws.
|
||||
Текущая таблица будет выведена nfqws в stdout.
|
||||
|
||||
Обычно в SYN пакете клиент отсылает кроме window size еще и TCP extension "scaling factor".
|
||||
scaling factor представляет себя степень двойки, на которую умножается window size : 0=>1, 1=>2, 2=>4, ..., 8=>256, ...
|
||||
В параметре wssize указывается scaling factor указывается через двоеточие.
|
||||
Scaling factor может только снижаться, увеличение заблокировано, чтобы не допустить превышение размера окна со стороны сервера.
|
||||
Для принуждения сервера к фрагментации ServerHello, чтобы избежать просекание имени сервера из сертификата сервера на DPI,
|
||||
лучше всего использовать --wssize=1:6
|
||||
|
||||
|
||||
tpws
|
||||
-----
|
||||
|
Reference in New Issue
Block a user