mirror of
https://github.com/bol-van/zapret.git
synced 2025-04-19 13:32:58 +03:00
readme: rewrite intro part
This commit is contained in:
parent
bfb6042671
commit
626b1444dc
@ -1,7 +1,8 @@
|
|||||||
What is it for
|
What is it for
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Bypass the blocking of web sites http.
|
Bypass the blocking of http/https web sites on DPI without the use of third-party servers.
|
||||||
|
|
||||||
The project is mainly aimed at the Russian audience to fight russian regulator named "Roskomnadzor".
|
The project is mainly aimed at the Russian audience to fight russian regulator named "Roskomnadzor".
|
||||||
Some features of the project are russian reality specific (such as getting list of sites
|
Some features of the project are russian reality specific (such as getting list of sites
|
||||||
blocked by Roskomnadzor), but most others are common.
|
blocked by Roskomnadzor), but most others are common.
|
||||||
@ -9,10 +10,18 @@ blocked by Roskomnadzor), but most others are common.
|
|||||||
How it works
|
How it works
|
||||||
------------
|
------------
|
||||||
|
|
||||||
DPI providers have gaps. They happen because DPI rules are writtten for
|
In the simplest case you are dealing with passive DPI. Passive DPI can read passthrough traffic,
|
||||||
ordinary user programs, omitting all possible cases that are permissible by standards.
|
inject its own packets, but cannot drop packets.
|
||||||
This is done for simplicity and speed. It makes no sense to catch 0.01% hackers,
|
If the request is prohibited the passive DPI will inject its own RST packet and optionally http redirect packet.
|
||||||
because these blockings are quite simple and easily bypassed even by ordinary users.
|
If fake packets from DPI are only sent to client, you can use iptables commands to drop them if you can write
|
||||||
|
correct filter rules. This requires manual in-deep traffic analysis and tuning for specific ISP.
|
||||||
|
This is how we bypass the consequences of a ban trigger.
|
||||||
|
|
||||||
|
If the passive DPI sends an RST packet also to the server, there is nothing you can do about it.
|
||||||
|
Your task is to prevent ban trigger from firing up. Iptables alone will not work.
|
||||||
|
This project is aimed at preventing the ban rather than eliminating its consequences.
|
||||||
|
|
||||||
|
To do that send what DPI does not expect and what breaks its algorithm of recognizing requests and blocking them.
|
||||||
|
|
||||||
Some DPIs cannot recognize the http request if it is divided into TCP segments.
|
Some DPIs cannot recognize the http request if it is divided into TCP segments.
|
||||||
For example, a request of the form "GET / HTTP / 1.1 \ r \ nHost: kinozal.tv ......"
|
For example, a request of the form "GET / HTTP / 1.1 \ r \ nHost: kinozal.tv ......"
|
||||||
@ -21,79 +30,59 @@ Other DPIs stumble when the "Host:" header is written in another case: for examp
|
|||||||
Sometimes work adding extra space after the method: "GET /" => "GET /"
|
Sometimes work adding extra space after the method: "GET /" => "GET /"
|
||||||
or adding a dot at the end of the host name: "Host: kinozal.tv."
|
or adding a dot at the end of the host name: "Host: kinozal.tv."
|
||||||
|
|
||||||
|
There is also more advanced magic for bypassing DPI at the packet level.
|
||||||
|
|
||||||
|
|
||||||
How to put this into practice in the linux system
|
How to put this into practice in the linux system
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
|
|
||||||
How to make the system break the request into parts? You can pipe the entire TCP session
|
In short, the options can be classified according to the following scheme:
|
||||||
through transparent proxy, or you can replace the tcp window size field on the first incoming TCP packet with a SYN, ACK.
|
|
||||||
Then the client will think that the server has set a small window size for it and the first data segment
|
|
||||||
will send no more than the specified length. In subsequent packages, we will not change anything.
|
|
||||||
The further behavior of the system depends on the implemented algorithm in the OS.
|
|
||||||
Experience shows that linux always sends first packet no more than the specified
|
|
||||||
in window size length, the rest of the packets until some time sends no more than max (36, specified_size).
|
|
||||||
After a number of packets, the window scaling mechanism is triggered and starts taking
|
|
||||||
the scaling factor into account. The packet size becomes no more than max (36, specified_ramer << scale_factor).
|
|
||||||
The behavior is not very elegant, but since we do not affect the size of the incoming packets,
|
|
||||||
and the amount of data received in http is usually much higher than the amount sent, then visually
|
|
||||||
there will be only small delays.
|
|
||||||
Windows behaves in a similar case much more predictably. First segment
|
|
||||||
the specified length goes away, then the window size changes depending on the value,
|
|
||||||
sent in new tcp packets. That is, the speed is almost immediately restored to the possible maximum.
|
|
||||||
|
|
||||||
Its easy to intercept a packet with SYN, ACK using iptables.
|
1) Passive DPI not sending RST to the server. ISP tuned iptables commands can help.
|
||||||
However, the options for editing packets in iptables are severely limited.
|
This option is out of the scope of the project. If you do not allow ban trigger to fire, then you won’t have to
|
||||||
It’s not possible to change window size with standard modules.
|
deal with its consequences.
|
||||||
For this, we will use the NFQUEUE. This tool allows transfer packets to the processes running in user mode.
|
2) Modification of the TCP connection at the stream level. Implemented through a proxy or transparent proxy.
|
||||||
The process, accepting a packet, can change it, which is what we need.
|
3) Modification of TCP connection at the packet level. Implemented through the NFQUEUE queue handler and raw sockets.
|
||||||
|
|
||||||
iptables -t mangle -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -j NFQUEUE --queue-num 200 --queue-bypass
|
For options 2 and 3, tpws and nfqws programs are implemented, respectively.
|
||||||
|
You need to run them with the necessary parameters and redirect certain traffic with iptables.
|
||||||
|
|
||||||
It will queue the packets we need to the process that listens on the queue with the number 200.
|
To redirect a TCP connection to a transparent proxy, the following commands are used:
|
||||||
Process will replace the window size. PREROUTING will catch packets addressed to the host itself and routed packets.
|
|
||||||
That is, the solution works the same way as on the client, so on the router. On a PC-based or OpenWRT router.
|
|
||||||
In principle, this is enough.
|
|
||||||
However, with such an impact on TCP there will be a slight delay.
|
|
||||||
In order not to touch the hosts that are not blocked by the provider, you can make such a move.
|
|
||||||
Create a list of blocked domains, resolve them to IP addresses and save to ipset named "zapret".
|
|
||||||
Add to rule:
|
|
||||||
|
|
||||||
iptables -t mangle -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num 200 --queue-bypass
|
forwarded fraffic :
|
||||||
|
iptables -t nat -I PREROUTING -i <internal_interface> -p tcp --dport 80 -j DNAT --to 127.0.0.1:1188
|
||||||
|
outgoing traffic :
|
||||||
|
iptables -t nat -I OUTPUT -o <external_interface> -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.1:1188
|
||||||
|
|
||||||
Thus, the impact will be made only on ip addresses related to blocked sites.
|
DNAT on localhost works in the OUTPUT chain, but does not work in the PREROUTING chain without enabling the route_localnet parameter:
|
||||||
The list can be updated in scheduled task every few days.
|
|
||||||
|
|
||||||
If DPI cant be bypassed with splitting a request into segments, then sometimes helps changing case
|
sysctl -w net.ipv4.conf.<internal_interface>.route_localnet=1
|
||||||
of the "Host:" http header. We may not need a window size replacement, so the do not need PREROUTING chain.
|
|
||||||
Instead, we hang on outgoing packets in the POSTROUTING chain:
|
|
||||||
|
|
||||||
iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
|
You can use "-j REDIRECT --to-port 1188" instead of DNAT, but in this case the transparent proxy process
|
||||||
|
|
||||||
In this case, additional points are also possible. DPI can catch only the first http request, ignoring
|
|
||||||
subsequent requests in the keep-alive session. Then we can reduce the cpu load abandoning the processing of unnecessary packages.
|
|
||||||
|
|
||||||
iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:5 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
|
|
||||||
|
|
||||||
It happens that the provider monitors the entire HTTP session with keep-alive requests. In this case
|
|
||||||
it is not enough to restrict the TCP window when establishing a connection. Each http request must be splitted
|
|
||||||
to multiple TCP segments. This task is solved through the full proxying of traffic using
|
|
||||||
transparent proxy (TPROXY or DNAT). TPROXY does not work with connections originating from the local system
|
|
||||||
so this solution is applicable only on the router. DNAT works with local connections,
|
|
||||||
but there is a danger of entering into endless recursion, so the daemon is launched as a separate user,
|
|
||||||
and for this user, DNAT is disabled via "-m owner". Full proxying requires more resources than outbound packet
|
|
||||||
manipulation without reconstructing a TCP connection.
|
|
||||||
|
|
||||||
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to 127.0.0.1:1188
|
|
||||||
iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.1:1188
|
|
||||||
|
|
||||||
NOTE: DNAT on localhost works in the OUTPUT chain, but does not work in the PREROUTING chain without enabling the route_localnet parameter:
|
|
||||||
|
|
||||||
sysctl -w net.ipv4.conf.<incoming_interface_name>.route_localnet=1
|
|
||||||
|
|
||||||
You can use "-j REDIRECT --to-port 1188" instead of DNAT, but in this case the transpareny proxy process
|
|
||||||
should listen on the ip address of the incoming interface or on all addresses. Listen all - not good
|
should listen on the ip address of the incoming interface or on all addresses. Listen all - not good
|
||||||
in terms of security. Listening one (local) is possible, but in the case of automated
|
in terms of security. Listening one (local) is possible, but automated scripts will have to recognize it,
|
||||||
script will have to recognize it, then dynamically enter it into the command. In any case, additional efforts are required.
|
then dynamically enter it into the command. In any case, additional efforts are required.
|
||||||
|
|
||||||
|
Owner filter is necessary to prevent recursive redirection of connections from tpws itself.
|
||||||
|
tpws must be started under OS user "tpws".
|
||||||
|
|
||||||
|
|
||||||
|
NFQUEUE redirection of the outgoing traffic and forwarded traffic going towards the external interface,
|
||||||
|
can be done with the following commands:
|
||||||
|
|
||||||
|
iptables -t mangle -I POSTROUTING -o <external_interface> -p tcp --dport 80 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
|
||||||
|
In order not to touch the traffic to unblocked addresses, you can take a list of blocked hosts, resolve it
|
||||||
|
into IP addresses and put them to ipset 'zapret', then add a filter to the command:
|
||||||
|
|
||||||
|
iptables -t mangle -I POSTROUTING -o <external_interface> -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
|
||||||
|
Some DPIs catch only the first http request, ignoring subsequent requests in a keep-alive session.
|
||||||
|
Then we can reduce CPU load, refusing to process unnecessary packets.
|
||||||
|
|
||||||
|
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp --dport 80 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 2:4 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ip6tables
|
ip6tables
|
||||||
---------
|
---------
|
||||||
@ -131,7 +120,7 @@ It takes the following parameters:
|
|||||||
|
|
||||||
--debug=0|1 ; 1=print debug info
|
--debug=0|1 ; 1=print debug info
|
||||||
--qnum=<nfqueue_number>
|
--qnum=<nfqueue_number>
|
||||||
--wsize=<window_size> ; set window size. 0 = do not modify
|
--wsize=<window_size> ; set window size. 0 = do not modify (obsolete !)
|
||||||
--hostcase ; change Host: => host:
|
--hostcase ; change Host: => host:
|
||||||
--hostspell=HoSt ; exact spelling of the "Host" header. must be 4 chars. default is "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
|
--hostnospace ; remove space after Host: and add it to User-Agent: to preserve packet size
|
||||||
@ -360,10 +349,6 @@ The file /opt/zapret/config is used by various components of the system and cont
|
|||||||
It needs to be viewed and edited if necessary.
|
It needs to be viewed and edited if necessary.
|
||||||
Select MODE:
|
Select MODE:
|
||||||
|
|
||||||
nfqws_ipset - use nfqws on http, targets are filtered by ipset "zapret"
|
|
||||||
nfqws_ipset_https - use nfqws on http and https, targets are filtered by ipset "zapret"
|
|
||||||
nfqws_all - use nfqws on all http
|
|
||||||
nfqws_all_https - use nfqws on all http and https
|
|
||||||
nfqws_all_desync - use nfqws for DPI desync attack on all http and https
|
nfqws_all_desync - use nfqws for DPI desync attack on all http and https
|
||||||
nfqws_ipset_desync - use nfqws for DPI desync attack on http and https , targets filtered by ipset "zapret"
|
nfqws_ipset_desync - use nfqws for DPI desync attack on http and https , targets filtered by ipset "zapret"
|
||||||
nfqws_hostlist_desync - use nfqws for DPI desync attack on http and https , only to hostnames from hostlist
|
nfqws_hostlist_desync - use nfqws for DPI desync attack on http and https , only to hostnames from hostlist
|
||||||
|
142
docs/readme.txt
142
docs/readme.txt
@ -8,15 +8,26 @@ For english version refer to docs/readme.eng.txt
|
|||||||
Для чего это надо
|
Для чего это надо
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Обойти блокировки веб сайтов http.
|
Автономно, без задействования сторонних серверов, обойти блокировки веб сайтов http и https на DPI.
|
||||||
|
|
||||||
Как это работает
|
Как это работает
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
У провайдеров в DPI бывают бреши. Они случаются от того, что правила DPI пишут для
|
В самом простейшем случае вы имеете дело с пассивным DPI. Пассивный DPI может читать трафик
|
||||||
обычных пользовательских программ, опуская все возможные случаи, допустимые по стандартам.
|
из потока, может инжектить свои пакеты, но не может блокировать проходящие пакеты.
|
||||||
Это делается для простоты и скорости. Нет смысла ловить хакеров, которых 0.01%,
|
Если запрос "плохой", пассивный DPI инжектит пакет RST, опционально дополняя его пакетом http redirect.
|
||||||
ведь все равно эти блокировки обходятся довольно просто даже обычными пользователями.
|
Если фейк пакет инжектится только для клиента, в этом случае можно обойтись командами iptables
|
||||||
|
для дропа RST и/или редиректа на заглушку по определенным условиям, которые нужно подбирать
|
||||||
|
для каждого провайдера индивидуально. Так мы обходим последствия срабатывания триггера запрета.
|
||||||
|
Если пассивный DPI направляет пакет RST в том числе и серверу, то вы ничего с этим не сможете сделать.
|
||||||
|
Ваша задача - не допустить срабатывания триггера запрета. Одними iptables уже не обойдетесь.
|
||||||
|
Этот проект нацелен именно на предотвращение срабатывания запрета, а не ликвидацию его последствий.
|
||||||
|
|
||||||
|
Активный DPI ставится в разрез провода и может дропать пакеты по любым критериям,
|
||||||
|
в том числе распознавать TCP потоки и блокировать любые пакеты, принадлежащие потоку.
|
||||||
|
|
||||||
|
Как не допустить срабатывания триггера запрета ? Послать то, на что DPI не расчитывает
|
||||||
|
и что ломает ему алгоритм распознавания запросов и их блокировки.
|
||||||
|
|
||||||
Некоторые DPI не могут распознать http запрос, если он разделен на TCP сегменты.
|
Некоторые DPI не могут распознать http запрос, если он разделен на TCP сегменты.
|
||||||
Например, запрос вида "GET / HTTP/1.1\r\nHost: kinozal.tv......"
|
Например, запрос вида "GET / HTTP/1.1\r\nHost: kinozal.tv......"
|
||||||
@ -25,89 +36,66 @@ For english version refer to docs/readme.eng.txt
|
|||||||
Кое-где работает добавление дополнительного пробела после метода : "GET /" => "GET /"
|
Кое-где работает добавление дополнительного пробела после метода : "GET /" => "GET /"
|
||||||
или добавление точки в конце имени хоста : "Host: kinozal.tv."
|
или добавление точки в конце имени хоста : "Host: kinozal.tv."
|
||||||
|
|
||||||
|
Существует и более продвинутая магия, направленная на преодоление DPI на пакетном уровне.
|
||||||
|
|
||||||
|
|
||||||
Как это реализовать на практике в системе linux
|
Как это реализовать на практике в системе linux
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
|
||||||
Как заставить систему разбивать запрос на части ? Можно прогнать всю TCP сессию
|
Если кратко, то варианты можно классифицировать по следующей схеме :
|
||||||
через transparent proxy, а можно подменить поле tcp window size на первом входящем TCP пакете с SYN,ACK.
|
|
||||||
Тогда клиент подумает, что сервер установил для него маленький window size и первый сегмент с данными
|
|
||||||
отошлет не более указанной длины. В последующих пакетах мы не будем менять ничего.
|
|
||||||
Дальнейшее поведение системы по выбору размера отсылаемых пакетов зависит от реализованного
|
|
||||||
в ней алгоритма. Опыт показывает, что linux первый пакет всегда отсылает не более указанной
|
|
||||||
в window size длины, остальные пакеты до некоторых пор шлет не более max(36,указанный_размер).
|
|
||||||
После некоторого количества пакетов срабатывает механизм window scaling и начинает
|
|
||||||
учитываться фактор скалинга, размер пакетов становится не более max(36,указанный_рамер << scale_factor).
|
|
||||||
Не слишком изящное поведение, но поскольку на размеры входящик пакетов мы не влияем,
|
|
||||||
а объем принимаемых по http данных обычно гораздо выше объема отсылаемых, то визуально
|
|
||||||
появятся лишь небольшие задержки.
|
|
||||||
Windows ведет себя в аналогичном случае гораздо более предсказуемо. Первый сегмент
|
|
||||||
уходит указанной длины, дальше window size меняется в зависимости от значения,
|
|
||||||
присылаемого в новых tcp пакетах. То есть скорость почти сразу же восстанавливается
|
|
||||||
до возможного максимума.
|
|
||||||
|
|
||||||
Перехватить пакет с SYN,ACK не представляет никакой сложности средствами iptables.
|
1) Пассивный DPI, не отправляющий RST серверу. Помогут индивидуально настраиваемые под провайдера команды iptables.
|
||||||
Однако, возможности редактирования пакетов в iptables сильно ограничены.
|
На rutracker в разделе "обход блокировок - другие способы" по этому вопросу существует отдельная тема.
|
||||||
Просто так поменять window size стандартными модулями нельзя.
|
В данном проекте не рассматривается. Если вы не допустите срабатывание триггера запрета, то и не придется
|
||||||
Для этого мы воспользуемся средством NFQUEUE. Это средство позволяет
|
бороться с его последствиями.
|
||||||
передавать пакеты на обработку процессам, работающим в user mode.
|
2) Модификация TCP соединения на уровне потока. Реализуется через proxy или transparent proxy.
|
||||||
Процесс, приняв пакет, может его изменить, что нам и нужно.
|
3) Модификация TCP соединения на уровне пакетов. Реализуется через обработчик очереди NFQUEUE и raw сокеты.
|
||||||
|
|
||||||
iptables -t mangle -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -j NFQUEUE --queue-num 200 --queue-bypass
|
Для вариантов 2 и 3 реализованы программы tpws и nfqws соответственно.
|
||||||
|
Чтобы они работали, необходимо их запустить с нужными параметрами и перенаправить на них определенный трафик
|
||||||
|
средствами iptables.
|
||||||
|
|
||||||
Будет отдавать нужные нам пакеты процессу, слушающему на очереди с номером 200.
|
|
||||||
Он подменит window size. PREROUTING поймает как пакеты, адресованные самому хосту,
|
|
||||||
так и маршрутизируемые пакеты. То есть решение одинаково работает как на клиенте,
|
|
||||||
так и на роутере. На роутере на базе PC или на базе OpenWRT.
|
|
||||||
В принципе этого достаточно.
|
|
||||||
Однако, при таком воздействии на TCP будет небольшая задержка.
|
|
||||||
Чтобы не трогать хосты, которые не блокируются провайдером, можно сделать такой ход.
|
|
||||||
Создать список заблоченых доменов или скачать его с rublacklist.
|
|
||||||
Заресолвить все домены в ipv4 адреса. Загнать их в ipset с именем "zapret".
|
|
||||||
Добавить в правило :
|
|
||||||
|
|
||||||
iptables -t mangle -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num 200 --queue-bypass
|
Для перенаправления tcp соединения на transparent proxy используются команды следующего вида :
|
||||||
|
|
||||||
Таким образом воздействие будет производиться только на ip адреса, относящиеся к заблокированным сайтам.
|
проходящий трафик :
|
||||||
Список можно обновлять через cron раз в несколько дней.
|
iptables -t nat -I PREROUTING -i <внутренний_интерфейс> -p tcp --dport 80 -j DNAT --to 127.0.0.1:1188
|
||||||
Если обновлять через rublacklist, то это займет довольно долго. Более часа. Но ресурсов
|
исходящий трафик :
|
||||||
этот процесс не отнимает, так что никаких проблем это не вызовет, особенно, если система
|
iptables -t nat -I OUTPUT -o <внешний_интерфейс> -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.1:1188
|
||||||
работает постоянно.
|
|
||||||
|
|
||||||
Если DPI не обходится через разделение запроса на сегменты, то иногда срабатывает изменение
|
DNAT на localhost работает в цепочке OUTPUT, но не работает в цепочке PREROUTING без включения параметра route_localnet :
|
||||||
"Host:" на "host:". В этом случае нам может не понадобится замена window size, поэтому цепочка
|
|
||||||
PREROUTING нам не нужна. Вместо нее вешаемся на исходящие пакеты в цепочке POSTROUTING :
|
|
||||||
|
|
||||||
iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
|
sysctl -w net.ipv4.conf.<внутренний_интерфейс>.route_localnet=1
|
||||||
|
|
||||||
В этом случае так же возможны дополнительные моменты. DPI может ловить только первый http запрос, игнорируя
|
|
||||||
последующие запросы в keep-alive сессии. Тогда можем уменьшить нагрузку на проц, отказавшись от процессинга ненужных пакетов.
|
|
||||||
|
|
||||||
iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:5 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
|
|
||||||
|
|
||||||
Случается так, что провайдер мониторит всю HTTP сессию с keep-alive запросами. В этом случае
|
|
||||||
недостаточно ограничивать TCP window при установлении соединения. Необходимо посылать отдельными
|
|
||||||
TCP сегментами каждый новый запрос. Эта задача решается через полное проксирование трафика через
|
|
||||||
transparent proxy (TPROXY или DNAT). TPROXY не работает с соединениями, исходящими с локальной системы,
|
|
||||||
так что это решение применимо только на роутере. DNAT работает и с локальными соединениеми,
|
|
||||||
но имеется опасность входа в бесконечную рекурсию, поэтому демон запускается под отдельным пользователем,
|
|
||||||
и для этого пользователя отключается DNAT через "-m owner". Полное проксирование требует больше ресурсов
|
|
||||||
процессора, чем манипуляция с исходящими пакетами без реконструкции TCP соединения.
|
|
||||||
|
|
||||||
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to 127.0.0.1:1188
|
|
||||||
iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.1:1188
|
|
||||||
|
|
||||||
ПРИМЕЧАНИЕ: DNAT на localhost работает в цепочке OUTPUT, но не работает в цепочке PREROUTING без включения параметра route_localnet :
|
|
||||||
|
|
||||||
sysctl -w net.ipv4.conf.<incoming_interface_name>.route_localnet=1
|
|
||||||
|
|
||||||
Можно использовать "-j REDIRECT --to-port 1188" вместо DNAT , однако в этом случае процесс transparent proxy
|
Можно использовать "-j REDIRECT --to-port 1188" вместо DNAT , однако в этом случае процесс transparent proxy
|
||||||
должен слушать на ip адресе входящего интерфейса или на всех адресах. Слушать на всех - не есть хорошо
|
должен слушать на ip адресе входящего интерфейса или на всех адресах. Слушать на всех - не есть хорошо
|
||||||
с точки зрения безопасности. Слушать на одном (локальном) можно, но в случае автоматизированного
|
с точки зрения безопасности. Слушать на одном (локальном) можно, но в случае автоматизированного
|
||||||
скрипта придется его узнавать, потом динамически вписывать в команду. В любом случае требуются дополнительные усилия.
|
скрипта придется его узнавать, потом динамически вписывать в команду. В любом случае требуются дополнительные усилия.
|
||||||
|
|
||||||
|
Фильтр по owner необходим для исключения рекурсивного перенаправления соединений от самого tpws.
|
||||||
|
tpws запускается под пользователем "tpws", для него задается исключающее правило.
|
||||||
|
|
||||||
|
|
||||||
|
Для перенаправления на очередь NFQUEUE исходящего и проходящего в сторону внешнего интерфейса трафика используются
|
||||||
|
команды следующего вида :
|
||||||
|
|
||||||
|
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp --dport 80 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
|
||||||
|
|
||||||
|
Чтобы не трогать трафик на незаблокированные адреса, можно взять список заблокированных хостов, заресолвить его
|
||||||
|
в IP адреса и загнать в ipset zapret, затем добавить фильтр в команду :
|
||||||
|
|
||||||
|
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
|
||||||
|
DPI может ловить только первый http запрос, игнорируя последующие запросы в keep-alive сессии.
|
||||||
|
Тогда можем уменьшить нагрузку на проц, отказавшись от процессинга ненужных пакетов.
|
||||||
|
|
||||||
|
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp --dport 80 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 2:4 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
|
||||||
|
|
||||||
Если ваше устройство поддерживает аппаратное ускорение (flow offloading, hardware nat, hardware acceleration), то iptables могут не работать.
|
Если ваше устройство поддерживает аппаратное ускорение (flow offloading, hardware nat, hardware acceleration), то iptables могут не работать.
|
||||||
При включенном offloading пакет не проходит по обычному пути netfilter.
|
При включенном offloading пакет не проходит по обычному пути netfilter.
|
||||||
Необходимо его отключить. Да, ваш хилый роутер уже не потянет гигабит, даже 200-250 не потянет, а на торрентах и того меньше.
|
Необходимо его отключить. Да, ваш хилый роутер уже не потянет гигабит, даже 200-250 может не потянуть, а на торрентах и того меньше.
|
||||||
Но если у вас такой линк, и вы хотите продвинутых вещей от роутера, то вам стоит задуматься о покупке mini pc с двумя или более gigabit ethernet.
|
Но если у вас такой линк, и вы хотите продвинутых вещей от роутера, то вам стоит задуматься о покупке mini pc с двумя или более gigabit ethernet.
|
||||||
|
|
||||||
В новых ядрах (и в более старых, openwrt портировал изменение на 4.14) присутствует software flow offloading (SFO).
|
В новых ядрах (и в более старых, openwrt портировал изменение на 4.14) присутствует software flow offloading (SFO).
|
||||||
@ -121,6 +109,7 @@ Offload включается через специальный target в iptable
|
|||||||
Однако, openwrt не предусматривает выборочного управления offload. Если вы хотите с этим связаться,
|
Однако, openwrt не предусматривает выборочного управления offload. Если вы хотите с этим связаться,
|
||||||
вам придется городить свой собственный огород вокруг этого.
|
вам придется городить свой собственный огород вокруг этого.
|
||||||
|
|
||||||
|
|
||||||
Особенности применения ip6tables
|
Особенности применения ip6tables
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
@ -135,6 +124,7 @@ DNAT на localhost (::1) возможен только в цепочке OUTPUT
|
|||||||
откуда пришел пакет.
|
откуда пришел пакет.
|
||||||
NFQUEUE работает без изменений.
|
NFQUEUE работает без изменений.
|
||||||
|
|
||||||
|
|
||||||
Когда это работать не будет
|
Когда это работать не будет
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
@ -152,6 +142,7 @@ NFQUEUE работает без изменений.
|
|||||||
Мелкие провайдеры могут покупать услугу фильтрации у вышестоящих, чтобы самим не морочиться, и
|
Мелкие провайдеры могут покупать услугу фильтрации у вышестоящих, чтобы самим не морочиться, и
|
||||||
они уже будут применять DPI.
|
они уже будут применять DPI.
|
||||||
|
|
||||||
|
|
||||||
nfqws
|
nfqws
|
||||||
-----
|
-----
|
||||||
|
|
||||||
@ -163,7 +154,7 @@ nfqws
|
|||||||
--user=<username> ; менять uid процесса
|
--user=<username> ; менять uid процесса
|
||||||
--uid=uid[:gid] ; менять uid процесса
|
--uid=uid[:gid] ; менять uid процесса
|
||||||
--qnum=200 ; номер очереди
|
--qnum=200 ; номер очереди
|
||||||
--wsize=4 ; менять tcp window size на указанный размер
|
--wsize=4 ; менять tcp window size на указанный размер (устарело !)
|
||||||
--hostcase ; менять регистр заголовка "Host:" по умолчанию на "host:".
|
--hostcase ; менять регистр заголовка "Host:" по умолчанию на "host:".
|
||||||
--hostnospace ; убрать пробел после "Host:" и переместить его в конец значения "User-Agent:" для сохранения длины пакета
|
--hostnospace ; убрать пробел после "Host:" и переместить его в конец значения "User-Agent:" для сохранения длины пакета
|
||||||
--hostspell=HoST ; точное написание заголовка Host (можно "HOST" или "HoSt"). автоматом включает --hostcase
|
--hostspell=HoST ; точное написание заголовка Host (можно "HOST" или "HoSt"). автоматом включает --hostcase
|
||||||
@ -265,6 +256,7 @@ nfqws способен самостоятельно различать поме
|
|||||||
|
|
||||||
Почему --connbytes 2:4 : 2 - иногда данные идут в 3-м пакете 3-way handshake. 3 - стандартная ситуация. 4 - для надежности. на случай, если выполнялась одна ретрансмиссия
|
Почему --connbytes 2:4 : 2 - иногда данные идут в 3-м пакете 3-way handshake. 3 - стандартная ситуация. 4 - для надежности. на случай, если выполнялась одна ретрансмиссия
|
||||||
|
|
||||||
|
|
||||||
tpws
|
tpws
|
||||||
-----
|
-----
|
||||||
|
|
||||||
@ -386,6 +378,7 @@ tpws полностью работает на асинхронных сокет
|
|||||||
Это может быть полезно для скрытия факта использования VPN. Пониженный MTU - 1 из способов обнаружения
|
Это может быть полезно для скрытия факта использования VPN. Пониженный MTU - 1 из способов обнаружения
|
||||||
подозрительного подключения. С tcp proxy ваши соединения неотличимы от тех, что сделал бы сам шлюз.
|
подозрительного подключения. С tcp proxy ваши соединения неотличимы от тех, что сделал бы сам шлюз.
|
||||||
|
|
||||||
|
|
||||||
Способы получения списка заблокированных IP
|
Способы получения списка заблокированных IP
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
|
|
||||||
@ -475,6 +468,7 @@ zapret-ip.txt => zapret-ip6.txt
|
|||||||
Помещенные в них IP не участвуют в процессе.
|
Помещенные в них IP не участвуют в процессе.
|
||||||
zapret-hosts-user-exclude.txt может содержать домены, ipv4 и ipv6 адреса или подсети.
|
zapret-hosts-user-exclude.txt может содержать домены, ipv4 и ipv6 адреса или подсети.
|
||||||
|
|
||||||
|
|
||||||
ip2net
|
ip2net
|
||||||
------
|
------
|
||||||
|
|
||||||
@ -516,6 +510,7 @@ ip2net
|
|||||||
Учтите, что арифметика mul/div - целочисленная. При превышении разрядной сетки 32 bit результат непредсказуем.
|
Учтите, что арифметика mul/div - целочисленная. При превышении разрядной сетки 32 bit результат непредсказуем.
|
||||||
Не надо делать такое : 5000000/10000000. 1/2 - гораздо лучше.
|
Не надо делать такое : 5000000/10000000. 1/2 - гораздо лучше.
|
||||||
|
|
||||||
|
|
||||||
Фильтрация по именам доменов
|
Фильтрация по именам доменов
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
@ -537,6 +532,7 @@ init скрипт будет запускать tpws с листом zapret-host
|
|||||||
При использовании больших списков, в том числе списка РКН, оцените объем RAM на роутере !
|
При использовании больших списков, в том числе списка РКН, оцените объем RAM на роутере !
|
||||||
Если после запуска демона RAM под завязку или случаются oom, значит нужно отказаться от таких больших списков.
|
Если после запуска демона RAM под завязку или случаются oom, значит нужно отказаться от таких больших списков.
|
||||||
|
|
||||||
|
|
||||||
Проверка провайдера
|
Проверка провайдера
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
@ -561,10 +557,6 @@ init скрипт будет запускать tpws с листом zapret-host
|
|||||||
Его нужно просмотреть и при необходимости отредактировать.
|
Его нужно просмотреть и при необходимости отредактировать.
|
||||||
Выберите MODE :
|
Выберите MODE :
|
||||||
|
|
||||||
nfqws_ipset - использовать nfqws для модификации трафика на порт 80 только на IP из ipset "zapret"
|
|
||||||
nfqws_ipset_https - использовать nfqws для модификации трафика на порты 80 и 443 только на IP из ipset "zapret"
|
|
||||||
nfqws_all - использовать nfqws для модификации трафика на порт 80 для всех IP
|
|
||||||
nfqws_all_https - использовать nfqws для модификации трафика на порты 80 и 443 для всех IP
|
|
||||||
nfqws_all_desync - использовать nfqws для атаки десинхронизации DPI на http и https для всех IP
|
nfqws_all_desync - использовать nfqws для атаки десинхронизации DPI на http и https для всех IP
|
||||||
nfqws_ipset_desync - использовать nfqws для атаки десинхронизации DPI на http и https только на IP из ipset "zapret"
|
nfqws_ipset_desync - использовать nfqws для атаки десинхронизации DPI на http и https только на IP из ipset "zapret"
|
||||||
nfqws_hostlist_desync - использовать nfqws для атаки десинхронизации DPI на http и https только на хосты из hostlist.
|
nfqws_hostlist_desync - использовать nfqws для атаки десинхронизации DPI на http и https только на хосты из hostlist.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user