mirror of
https://github.com/bol-van/zapret.git
synced 2024-11-29 21:40:52 +03:00
doc works
This commit is contained in:
parent
256c2d7e50
commit
db5c60e19f
329
docs/readme.md
329
docs/readme.md
@ -17,8 +17,6 @@ zapret является свободным и open source.
|
|||||||
- [Как это работает](#как-это-работает)
|
- [Как это работает](#как-это-работает)
|
||||||
- [Что сейчас происходит в России](#что-сейчас-происходит-в-россии)
|
- [Что сейчас происходит в России](#что-сейчас-происходит-в-россии)
|
||||||
- [Как это реализовать на практике в системе linux](#как-это-реализовать-на-практике-в-системе-linux)
|
- [Как это реализовать на практике в системе linux](#как-это-реализовать-на-практике-в-системе-linux)
|
||||||
- [Особенности применения ip6tables](#особенности-применения-ip6tables)
|
|
||||||
- [Особенности применения nftables](#особенности-применения-nftables)
|
|
||||||
- [Когда это работать не будет](#когда-это-работать-не-будет)
|
- [Когда это работать не будет](#когда-это-работать-не-будет)
|
||||||
- [nfqws](#nfqws)
|
- [nfqws](#nfqws)
|
||||||
- [АТАКА ДЕСИНХРОНИЗАЦИИ DPI](#атака-десинхронизации-dpi)
|
- [АТАКА ДЕСИНХРОНИЗАЦИИ DPI](#атака-десинхронизации-dpi)
|
||||||
@ -28,7 +26,6 @@ zapret является свободным и open source.
|
|||||||
- [СПЕЦИФИЧЕСКИЕ РЕЖИМЫ IPV6](#специфические-режимы-ipv6)
|
- [СПЕЦИФИЧЕСКИЕ РЕЖИМЫ IPV6](#специфические-режимы-ipv6)
|
||||||
- [КОМБИНИРОВАНИЕ МЕТОДОВ ДЕСИНХРОНИЗАЦИИ](#комбинирование-методов-десинхронизации)
|
- [КОМБИНИРОВАНИЕ МЕТОДОВ ДЕСИНХРОНИЗАЦИИ](#комбинирование-методов-десинхронизации)
|
||||||
- [РЕАКЦИЯ DPI НА ОТВЕТ СЕРВЕРА](#реакция-dpi-на-ответ-сервера)
|
- [РЕАКЦИЯ DPI НА ОТВЕТ СЕРВЕРА](#реакция-dpi-на-ответ-сервера)
|
||||||
- [IPTABLES ДЛЯ NFQWS](#iptables-для-nfqws)
|
|
||||||
- [РЕЖИМ SYNACK](#режим-synack)
|
- [РЕЖИМ SYNACK](#режим-synack)
|
||||||
- [РЕЖИМ SYNDATA](#режим-syndata)
|
- [РЕЖИМ SYNDATA](#режим-syndata)
|
||||||
- [ВИРТУАЛЬНЫЕ МАШИНЫ](#виртуальные-машины)
|
- [ВИРТУАЛЬНЫЕ МАШИНЫ](#виртуальные-машины)
|
||||||
@ -37,6 +34,9 @@ zapret является свободным и open source.
|
|||||||
- [ПОДДЕРЖКА UDP](#поддержка-udp)
|
- [ПОДДЕРЖКА UDP](#поддержка-udp)
|
||||||
- [IP ФРАГМЕНТАЦИЯ](#ip-фрагментация)
|
- [IP ФРАГМЕНТАЦИЯ](#ip-фрагментация)
|
||||||
- [МНОЖЕСТВЕННЫЕ СТРАТЕГИИ](#множественные-стратегии)
|
- [МНОЖЕСТВЕННЫЕ СТРАТЕГИИ](#множественные-стратегии)
|
||||||
|
- [IPTABLES ДЛЯ NFQWS](#iptables-для-nfqws)
|
||||||
|
- [NFTABLES ДЛЯ NFQWS](#nftables-для-nfqws)
|
||||||
|
- [FLOW OFFLOADING](#flow-offloading)
|
||||||
- [tpws](#tpws)
|
- [tpws](#tpws)
|
||||||
- [TCP СЕГМЕНТАЦИЯ В TPWS](#tcp-сегментация-в-tpws)
|
- [TCP СЕГМЕНТАЦИЯ В TPWS](#tcp-сегментация-в-tpws)
|
||||||
- [TLSREC](#tlsrec)
|
- [TLSREC](#tlsrec)
|
||||||
@ -44,6 +44,8 @@ zapret является свободным и open source.
|
|||||||
- [ДРУГИЕ ПАРАМЕТРЫ ДУРЕНИЯ](#другие-параметры-дурения)
|
- [ДРУГИЕ ПАРАМЕТРЫ ДУРЕНИЯ](#другие-параметры-дурения)
|
||||||
- [МНОЖЕСТВЕННЫЕ СТРАТЕГИИ](#множественные-стратегии-1)
|
- [МНОЖЕСТВЕННЫЕ СТРАТЕГИИ](#множественные-стратегии-1)
|
||||||
- [СЛУЖЕБНЫЕ ПАРАМЕТРЫ](#служебные-параметры)
|
- [СЛУЖЕБНЫЕ ПАРАМЕТРЫ](#служебные-параметры)
|
||||||
|
- [IPTABLES ДЛЯ TPWS](#iptables-для-nfqws)
|
||||||
|
- [NFTABLES ДЛЯ TPWS](#nftables-для-tpws)
|
||||||
- [Способы получения списка заблокированных IP](#способы-получения-списка-заблокированных-ip)
|
- [Способы получения списка заблокированных IP](#способы-получения-списка-заблокированных-ip)
|
||||||
- [ip2net](#ip2net)
|
- [ip2net](#ip2net)
|
||||||
- [mdig](#mdig)
|
- [mdig](#mdig)
|
||||||
@ -137,107 +139,6 @@ DPI. Все больше становится внереестровых бло
|
|||||||
Для вариантов 2 и 3 реализованы программы tpws и nfqws соответственно. Чтобы они работали, необходимо их запустить с
|
Для вариантов 2 и 3 реализованы программы tpws и nfqws соответственно. Чтобы они работали, необходимо их запустить с
|
||||||
нужными параметрами и перенаправить на них определенный трафик средствами iptables или nftables.
|
нужными параметрами и перенаправить на них определенный трафик средствами iptables или nftables.
|
||||||
|
|
||||||
Для перенаправления tcp соединения на transparent proxy используются команды следующего вида :
|
|
||||||
|
|
||||||
проходящий трафик:
|
|
||||||
`iptables -t nat -I PREROUTING -i <внутренний_интерфейс> -p tcp --dport 80 -j DNAT --to 127.0.0.127:988`
|
|
||||||
|
|
||||||
исходящий трафик:
|
|
||||||
`iptables -t nat -I OUTPUT -o <внешний_интерфейс> -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.127:988`
|
|
||||||
|
|
||||||
DNAT на localhost работает в цепочке OUTPUT, но не работает в цепочке PREROUTING без включения параметра
|
|
||||||
route_localnet :
|
|
||||||
|
|
||||||
`sysctl -w net.ipv4.conf.<внутренний_интерфейс>.route_localnet=1`
|
|
||||||
|
|
||||||
Можно использовать `-j REDIRECT --to-port 988` вместо DNAT, однако в этом случае процесс transparent proxy должен
|
|
||||||
слушать на ip адресе входящего интерфейса или на всех адресах. Слушать на всех - не есть хорошо с точки зрения
|
|
||||||
безопасности. Слушать на одном (локальном) можно, но в случае автоматизированного скрипта придется его узнавать, потом
|
|
||||||
динамически вписывать в команду. В любом случае требуются дополнительные усилия. Использование route_localnet тоже имеет
|
|
||||||
потенциальные проблемы с безопасностью. Вы делаете доступным все, что висит на `127.0.0.0/8` для локальной подсети <
|
|
||||||
внутренний_интерфейс>. Службы обычно привязываются к `127.0.0.1`, поэтому можно средствами iptables запретить входящие
|
|
||||||
на `127.0.0.1` не с интерфейса lo, либо повесить tpws на любой другой IP из из `127.0.0.0/8`, например на `127.0.0.127`,
|
|
||||||
и разрешить входящие не с lo только на этот IP.
|
|
||||||
|
|
||||||
```
|
|
||||||
iptables -A INPUT ! -i lo -d 127.0.0.127 -j ACCEPT
|
|
||||||
iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j DROP
|
|
||||||
```
|
|
||||||
|
|
||||||
Фильтр по owner необходим для исключения рекурсивного перенаправления соединений от самого tpws. tpws запускается под
|
|
||||||
пользователем `tpws`, для него задается исключающее правило.
|
|
||||||
|
|
||||||
tpws может использоваться в режиме socks proxy. В этом случае iptables не нужны, а нужно прописать socks в настройки
|
|
||||||
программы (например, броузера), с которой будем обходить блокировки. transparent proxy отличается от socks именно тем,
|
|
||||||
что в варианте transparent настраивать клиентские программы не нужно.
|
|
||||||
|
|
||||||
Для перенаправления на очередь 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 1:6 -m mark ! --mark 0x40000000/0x40000000 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass`
|
|
||||||
|
|
||||||
Фильтр по mark нужен для отсечения от очереди пакетов, сгенерированных внутри nfqws. Если применяется фильтр по
|
|
||||||
connbytes 1:6, то обязательно добавлять в iptables и фильтр по mark. Иначе возможно перепутывание порядка следования
|
|
||||||
пакетов, что приведет к неработоспособности метода. Так же возможно зависание nfqws по deadlock.
|
|
||||||
|
|
||||||
Для некоторых атак на DPI требуется перенаправлять один или несколько входящих пакетов от соединения :
|
|
||||||
|
|
||||||
`iptables -t mangle -I PREROUTING -i <внешний_интерфейс> -p tcp --sport 80 -m connbytes --connbytes-dir=reply --connbytes-mode=packets --connbytes 1:6 -m set --match-set zapret src -j NFQUEUE --queue-num 200 --queue-bypass`
|
|
||||||
|
|
||||||
Получаемые пакеты будут фильтроваться по входящему интерфейсу, порту и IP источника, то есть наоборот прямому правилу.
|
|
||||||
|
|
||||||
Некоторые техники, ломающие NAT, не всегда можно реализовать через iptables. Требуются nftables.
|
|
||||||
|
|
||||||
Если ваше устройство поддерживает аппаратное ускорение (flow offloading, hardware nat, hardware acceleration), то
|
|
||||||
iptables могут не работать. При включенном offloading пакет не проходит по обычному пути netfilter. Необходимо или его
|
|
||||||
отключить, или выборочно им управлять.
|
|
||||||
|
|
||||||
В новых ядрах (и в более старых, openwrt портировал изменение на 4.14) присутствует software flow offloading (SFO).
|
|
||||||
Пакеты, проходящие через SFO, так же проходят мимо большей части механизмов iptables. При включенном SFO работает
|
|
||||||
DNAT/REDIRECT (tpws). Эти соединения исключаются из offloading. Однако, остальные соединения идут через SFO, потому
|
|
||||||
NFQUEUE будет срабатывать только до помещения соединения в flowtable. Практически это означает, что nfqws будет работать
|
|
||||||
на window size changing, но не будут работать опции по модификации содержимого пакетов. Offload включается через
|
|
||||||
специальный target в iptables `FLOWOFFLOAD`. Не обязательно пропускать весь трафик через offload. Можно исключить из
|
|
||||||
offload соединения, которые должны попасть на tpws или nfqws. openwrt не предусматривает выборочного управления offload.
|
|
||||||
Поэтому скрипты zapret поддерживают свою систему выборочного управления offload в openwrt.
|
|
||||||
|
|
||||||
## Особенности применения ip6tables
|
|
||||||
|
|
||||||
ip6tables работают почти точно так же, как и ipv4, но есть ряд важных нюансов. В DNAT следует брать адрес --to в
|
|
||||||
квадратные скобки. Например :
|
|
||||||
|
|
||||||
`ip6tables -t nat -I OUTPUT -o <внешний_интерфейс> -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to [::1]:988`
|
|
||||||
|
|
||||||
Параметра route_localnet не существует для ipv6. DNAT на localhost (::1) возможен только в цепочке OUTPUT. В цепочке
|
|
||||||
PREROUTING DNAT возможен на любой global address или на link local address того же интерфейса, откуда пришел пакет.
|
|
||||||
NFQUEUE работает без изменений.
|
|
||||||
|
|
||||||
## Особенности применения nftables
|
|
||||||
|
|
||||||
Более подробно преимущества и недостатки nftables применительно к данной системе описаны в [docs/nftables_notes.txt](./nftables_notes.txt) Если
|
|
||||||
коротко, то в nftables невозможно работать с большими ip листами на системах с малым количеством RAM. Остальные
|
|
||||||
рассматриваемые здесь функции могут быть перенесены на nftables.
|
|
||||||
|
|
||||||
Рекомендуется версия nft `1.0.2` или выше. Но чем выше версия, тем лучше. В nft регулярно находят баги.
|
|
||||||
|
|
||||||
Относительно старые версии ядра и/или утилиты nft могут вызывать ошибки. В частности, на ubuntu 18.04 с ядром 4.15 будут
|
|
||||||
проблемы. В 20.04 - работает.
|
|
||||||
|
|
||||||
Некоторые техники можно полноценно использовать только с nftables. Например, в iptables невозможно перенаправить пакеты
|
|
||||||
на nfqws после NAT. Следовательно, при использовании NAT невозможно произвести атаку, не совместимую с NAT. В nftables
|
|
||||||
этой проблемы не существует, потому что приоритеты хука выставляете вы сами, а не привязаны к фиксированным значениям,
|
|
||||||
соответствующим разным таблицам iptables. В iptables нет таблицы, способной перехватить пакеты после MASQUERDADE.
|
|
||||||
|
|
||||||
## Когда это работать не будет
|
## Когда это работать не будет
|
||||||
|
|
||||||
* Если подменяется DNS. С этой проблемой легко справиться.
|
* Если подменяется DNS. С этой проблемой легко справиться.
|
||||||
@ -497,7 +398,7 @@ extension хедерам в поисках транспортного хедер
|
|||||||
|
|
||||||
В параметре dpi-desync можно указать до 3 режимов через запятую.
|
В параметре dpi-desync можно указать до 3 режимов через запятую.
|
||||||
|
|
||||||
* 0 фаза - предполагает работу на этапе установления соединения : `synack`, `syndata` `--wsize`, `--wssize`.
|
* 0 фаза - предполагает работу на этапе установления соединения : `synack`, `syndata` `--wsize`, `--wssize`. На эту фазу не действуют фильтры по [hostlist](((#множественные-стратегии))).
|
||||||
* 1 фаза - отсылка чего-либо до оригинального пакета данных : `fake`, `rst`, `rstack`.
|
* 1 фаза - отсылка чего-либо до оригинального пакета данных : `fake`, `rst`, `rstack`.
|
||||||
* 2 фаза - отсылка в модифицированном виде оригинального пакета данных (например, `fakedsplit` или `ipfrag2`).
|
* 2 фаза - отсылка в модифицированном виде оригинального пакета данных (например, `fakedsplit` или `ipfrag2`).
|
||||||
|
|
||||||
@ -519,34 +420,6 @@ DPI может отстать от потока, если ClientHello его у
|
|||||||
Лучшее решение - включить на сервере поддержку TLS 1.3. В нем сертификат сервера передается в зашифрованном виде.
|
Лучшее решение - включить на сервере поддержку TLS 1.3. В нем сертификат сервера передается в зашифрованном виде.
|
||||||
Это рекомендация ко всем админам блокируемых сайтов. Включайте TLS 1.3. Так вы дадите больше возможностей преодолеть DPI.
|
Это рекомендация ко всем админам блокируемых сайтов. Включайте TLS 1.3. Так вы дадите больше возможностей преодолеть DPI.
|
||||||
|
|
||||||
### IPTABLES ДЛЯ NFQWS
|
|
||||||
|
|
||||||
iptables для задействования атаки на первый пакет данных :
|
|
||||||
|
|
||||||
`iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp -m multiport --dports 80,443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:6 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass`
|
|
||||||
|
|
||||||
Этот вариант применяем, когда DPI не следит за всеми запросами http внутри keep-alive сессии.
|
|
||||||
Если следит, направляем только первый пакет от https и все пакеты от http :
|
|
||||||
|
|
||||||
```
|
|
||||||
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp --dport 443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:6 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
|
||||||
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp --dport 80 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
|
||||||
```
|
|
||||||
|
|
||||||
mark нужен, чтобы сгенерированный поддельный пакет не попал опять к нам на обработку. nfqws выставляет fwmark при его отсылке.
|
|
||||||
хотя nfqws способен самостоятельно различать помеченные пакеты, фильтр в iptables по mark нужен при использовании connbytes,
|
|
||||||
чтобы не допустить изменения порядка следования пакетов. Процессинг очереди - процесс отложенный.
|
|
||||||
Если ядро имеет пакеты на отсылку вне очереди - оно их отправляет незамедлительно.
|
|
||||||
Изменение правильного порядка следования пакетов при десинхронизации ломает всю идею.
|
|
||||||
Так же были замечены дедлоки при достаточно большой отсылке пакетов из nfqws и отсутствии mark фильтра.
|
|
||||||
Процесс может зависнуть. Поэтому наличие фильтра по mark в ip/nf tables можно считать обязательным.
|
|
||||||
|
|
||||||
Почему --connbytes 1:6 :
|
|
||||||
* 1 - для работы методов десинхронизации 0-й фазы и корректной работы conntrack
|
|
||||||
* 2 - иногда данные идут в 3-м пакете 3-way handshake
|
|
||||||
* 3 - стандартная ситуация приема одного пакета запроса
|
|
||||||
* 4-6 - на случай ретрансмиссии или запроса длиной в несколько пакетов (TLSClientHello с kyber, например)
|
|
||||||
|
|
||||||
### РЕЖИМ SYNACK
|
### РЕЖИМ SYNACK
|
||||||
|
|
||||||
В документации по geneva это называется "TCB turnaround". Попытка ввести DPI в заблуждение относительно
|
В документации по geneva это называется "TCB turnaround". Попытка ввести DPI в заблуждение относительно
|
||||||
@ -776,6 +649,115 @@ L7 протокол становится известен обычно посл
|
|||||||
> Вариант в ядре работает гораздо эффективнее. Это создавалось для систем без подержки ipset в ядре.
|
> Вариант в ядре работает гораздо эффективнее. Это создавалось для систем без подержки ipset в ядре.
|
||||||
> Конкретно - Windows и ядра Linux, собранные без nftables и ipset модулей ядра. Например, в android нет ipset.
|
> Конкретно - Windows и ядра Linux, собранные без nftables и ipset модулей ядра. Например, в android нет ipset.
|
||||||
|
|
||||||
|
### IPTABLES ДЛЯ NFQWS
|
||||||
|
|
||||||
|
iptables для задействования атаки на первые пакеты данных в tcp соединении :
|
||||||
|
|
||||||
|
```
|
||||||
|
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp -m multiport --dports 80,443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:6 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
```
|
||||||
|
|
||||||
|
Этот вариант применяем, когда DPI не следит за всеми запросами http внутри keep-alive сессии.
|
||||||
|
Если следит, направляем только первый пакет от https и все пакеты от http :
|
||||||
|
|
||||||
|
```
|
||||||
|
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp --dport 443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:6 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp --dport 80 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
```
|
||||||
|
|
||||||
|
mark нужен, чтобы сгенерированный поддельный пакет не попал опять к нам на обработку. nfqws выставляет fwmark при его отсылке.
|
||||||
|
хотя nfqws способен самостоятельно различать помеченные пакеты, фильтр в iptables по mark нужен при использовании connbytes,
|
||||||
|
чтобы не допустить изменения порядка следования пакетов. Процессинг очереди - процесс отложенный.
|
||||||
|
Если ядро имеет пакеты на отсылку вне очереди - оно их отправляет незамедлительно.
|
||||||
|
Изменение правильного порядка следования пакетов при десинхронизации ломает всю идею.
|
||||||
|
Так же были замечены дедлоки при достаточно большой отсылке пакетов из nfqws и отсутствии mark фильтра.
|
||||||
|
Процесс может зависнуть. Поэтому наличие фильтра по mark в ip/nf tables можно считать обязательным.
|
||||||
|
|
||||||
|
Почему `--connbytes 1:6` :
|
||||||
|
* 1 - для работы методов десинхронизации 0-й фазы и корректной работы conntrack
|
||||||
|
* 2 - иногда данные идут в 3-м пакете 3-way handshake
|
||||||
|
* 3 - стандартная ситуация приема одного пакета запроса
|
||||||
|
* 4-6 - на случай ретрансмиссии или запроса длиной в несколько пакетов (TLSClientHello с kyber, например)
|
||||||
|
|
||||||
|
Для режима autottl необходимо перенаправление входящего `SYN,ACK` пакета или первого пакета соединения (что обычно есть тоже самое).
|
||||||
|
Можно построить фильтр на tcp flags и модуле u32 для поиска характерных паттернов http redirect, но проще использовать connbytes.
|
||||||
|
|
||||||
|
Для режима autohostlist необходимо перенаправление нескольких входящих пакетов, чтобы засечь RST или http redirect.
|
||||||
|
Так же стоит увеличить лимит исходящих пакетов в connbytes, чтобы в него вошли все возможные ретрансмиссии, после которых идет реакция по autoostlist.
|
||||||
|
|
||||||
|
`
|
||||||
|
iptables -t mangle -I PREROUTING -i <внешний интерфейс> -p tcp -m multiport --sports 80,443 -m connbytes --connbytes-dir=reply --connbytes-mode=packets --connbytes 1:3 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
`
|
||||||
|
|
||||||
|
Для quic :
|
||||||
|
|
||||||
|
```
|
||||||
|
iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p udp --dport 443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:6 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||||
|
```
|
||||||
|
|
||||||
|
6 пакетов берется, чтобы покрыть случаи возможных ретрансмиссий quic initial в случае плохой связи или если сервер плохо себя чувствует, а приложение настаивает именно на quic, не переходя на tcp.
|
||||||
|
А так же для работы autohostlist по quic. Однако, autohostlist для quic не рекомендуется.
|
||||||
|
|
||||||
|
### NFTABLES ДЛЯ NFQWS
|
||||||
|
|
||||||
|
Можно начать с базовой конфигурации.
|
||||||
|
|
||||||
|
```
|
||||||
|
IFACE_WAN=wan
|
||||||
|
|
||||||
|
nft create table inet ztest
|
||||||
|
|
||||||
|
nft add chain inet ztest post "{type filter hook postrouting priority mangle;}"
|
||||||
|
nft add rule inet ztest post oifname $IFACE_WAN meta mark and 0x40000000 == 0 tcp dport "{80,443}" ct original packets 1-6 queue num 200 bypass
|
||||||
|
nft add rule inet ztest post oifname $IFACE_WAN meta mark and 0x40000000 == 0 udp dport 443 ct original packets 1-6 queue num 200 bypass
|
||||||
|
|
||||||
|
# auto hostlist with avoiding wrong ACK numbers in RST,ACK packets sent by russian DPI
|
||||||
|
sysctl net.netfilter.nf_conntrack_tcp_be_liberal=1
|
||||||
|
nft add chain inet ztest pre "{type filter hook prerouting priority filter;}"
|
||||||
|
nft add rule inet ztest pre iifname $IFACE_WAN tcp sport "{80,443}" ct reply packets 1-3 queue num 200 bypass
|
||||||
|
```
|
||||||
|
|
||||||
|
Для задействования IP фрагментации и `datanoack` на проходящие пакеты требуется особая конфигурация цепочек, перенаправляющая пакеты после NAT.
|
||||||
|
В скриптах zapret эта схема называется `POSTNAT`, и она возможна только на nftables.
|
||||||
|
Сгенерированные nfqws пакеты требуется на раннем этапе помечать как **notrack**, чтобы они не были испорчены NAT.
|
||||||
|
|
||||||
|
```
|
||||||
|
IFACE_WAN=wan
|
||||||
|
|
||||||
|
nft create table inet ztest
|
||||||
|
|
||||||
|
nft add chain inet ztest postnat "{type filter hook postrouting priority srcnat+1;}"
|
||||||
|
nft add rule inet ztest postnat oifname $IFACE_WAN meta mark and 0x40000000 == 0 tcp dport "{80,443}" ct original packets 1-6 queue num 200 bypass
|
||||||
|
nft add rule inet ztest postnat oifname $IFACE_WAN meta mark and 0x40000000 == 0 udp dport 443 ct original packets 1-6 queue num 200 bypass
|
||||||
|
|
||||||
|
nft add chain inet ztest predefrag "{type filter hook output priority -401;}"
|
||||||
|
nft add rule inet ztest predefrag "mark & 0x40000000 != 0x00000000 notrack"
|
||||||
|
```
|
||||||
|
|
||||||
|
Удаление тестовой таблицы :
|
||||||
|
|
||||||
|
```
|
||||||
|
nft delete table inet ztest
|
||||||
|
```
|
||||||
|
|
||||||
|
### FLOW OFFLOADING
|
||||||
|
|
||||||
|
Если ваше устройство поддерживает аппаратное ускорение (flow offloading, hardware nat, hardware acceleration), то
|
||||||
|
iptables могут не работать. При включенном offloading пакет не проходит по обычному пути netfilter. Необходимо или его
|
||||||
|
отключить, или выборочно им управлять.
|
||||||
|
|
||||||
|
В новых ядрах присутствует software flow offloading (SFO).
|
||||||
|
Пакеты, проходящие через SFO, так же проходят мимо большей части механизмов iptables. При включенном SFO работает
|
||||||
|
DNAT/REDIRECT (tpws). Эти соединения исключаются из offloading. Однако, остальные соединения идут через SFO, потому
|
||||||
|
NFQUEUE будет срабатывать только до помещения соединения в flowtable. Практически это означает, что почти весь функционал nfqws работать не будет.
|
||||||
|
Offload включается через специальный target в iptables `FLOWOFFLOAD`. Не обязательно пропускать весь трафик через offload. Можно исключить из
|
||||||
|
offload соединения, которые должны попасть на tpws или nfqws. openwrt не предусматривает выборочного управления offload.
|
||||||
|
Поэтому скрипты zapret поддерживают свою систему выборочного управления offload в openwrt.
|
||||||
|
|
||||||
|
iptables target `FLOWOFFLOAD` - это проприетарное изобретение openwrt.
|
||||||
|
Управление offload в nftables реализовано в базовом ядре linux без патчей.
|
||||||
|
|
||||||
|
|
||||||
## tpws
|
## tpws
|
||||||
|
|
||||||
tpws - это transparent proxy.
|
tpws - это transparent proxy.
|
||||||
@ -1034,6 +1016,77 @@ tpws поддерживает эту возможность асинхронно
|
|||||||
Если задан параметр `--no-resolve`, то подключения по именам хостов запрещаются, а пул ресолверов не создается.
|
Если задан параметр `--no-resolve`, то подключения по именам хостов запрещаются, а пул ресолверов не создается.
|
||||||
Тем самым экономятся ресурсы.
|
Тем самым экономятся ресурсы.
|
||||||
|
|
||||||
|
### IPTABLES ДЛЯ TPWS
|
||||||
|
|
||||||
|
Для перенаправления tcp соединения на transparent proxy используются команды следующего вида :
|
||||||
|
|
||||||
|
```
|
||||||
|
iptables -t nat -I OUTPUT -o <внешний_интерфейс> -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.127:988
|
||||||
|
iptables -t nat -I PREROUTING -i <внутренний_интерфейс> -p tcp --dport 80 -j DNAT --to 127.0.0.127:988
|
||||||
|
```
|
||||||
|
|
||||||
|
Первая команда для соединений с самой системы, вторая - для проходящих через роутер соединений.
|
||||||
|
|
||||||
|
DNAT на localhost работает в цепочке OUTPUT, но не работает в цепочке PREROUTING без включения параметра
|
||||||
|
route_localnet :
|
||||||
|
|
||||||
|
`sysctl -w net.ipv4.conf.<внутренний_интерфейс>.route_localnet=1`
|
||||||
|
|
||||||
|
Можно использовать `-j REDIRECT --to-port 988` вместо DNAT, однако в этом случае процесс transparent proxy должен
|
||||||
|
слушать на ip адресе входящего интерфейса или на всех адресах. Слушать на всех - не есть хорошо с точки зрения
|
||||||
|
безопасности. Слушать на одном (локальном) можно, но в случае автоматизированного скрипта придется его узнавать, потом
|
||||||
|
динамически вписывать в команду. В любом случае требуются дополнительные усилия. Использование route_localnet тоже имеет
|
||||||
|
потенциальные проблемы с безопасностью. Вы делаете доступным все, что висит на `127.0.0.0/8` для локальной подсети <
|
||||||
|
внутренний_интерфейс>. Службы обычно привязываются к `127.0.0.1`, поэтому можно средствами iptables запретить входящие
|
||||||
|
на `127.0.0.1` не с интерфейса lo, либо повесить tpws на любой другой IP из из `127.0.0.0/8`, например на `127.0.0.127`,
|
||||||
|
и разрешить входящие не с lo только на этот IP.
|
||||||
|
|
||||||
|
```
|
||||||
|
iptables -A INPUT ! -i lo -d 127.0.0.127 -j ACCEPT
|
||||||
|
iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j DROP
|
||||||
|
```
|
||||||
|
|
||||||
|
Фильтр по owner необходим для исключения рекурсивного перенаправления соединений от самого tpws. tpws запускается под
|
||||||
|
пользователем `tpws`, для него задается исключающее правило.
|
||||||
|
|
||||||
|
ip6tables работают почти точно так же, как и ipv4, но есть ряд важных нюансов. В DNAT следует брать адрес --to в
|
||||||
|
квадратные скобки. Например :
|
||||||
|
|
||||||
|
`ip6tables -t nat -I OUTPUT -o <внешний_интерфейс> -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to [::1]:988`
|
||||||
|
|
||||||
|
Параметра route_localnet не существует для ipv6. DNAT на localhost (::1) возможен только в цепочке OUTPUT. В цепочке
|
||||||
|
PREROUTING DNAT возможен на любой global address или на link local address того же интерфейса, откуда пришел пакет.
|
||||||
|
NFQUEUE работает без изменений.
|
||||||
|
|
||||||
|
### NFTABLES ДЛЯ TPWS
|
||||||
|
|
||||||
|
Базовая конфигурация :
|
||||||
|
|
||||||
|
```
|
||||||
|
IFACE_WAN=wan
|
||||||
|
IFACE_LAN=br-lan
|
||||||
|
|
||||||
|
sysctl -w net.ipv4.conf.$IFACE_LAN.route_localnet=1
|
||||||
|
|
||||||
|
nft create table inet ztest
|
||||||
|
|
||||||
|
nft create chain inet ztest localnet_protect
|
||||||
|
nft add rule inet ztest localnet_protect ip daddr 127.0.0.127 return
|
||||||
|
nft add rule inet ztest localnet_protect ip daddr 127.0.0.0/8 drop
|
||||||
|
nft create chain inet ztest input "{type filter hook input priority filter - 1;}"
|
||||||
|
nft add rule inet ztest input iif != "lo" jump localnet_protect
|
||||||
|
|
||||||
|
nft create chain inet ztest dnat_output "{type nat hook output priority dstnat;}"
|
||||||
|
nft add rule inet ztest dnat_output meta skuid != tpws oifname $IFACE_WAN tcp dport { 80, 443 } dnat ip to 127.0.0.127:988
|
||||||
|
nft create chain inet ztest dnat_pre "{type nat hook prerouting priority dstnat;}"
|
||||||
|
nft add rule inet ztest dnat_pre meta iifname $IFACE_LAN tcp dport { 80, 443 } dnat ip to 127.0.0.127:988
|
||||||
|
```
|
||||||
|
|
||||||
|
Удаление таблицы :
|
||||||
|
```
|
||||||
|
nft delete table inet ztest
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Способы получения списка заблокированных IP
|
## Способы получения списка заблокированных IP
|
||||||
|
|
||||||
@ -1115,17 +1168,17 @@ Cкрипты с названием `get_antifilter_*` оперируют спи
|
|||||||
в отдельный ipset `ipban`. Он может использоваться для принудительного завертывания всех
|
в отдельный ipset `ipban`. Он может использоваться для принудительного завертывания всех
|
||||||
соединений на прозрачный proxy `redsocks` или на VPN.
|
соединений на прозрачный proxy `redsocks` или на VPN.
|
||||||
|
|
||||||
IPV6 : если включен ipv6, то дополнительно создаются листы с таким же именем, но с "6" на конце перед расширением.
|
**IPV6** : если включен ipv6, то дополнительно создаются листы с таким же именем, но с "6" на конце перед расширением.
|
||||||
`zapret-ip.txt` => `zapret-ip6.txt`
|
`zapret-ip.txt` => `zapret-ip6.txt`
|
||||||
Создаются ipset-ы zapret6 и ipban6.
|
Создаются ipset-ы zapret6 и ipban6.
|
||||||
Листы с antifilter не содержат список ipv6 адресов.
|
Листы с antifilter не содержат список ipv6 адресов.
|
||||||
|
|
||||||
СИСТЕМА ИСКЛЮЧЕНИЯ IP. Все скрипты ресолвят файл `zapret-hosts-user-exclude.txt`, создавая `zapret-ip-exclude.txt` и `zapret-ip-exclude6.txt`.
|
**СИСТЕМА ИСКЛЮЧЕНИЯ IP**. Все скрипты ресолвят файл `zapret-hosts-user-exclude.txt`, создавая `zapret-ip-exclude.txt` и `zapret-ip-exclude6.txt`.
|
||||||
Они загоняются в ipset-ы nozapret и nozapret6. Все правила, создаваемые init скриптами, создаются с учетом этих ipset.
|
Они загоняются в ipset-ы nozapret и nozapret6. Все правила, создаваемые init скриптами, создаются с учетом этих ipset.
|
||||||
Помещенные в них IP не участвуют в процессе.
|
Помещенные в них IP не участвуют в процессе.
|
||||||
`zapret-hosts-user-exclude.txt` может содержать домены, ipv4 и ipv6 адреса или подсети.
|
`zapret-hosts-user-exclude.txt` может содержать домены, ipv4 и ipv6 адреса или подсети.
|
||||||
|
|
||||||
FreeBSD. Скрипты ipset/*.sh работают так же на FreeBSD. Вместо ipset они создают lookup таблицы ipfw с аналогичными именами.
|
**FreeBSD**. Скрипты ipset/*.sh работают так же на FreeBSD. Вместо ipset они создают lookup таблицы ipfw с аналогичными именами.
|
||||||
ipfw таблицы в отличие от ipset могут содержать как ipv4, так и ipv6 адреса и подсети в одной таблице, поэтому разделения нет.
|
ipfw таблицы в отличие от ipset могут содержать как ipv4, так и ipv6 адреса и подсети в одной таблице, поэтому разделения нет.
|
||||||
|
|
||||||
Параметр конфига LISTS_RELOAD задает произвольную команду для перезагрузки листов.
|
Параметр конфига LISTS_RELOAD задает произвольную команду для перезагрузки листов.
|
||||||
@ -1982,10 +2035,10 @@ zapret_custom_firewall_nft поднимает правила nftables.
|
|||||||
tpws будет работать в любом случае, он не требует чего-либо особенного.
|
tpws будет работать в любом случае, он не требует чего-либо особенного.
|
||||||
|
|
||||||
Хотя linux варианты под Android работают, рекомендуется использовать специально собранные под bionic бинарники.
|
Хотя linux варианты под Android работают, рекомендуется использовать специально собранные под bionic бинарники.
|
||||||
У них не будет проблем с DNS, с локальным временем и именами юзеров и групп.
|
У них не будет проблем с DNS, с локальным временем и именами юзеров и групп.\
|
||||||
Рекомендую использовать gid 3003 (AID_INET). Иначе можете получить permission denied на создание сокета.
|
Рекомендую использовать gid 3003 (AID_INET). Иначе можете получить permission denied на создание сокета.
|
||||||
Например: `--uid 1:3003`\
|
Например: `--uid 1:3003`\
|
||||||
В iptables укажите: "! --uid-owner 1" вместо "! --uid-owner tpws".\
|
В iptables укажите: `! --uid-owner 1` вместо `! --uid-owner tpws`.\
|
||||||
Напишите шелл скрипт с iptables и tpws, запускайте его средствами вашего рут менеджера.
|
Напишите шелл скрипт с iptables и tpws, запускайте его средствами вашего рут менеджера.
|
||||||
Скрипты автозапуска лежат тут:\
|
Скрипты автозапуска лежат тут:\
|
||||||
magisk : /data/adb/service.d\
|
magisk : /data/adb/service.d\
|
||||||
|
Loading…
Reference in New Issue
Block a user