doc works

This commit is contained in:
bol-van 2024-11-18 20:24:17 +03:00
parent 256c2d7e50
commit db5c60e19f

View File

@ -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\