From db5c60e19f67a97d7a9d9698a66d1fbd5acc7cd2 Mon Sep 17 00:00:00 2001 From: bol-van Date: Mon, 18 Nov 2024 20:24:17 +0300 Subject: [PATCH] doc works --- docs/readme.md | 329 ++++++++++++++++++++++++++++--------------------- 1 file changed, 191 insertions(+), 138 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index 5042fa7..8dbb289 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -17,8 +17,6 @@ zapret является свободным и open source. - [Как это работает](#как-это-работает) - [Что сейчас происходит в России](#что-сейчас-происходит-в-россии) - [Как это реализовать на практике в системе linux](#как-это-реализовать-на-практике-в-системе-linux) - - [Особенности применения ip6tables](#особенности-применения-ip6tables) - - [Особенности применения nftables](#особенности-применения-nftables) - [Когда это работать не будет](#когда-это-работать-не-будет) - [nfqws](#nfqws) - [АТАКА ДЕСИНХРОНИЗАЦИИ DPI](#атака-десинхронизации-dpi) @@ -28,7 +26,6 @@ zapret является свободным и open source. - [СПЕЦИФИЧЕСКИЕ РЕЖИМЫ IPV6](#специфические-режимы-ipv6) - [КОМБИНИРОВАНИЕ МЕТОДОВ ДЕСИНХРОНИЗАЦИИ](#комбинирование-методов-десинхронизации) - [РЕАКЦИЯ DPI НА ОТВЕТ СЕРВЕРА](#реакция-dpi-на-ответ-сервера) - - [IPTABLES ДЛЯ NFQWS](#iptables-для-nfqws) - [РЕЖИМ SYNACK](#режим-synack) - [РЕЖИМ SYNDATA](#режим-syndata) - [ВИРТУАЛЬНЫЕ МАШИНЫ](#виртуальные-машины) @@ -37,6 +34,9 @@ zapret является свободным и open source. - [ПОДДЕРЖКА UDP](#поддержка-udp) - [IP ФРАГМЕНТАЦИЯ](#ip-фрагментация) - [МНОЖЕСТВЕННЫЕ СТРАТЕГИИ](#множественные-стратегии) + - [IPTABLES ДЛЯ NFQWS](#iptables-для-nfqws) + - [NFTABLES ДЛЯ NFQWS](#nftables-для-nfqws) + - [FLOW OFFLOADING](#flow-offloading) - [tpws](#tpws) - [TCP СЕГМЕНТАЦИЯ В TPWS](#tcp-сегментация-в-tpws) - [TLSREC](#tlsrec) @@ -44,6 +44,8 @@ zapret является свободным и open source. - [ДРУГИЕ ПАРАМЕТРЫ ДУРЕНИЯ](#другие-параметры-дурения) - [МНОЖЕСТВЕННЫЕ СТРАТЕГИИ](#множественные-стратегии-1) - [СЛУЖЕБНЫЕ ПАРАМЕТРЫ](#служебные-параметры) + - [IPTABLES ДЛЯ TPWS](#iptables-для-nfqws) + - [NFTABLES ДЛЯ TPWS](#nftables-для-tpws) - [Способы получения списка заблокированных IP](#способы-получения-списка-заблокированных-ip) - [ip2net](#ip2net) - [mdig](#mdig) @@ -137,107 +139,6 @@ DPI. Все больше становится внереестровых бло Для вариантов 2 и 3 реализованы программы tpws и nfqws соответственно. Чтобы они работали, необходимо их запустить с нужными параметрами и перенаправить на них определенный трафик средствами 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. С этой проблемой легко справиться. @@ -497,7 +398,7 @@ extension хедерам в поисках транспортного хедер В параметре dpi-desync можно указать до 3 режимов через запятую. -* 0 фаза - предполагает работу на этапе установления соединения : `synack`, `syndata` `--wsize`, `--wssize`. +* 0 фаза - предполагает работу на этапе установления соединения : `synack`, `syndata` `--wsize`, `--wssize`. На эту фазу не действуют фильтры по [hostlist](((#множественные-стратегии))). * 1 фаза - отсылка чего-либо до оригинального пакета данных : `fake`, `rst`, `rstack`. * 2 фаза - отсылка в модифицированном виде оригинального пакета данных (например, `fakedsplit` или `ipfrag2`). @@ -519,34 +420,6 @@ DPI может отстать от потока, если ClientHello его у Лучшее решение - включить на сервере поддержку TLS 1.3. В нем сертификат сервера передается в зашифрованном виде. Это рекомендация ко всем админам блокируемых сайтов. Включайте 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 В документации по geneva это называется "TCB turnaround". Попытка ввести DPI в заблуждение относительно @@ -776,6 +649,115 @@ L7 протокол становится известен обычно посл > Вариант в ядре работает гораздо эффективнее. Это создавалось для систем без подержки 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 - это transparent proxy. @@ -1034,6 +1016,77 @@ tpws поддерживает эту возможность асинхронно Если задан параметр `--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 @@ -1115,17 +1168,17 @@ Cкрипты с названием `get_antifilter_*` оперируют спи в отдельный ipset `ipban`. Он может использоваться для принудительного завертывания всех соединений на прозрачный proxy `redsocks` или на VPN. -IPV6 : если включен ipv6, то дополнительно создаются листы с таким же именем, но с "6" на конце перед расширением. +**IPV6** : если включен ipv6, то дополнительно создаются листы с таким же именем, но с "6" на конце перед расширением. `zapret-ip.txt` => `zapret-ip6.txt` Создаются ipset-ы zapret6 и ipban6. Листы с 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. Помещенные в них IP не участвуют в процессе. `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 адреса и подсети в одной таблице, поэтому разделения нет. Параметр конфига LISTS_RELOAD задает произвольную команду для перезагрузки листов. @@ -1982,10 +2035,10 @@ zapret_custom_firewall_nft поднимает правила nftables. tpws будет работать в любом случае, он не требует чего-либо особенного. Хотя linux варианты под Android работают, рекомендуется использовать специально собранные под bionic бинарники. -У них не будет проблем с DNS, с локальным временем и именами юзеров и групп. +У них не будет проблем с DNS, с локальным временем и именами юзеров и групп.\ Рекомендую использовать gid 3003 (AID_INET). Иначе можете получить permission denied на создание сокета. Например: `--uid 1:3003`\ -В iptables укажите: "! --uid-owner 1" вместо "! --uid-owner tpws".\ +В iptables укажите: `! --uid-owner 1` вместо `! --uid-owner tpws`.\ Напишите шелл скрипт с iptables и tpws, запускайте его средствами вашего рут менеджера. Скрипты автозапуска лежат тут:\ magisk : /data/adb/service.d\