mirror of
https://github.com/bol-van/zapret.git
synced 2025-02-20 20:12:22 +03:00
doc: fix migrating to .md. iter 1
This commit is contained in:
parent
1f7a3fc139
commit
f00474ed12
164
docs/readme.md
164
docs/readme.md
@ -53,6 +53,7 @@ For english version refer to docs/readme.eng.txt
|
||||
Существует и более продвинутая магия, направленная на преодоление DPI на пакетном уровне.
|
||||
|
||||
Подробнее про DPI :
|
||||
|
||||
https://habr.com/ru/post/335436
|
||||
https://geneva.cs.umd.edu/papers/geneva_ccs19.pdf
|
||||
|
||||
@ -94,13 +95,19 @@ For english version refer to docs/readme.eng.txt
|
||||
Для перенаправления 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 адресе входящего интерфейса или на всех адресах. Слушать на всех - не есть хорошо
|
||||
@ -111,8 +118,10 @@ sysctl -w net.ipv4.conf.<внутренний_интерфейс>.route_localnet
|
||||
средствами 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", для него задается исключающее правило.
|
||||
@ -125,18 +134,24 @@ transparent proxy отличается от socks именно тем, что в
|
||||
Для перенаправления на очередь 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. Иначе возможно
|
||||
@ -144,7 +159,9 @@ iptables -t mangle -I POSTROUTING -o <внешний_интерфейс> -p tcp
|
||||
|
||||
Для некоторых атак на 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 источника, то есть наоборот прямому правилу.
|
||||
|
||||
@ -173,7 +190,9 @@ openwrt не предусматривает выборочного управл
|
||||
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.
|
||||
@ -225,6 +244,7 @@ nfqws
|
||||
Эта программа - модификатор пакетов и обработчик очереди NFQUEUE.
|
||||
Для BSD систем существует адаптированный вариант - dvtws, собираемый из тех же исходников (см. bsd.txt).
|
||||
|
||||
```
|
||||
--debug=0|1 ; 1=выводить отладочные сообщения
|
||||
--daemon ; демонизировать прогу
|
||||
--pidfile=<file> ; сохранить PID в файл
|
||||
@ -276,6 +296,7 @@ nfqws
|
||||
--hostlist-auto-fail-time=<int> ; все эти ситуации должны быть в пределах указанного количества секунд (по умолчанию: 60)
|
||||
--hostlist-auto-retrans-threshold=<int> ; сколько ретрансмиссий запроса считать блокировкой (по умолчанию: 3)
|
||||
--hostlist-auto-debug=<logfile> ; лог положительных решений по autohostlist. позволяет разобраться почему там появляются хосты.
|
||||
```
|
||||
|
||||
Параметры манипуляции могут сочетаться в любых комбинациях.
|
||||
|
||||
@ -283,6 +304,7 @@ nfqws
|
||||
Функции сплита выполняются в рамках атаки десинхронизации. Это быстрее и избавляет от целого ряда недостатков wsize.
|
||||
|
||||
АТАКА ДЕСИНХРОНИЗАЦИИ DPI
|
||||
|
||||
Суть ее в следующем. После выполнения tcp 3-way handshake идет первый пакет с данными от клиента.
|
||||
Там обычно "GET / ..." или TLS ClientHello. Мы дропаем этот пакет, заменяя чем-то другим.
|
||||
Это может быть поддельная версия с безобидным, но валидным запросом http или https (вариант fake),
|
||||
@ -436,13 +458,17 @@ DPI может отстать от потока, если ClientHello его у
|
||||
|
||||
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,
|
||||
@ -453,12 +479,13 @@ mark нужен, чтобы сгенерированный поддельный
|
||||
Но лучше его все же оставить для увеличения скорости.
|
||||
|
||||
Почему --connbytes 1:6 :
|
||||
1 - для работы методов десинхронизации 0-й фазы и wssize
|
||||
2 - иногда данные идут в 3-м пакете 3-way handshake
|
||||
3 - стандартная ситуация приема одного пакета запроса
|
||||
4-6 - на случай ретрансмиссии или запроса длиной в несколько пакетов (TLSClientHello с kyber, например)
|
||||
* 1 - для работы методов десинхронизации 0-й фазы и wssize
|
||||
* 2 - иногда данные идут в 3-м пакете 3-way handshake
|
||||
* 3 - стандартная ситуация приема одного пакета запроса
|
||||
* 4-6 - на случай ретрансмиссии или запроса длиной в несколько пакетов (TLSClientHello с kyber, например)
|
||||
|
||||
КОМБИНИРОВАНИЕ МЕТОДОВ ДЕСИНХРОНИЗАЦИИ
|
||||
|
||||
В параметре dpi-desync можно указать до 3 режимов через запятую.
|
||||
0 фаза предполагает работу на этапе установления соединения. Может быть synack или syndata.
|
||||
На 0 фазу не действует фильтр по hostlist.
|
||||
@ -467,6 +494,7 @@ mark нужен, чтобы сгенерированный поддельный
|
||||
Может быть полезно, когда у провайдера стоит не один DPI.
|
||||
|
||||
РЕЖИМ SYNACK
|
||||
|
||||
В документации по geneva это называется "TCB turnaround". Попытка ввести DPI в заблуждение относительно
|
||||
ролей клиента и сервера.
|
||||
!!! Поскольку режим нарушает работу NAT, техника может сработать только если между атакующим устройством
|
||||
@ -475,31 +503,38 @@ mark нужен, чтобы сгенерированный поддельный
|
||||
дропающее инвалидные пакеты в цепочке OUTPUT. Например : -A OUTPUT -m state --state INVALID -j DROP
|
||||
В openwrt можно отключить drop INVALID в OUTPUT и FORWARD через опцию в /etc/config/firewall :
|
||||
|
||||
```
|
||||
config zone
|
||||
option name 'wan'
|
||||
.........
|
||||
option masq_allow_invalid '1'
|
||||
```
|
||||
|
||||
К сожалению, отключить только в OUTPUT таким образом нельзя. Но можно сделать иначе. Вписать в /etc/firewall.user :
|
||||
|
||||
```
|
||||
iptables -D zone_wan_output -m comment --comment '!fw3' -j zone_wan_dest_ACCEPT
|
||||
ip6tables -D zone_wan_output -m comment --comment '!fw3' -j zone_wan_dest_ACCEPT
|
||||
```
|
||||
|
||||
Лучше делать так, потому что отсутствие дропа INVALID в FORWARD может привести к нежелательным утечкам пакетов из LAN.
|
||||
Если не принять эти меры, отсылка SYN,ACK сегмента вызовет ошибку и операция будет прервана.
|
||||
Остальные режимы тоже не сработают. Если поймете, что вам synack не нужен, обязательно верните правило дропа INVALID.
|
||||
|
||||
РЕЖИМ SYNDATA
|
||||
|
||||
Тут все просто. Добавляются данные в пакет SYN. Все ОС их игнорируют, если не используется TCP fast open (TFO),
|
||||
а DPI может воспринять, не разобравшись есть там TFO или нет.
|
||||
Оригинальные соединения с TFO не трогаются, поскольку это их точно сломает.
|
||||
Без уточняющего параметра добавляются 16 нулевых байтов.
|
||||
|
||||
ВИРТУАЛЬНЫЕ МАШИНЫ
|
||||
|
||||
Изнутри VM от virtualbox и vmware в режиме NAT не работают многие техники пакетной магии nfqws.
|
||||
Принудительно заменяется ttl, не проходят фейк пакеты. Необходимо настроить сеть в режиме bridge.
|
||||
|
||||
CONNTRACK
|
||||
|
||||
nfqws оснащен ограниченной реализацией слежения за состоянием tcp соединений (conntrack).
|
||||
Он включается для реализации некоторых методов противодействия DPI.
|
||||
conntrack способен следить за фазой соединения : SYN,ESTABLISHED,FIN , количеством пакетов в каждую сторону,
|
||||
@ -554,6 +589,7 @@ window size итоговый размер окна стал максимальн
|
||||
Если соединение выпало из conntrack и задана опция --dpi-desync-cutoff, dpi desync применяться не будет.
|
||||
|
||||
РЕАССЕМБЛИНГ
|
||||
|
||||
nfqws поддерживает реассемблинг некоторых видов запросов.
|
||||
На текущий момент это TLS и QUIC ClientHello. Они бывает длинными, если в chrome включить пост-квантовую
|
||||
криптографию tls-kyber, и занимают как правило 2 или 3 пакета. kyber включен по умолчанию, начиная с chromium 124.
|
||||
@ -573,6 +609,7 @@ chrome рандомизирует фингерпринт TLS. SNI может о
|
||||
а последний пакет разбивается на 2 сегмента. В итоге имеем фейк в начале и 3 реальных сегмента.
|
||||
|
||||
ПОДДЕРЖКА UDP
|
||||
|
||||
Атаки на udp более ограничены в возможностях. udp нельзя фрагментировать иначе, чем на уровне ip.
|
||||
Для UDP действуют только режимы десинхронизации fake,hopbyhop,destopt,ipfrag1,ipfrag2,udplen,tamper.
|
||||
Возможно сочетание fake,hopbyhop,destopt с ipfrag2, fake,fakeknown с udplen и tamper.
|
||||
@ -592,6 +629,7 @@ udplen увеличивает размер udp пакета на указанн
|
||||
По умолчанию fake наполнение - 64 нуля. Можно указать файл в --dpi-desync-fake-unknown-udp.
|
||||
|
||||
IP ФРАГМЕНТАЦИЯ
|
||||
|
||||
Современная сеть практически не пропускает фрагментированные tcp на уровне ip.
|
||||
На udp с этим дело получше, поскольку некоторые udp протоколы могут опираться на этот механизм (IKE старых версий).
|
||||
Однако, кое-где бывает, что режут и фрагментированный udp.
|
||||
@ -618,6 +656,7 @@ options ip6table_raw raw_before_defrag=1
|
||||
В некоторых традиционных дистрибутивах можно изменить текущий ip6tables через : update-alternatives --config ip6tables
|
||||
Если вы хотите оставаться на iptables-nft, вам придется пересобрать патченную версию. Патч совсем небольшой.
|
||||
В nft.c найдите фрагмент :
|
||||
```
|
||||
{
|
||||
.name = "PREROUTING",
|
||||
.type = "filter",
|
||||
@ -630,6 +669,7 @@ options ip6table_raw raw_before_defrag=1
|
||||
.prio = -300, /* NF_IP_PRI_RAW */
|
||||
.hook = NF_INET_LOCAL_OUT,
|
||||
},
|
||||
```
|
||||
и замените везде -300 на -450.
|
||||
|
||||
Это нужно сделать вручную, никакой автоматики в blockcheck.sh нет.
|
||||
@ -647,6 +687,7 @@ tpws
|
||||
-----
|
||||
|
||||
tpws - это transparent proxy.
|
||||
```
|
||||
--debug=0|1|2 ; Количество буковок в output : 0(default)=тихо, 1=подробно, 2=отладка
|
||||
--daemon ; демонизировать прогу
|
||||
--pidfile=<file> ; сохранить PID в файл
|
||||
@ -723,6 +764,7 @@ tpws - это transparent proxy.
|
||||
--hostlist-auto-fail-threshold=<int> ; сколько раз нужно обнаружить ситуацию, похожую на блокировку, чтобы добавить хост в лист (по умолчанию: 3)
|
||||
--hostlist-auto-fail-time=<int> ; все эти ситуации должны быть в пределах указанного количества секунд (по умолчанию: 60)
|
||||
--hostlist-auto-debug=<logfile> ; лог положительных решений по autohostlist. позволяет разобраться почему там появляются хосты.
|
||||
```
|
||||
|
||||
|
||||
Параметры манипуляции могут сочетаться в любых комбинациях.
|
||||
@ -753,10 +795,12 @@ tpws может биндаться на множество интерфейсо
|
||||
Остальные параметры --bind-* относятся к последнему бинду.
|
||||
Для бинда на все ipv4 укажите --bind-addr "0.0.0.0", на все ipv6 - "::". --bind-addr="" - биндаемся на все ipv4 и ipv6.
|
||||
Выбор режима использования link local ipv6 адресов (fe80::/8) :
|
||||
--bind-iface6 --bind-linklocal=no : сначала приватный адрес fc00::/7, затем глобальный адрес
|
||||
--bind-iface6 --bind-linklocal=unwanted : сначала приватный адрес fc00::/7, затем глобальный адрес, затем link local.
|
||||
--bind-iface6 --bind-linklocal=prefer : сначала link local, затем приватный адрес fc00::/7, затем глобальный адрес.
|
||||
--bind-iface6 --bind-linklocal=force : только link local
|
||||
|
||||
* --bind-iface6 --bind-linklocal=no : сначала приватный адрес fc00::/7, затем глобальный адрес
|
||||
* --bind-iface6 --bind-linklocal=unwanted : сначала приватный адрес fc00::/7, затем глобальный адрес, затем link local.
|
||||
* --bind-iface6 --bind-linklocal=prefer : сначала link local, затем приватный адрес fc00::/7, затем глобальный адрес.
|
||||
* --bind-iface6 --bind-linklocal=force : только link local
|
||||
|
||||
Если не указано ни одного бинда, то создается бинд по умолчанию на все адреса всех интерфейсов.
|
||||
Для бинда на конкретный link-local address делаем так : --bind-iface6=fe80::aaaa:bbbb:cccc:dddd%iface-name
|
||||
Параметры --bind-wait* могут помочь в ситуациях, когда нужно взять IP с интерфейса, но его еще нет, он не поднят
|
||||
@ -1066,6 +1110,7 @@ linux, но через раз приобретает статус INVALID в con
|
||||
nfqws и tpws могут сечь варианты 1-3, 4 они не распознают.
|
||||
Всилу специфики работы с отдельными пакетами или с TCP каналом tpws и nfqws распознают эти ситуации
|
||||
по-разному.
|
||||
|
||||
Что считается ситуацией, похожей на блокировку :
|
||||
1) [nfqws] Несколько ретрансмиссий первого запроса в TCP сеансе, в котором имеется host.
|
||||
2) [nfqws,tpws] RST, пришедший в ответ на первый запрос с хостом.
|
||||
@ -1118,7 +1163,9 @@ install_easy.sh при апгрейде zapret сохраняет этот фа
|
||||
|
||||
Если DNS подменяется, но провайдер не перехватывает обращения к сторонним DNS, поменяйте DNS на публичный.
|
||||
Например : 8.8.8.8, 8.8.4.4, 1.1.1.1, 1.0.0.1, 9.9.9.9
|
||||
|
||||
Если DNS подменяется и провайдер перехватывает обращения к сторонним DNS, настройте dnscrypt.
|
||||
|
||||
Еще один эффективный вариант - использовать ресолвер от yandex 77.88.8.88 на нестандартном порту 1253.
|
||||
Многие провайдеры не анализируют обращения к DNS на нестандартных портах.
|
||||
|
||||
@ -1146,6 +1193,7 @@ standard дает возможность провести исследовани
|
||||
force дает максимум проверок даже в случаях, когда ресурс работает без обхода или с более простыми стратегиями.
|
||||
|
||||
СКАН ПОРТОВ
|
||||
|
||||
Если в системе присутствует совместимый netcat (ncat от nmap или openbsd ncat. в openwrt по умолчанию нет.),
|
||||
то выполняется сканирование портов http или https всех IP адресов домена.
|
||||
Если ни один IP не отвечает, то результат очевиден. Можно останавливать сканирование.
|
||||
@ -1154,6 +1202,7 @@ force дает максимум проверок даже в случаях, к
|
||||
из списка.
|
||||
|
||||
ПРОВЕРКА НА ЧАСТИЧНЫЙ IP block
|
||||
|
||||
Под частичным блоком подразумевается ситуация, когда конект на порты есть, но по определенному транспортному
|
||||
или прикладному протоколу всегда идет реакция DPI вне зависимости от запрашиваемого домена.
|
||||
Эта проверка так же не выдаст автоматического вердикта/решения, потому что может быть очень много вариаций.
|
||||
@ -1179,6 +1228,7 @@ option headers. Или сделать так, чтобы он не мог рас
|
||||
|
||||
ПРИМЕРЫ БЛОКИРОВКИ ТОЛЬКО ПО ДОМЕНУ БЕЗ БЛОКА ПО IP
|
||||
|
||||
```
|
||||
> testing iana.org on it's original ip
|
||||
!!!!! AVAILABLE !!!!!
|
||||
> testing rutracker.org on 192.0.43.8 (iana.org)
|
||||
@ -1215,10 +1265,12 @@ curl: (35) Recv failure: Connection reset by peer
|
||||
curl: (35) OpenSSL/3.2.1: error:0A000410:SSL routines::ssl/tls alert handshake failure
|
||||
> testing iana.org on 104.21.32.39 (rutracker.org)
|
||||
curl: (35) OpenSSL/3.2.1: error:0A000410:SSL routines::ssl/tls alert handshake failure
|
||||
```
|
||||
|
||||
|
||||
ПРИМЕР ПОЛНОГО IP БЛОКА ИЛИ БЛОКА TCP ПОРТА ПРИ ОТСУТСТВИИ БЛОКА ПО ДОМЕНУ
|
||||
|
||||
```
|
||||
* port block tests ipv4 startmail.com:80
|
||||
ncat -z -w 1 145.131.90.136 80
|
||||
145.131.90.136 does not connect. netcat code 1
|
||||
@ -1240,6 +1292,7 @@ Location: https://www.iana.org/
|
||||
curl: (28) Connection timed out after 2002 milliseconds
|
||||
> testing iana.org on 145.131.90.152 (startmail.com)
|
||||
curl: (28) Connection timed out after 2002 milliseconds
|
||||
```
|
||||
|
||||
|
||||
Выбор параметров
|
||||
@ -1255,12 +1308,12 @@ curl: (28) Connection timed out after 2002 milliseconds
|
||||
FWTYPE=iptables
|
||||
|
||||
Основной режим :
|
||||
tpws - tpws в режиме transparent
|
||||
tpws-socks - tpws в режиме socks
|
||||
вешается на localhost и LAN интерфейс (если задан IFACE_LAN или если система - OpenWRT). порт 988
|
||||
nfqws - nfqws
|
||||
filter - только заполнить ipset или загрузить hostlist
|
||||
custom - нужно самому запрограммировать запуск демонов в init скрипте и правила iptables
|
||||
* tpws - tpws в режиме transparent
|
||||
* tpws-socks - tpws в режиме socks
|
||||
* вешается на localhost и LAN интерфейс (если задан IFACE_LAN или если система - OpenWRT). порт 988
|
||||
* nfqws - nfqws
|
||||
* filter - только заполнить ipset или загрузить hostlist
|
||||
* custom - нужно самому запрограммировать запуск демонов в init скрипте и правила iptables
|
||||
|
||||
MODE=tpws
|
||||
|
||||
@ -1283,45 +1336,57 @@ MODE_HTTPS=1
|
||||
MODE_QUIC=0
|
||||
|
||||
Режим фильтрации хостов :
|
||||
none - применять дурение ко всем хостам
|
||||
ipset - ограничить дурение ipset-ом zapret/zapret6
|
||||
hostlist - ограничить дурение списком хостов из файла
|
||||
autohostlist - режим hostlist + распознавание блокировок и ведения автоматического листа
|
||||
* none - применять дурение ко всем хостам
|
||||
* ipset - ограничить дурение ipset-ом zapret/zapret6
|
||||
* hostlist - ограничить дурение списком хостов из файла
|
||||
* autohostlist - режим hostlist + распознавание блокировок и ведения автоматического листа
|
||||
|
||||
MODE_FILTER=none
|
||||
|
||||
Опции tpws :
|
||||
|
||||
```
|
||||
TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=3"
|
||||
```
|
||||
|
||||
Опции nfqws для атаки десинхронизации DPI :
|
||||
|
||||
```
|
||||
DESYNC_MARK=0x40000000
|
||||
DESYNC_MARK_POSTNAT=0x20000000
|
||||
NFQWS_OPT_DESYNC="--dpi-desync=fake --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
|
||||
```
|
||||
|
||||
Задание раздельных опций nfqws для http и https и для версий ip протоколов 4,6 :
|
||||
|
||||
```
|
||||
NFQWS_OPT_DESYNC_HTTP="--dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
|
||||
NFQWS_OPT_DESYNC_HTTPS="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
|
||||
NFQWS_OPT_DESYNC_HTTP6="--dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"
|
||||
NFQWS_OPT_DESYNC_HTTPS6="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"
|
||||
```
|
||||
|
||||
Если какая-то из переменных NFQWS_OPT_DESYNC_HTTP/NFQWS_OPT_DESYNC_HTTPS не определена,
|
||||
берется значение NFQWS_OPT_DESYNC.
|
||||
|
||||
Если какая-то из переменных NFQWS_OPT_DESYNC_HTTP6/NFQWS_OPT_DESYNC_HTTPS6 не определена,
|
||||
берется значение NFQWS_OPT_DESYNC_HTTP/NFQWS_OPT_DESYNC_HTTPS.
|
||||
|
||||
Опции дурения для QUIC :
|
||||
|
||||
```
|
||||
NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake"
|
||||
NFQWS_OPT_DESYNC_QUIC6="--dpi-desync=hopbyhop"
|
||||
```
|
||||
|
||||
Если NFQWS_OPT_DESYNC_QUIC6 не задано, то берется NFQWS_OPT_DESYNC_QUIC.
|
||||
|
||||
Настройка системы управления выборочным traffic offload (только если поддерживается)
|
||||
donttouch : выборочное управление отключено, используется системная настройка, простой инсталятор выключает системную настройку, если она не совместима с выбранным режимом
|
||||
none : выборочное управление отключено, простой инсталятор выключает системную настройку
|
||||
software : выборочное управление включено в режиме software, простой инсталятор выключает системную настройку
|
||||
hardware : выборочное управление включено в режиме hardware, простой инсталятор выключает системную настройку
|
||||
|
||||
* donttouch : выборочное управление отключено, используется системная настройка, простой инсталятор выключает системную настройку, если она не совместима с выбранным режимом
|
||||
* none : выборочное управление отключено, простой инсталятор выключает системную настройку
|
||||
* software : выборочное управление включено в режиме software, простой инсталятор выключает системную настройку
|
||||
* hardware : выборочное управление включено в режиме hardware, простой инсталятор выключает системную настройку
|
||||
|
||||
FLOWOFFLOAD=donttouch
|
||||
|
||||
@ -1333,16 +1398,19 @@ FLOWOFFLOAD=donttouch
|
||||
|
||||
Можно индивидуально отключить ipv4 или ipv6. Если параметр закомментирован или не равен "1",
|
||||
использование протокола разрешено.
|
||||
|
||||
#DISABLE_IPV4=1
|
||||
DISABLE_IPV6=1
|
||||
|
||||
Количество потоков для многопоточного DNS ресолвера mdig (1..100).
|
||||
Чем их больше, тем быстрее, но не обидится ли на долбежку ваш DNS сервер ?
|
||||
|
||||
MDIG_THREADS=30
|
||||
|
||||
Место для хранения временных файлов. При скачивании огромных реестров в /tmp места может не хватить.
|
||||
Если файловая система на нормальном носителе (не встроенная память роутера), то можно
|
||||
указать место на флэшке или диске.
|
||||
|
||||
TMPDIR=/opt/zapret/tmp
|
||||
|
||||
Опции для создания ipset-ов и nfset-ов
|
||||
@ -1355,6 +1423,7 @@ IPSET_OPT="hashsize 262144 maxelem 2097152"
|
||||
IPSET_HOOK="/etc/zapret.ipset.hook"
|
||||
|
||||
ПРО РУГАНЬ в dmesg по поводу нехватки памяти.
|
||||
|
||||
Может так случиться, что памяти в системе достаточно, но при попытке заполнить огромный ipset
|
||||
ядро начинает громко ругаться, ipset заполняется не полностью.
|
||||
Вероятная причина в том, что превышается hashsize, заданный при создании ipset (create_ipset.sh).
|
||||
@ -1363,16 +1432,23 @@ IPSET_HOOK="/etc/zapret.ipset.hook"
|
||||
Задавать слишком большой hashsize для недостаточно больших списков нецелесообразно.
|
||||
|
||||
Опции для вызова ip2net. Отдельно для листов ipv4 и ipv6.
|
||||
|
||||
```
|
||||
IP2NET_OPT4="--prefix-length=22-30 --v4-threshold=3/4"
|
||||
IP2NET_OPT6="--prefix-length=56-64 --v6-threshold=5"
|
||||
```
|
||||
|
||||
Настройка режима autohostlist.
|
||||
|
||||
```
|
||||
AUTOHOSTLIST_RETRANS_THRESHOLD=3
|
||||
AUTOHOSTLIST_FAIL_THRESHOLD=2
|
||||
AUTOHOSTLIST_FAIL_TIME=60
|
||||
AUTOHOSTLIST_DEBUG=0
|
||||
```
|
||||
|
||||
Включить или выключить сжатие больших листов в скриптах ipset/*.sh. По умолчанию включено.
|
||||
|
||||
GZIP_LISTS=1
|
||||
|
||||
Команда для перезагрузки ip таблиц фаервола.
|
||||
@ -1385,12 +1461,16 @@ GZIP_LISTS=1
|
||||
|
||||
В openwrt существует сеть по умолчанию 'lan'. Только трафик с этой сети будет перенаправлен на tpws.
|
||||
Но возможно задать другие сети или список сетей :
|
||||
|
||||
OPENWRT_LAN="lan lan2 lan3"
|
||||
|
||||
В openwrt в качестве wan берутся интерфейсы, имеющие default route. Отдельно для ipv4 и ipv6.
|
||||
Это можно переопределить :
|
||||
|
||||
```
|
||||
OPENWRT_WAN4="wan4 vpn"
|
||||
OPENWRT_WAN6="wan6 vpn6"
|
||||
```
|
||||
|
||||
Параметр INIT_APPLY_FW=1 разрешает init скрипту самостоятельно применять правила iptables.
|
||||
При иных значениях или если параметр закомментирован, правила применены не будут.
|
||||
@ -1400,9 +1480,13 @@ OPENWRT_WAN6="wan6 vpn6"
|
||||
Следующие настройки не актуальны для openwrt :
|
||||
|
||||
Если ваша система работает как роутер, то нужно вписать названия внутренних и внешних интерфейсов :
|
||||
|
||||
```
|
||||
IFACE_LAN=eth0
|
||||
IFACE_WAN=eth1
|
||||
IFACE_WAN6="henet ipsec0"
|
||||
```
|
||||
|
||||
Несколько интерфейсов могут быть вписаны через пробел.
|
||||
Если IFACE_WAN6 не задан, то берется значение IFACE_WAN.
|
||||
|
||||
@ -1419,15 +1503,19 @@ IFACE_WAN6="henet ipsec0"
|
||||
|
||||
Следующие вызовы позволяют применить или убрать правила iptables отдельно :
|
||||
|
||||
```
|
||||
/opt/zapret/init.d/sysv/zapret start_fw
|
||||
/opt/zapret/init.d/sysv/zapret stop_fw
|
||||
/opt/zapret/init.d/sysv/zapret restart_fw
|
||||
```
|
||||
|
||||
А так можно запустить или остановить демоны отдельно от фаервола :
|
||||
|
||||
```
|
||||
/opt/zapret/init.d/sysv/zapret start_daemons
|
||||
/opt/zapret/init.d/sysv/zapret stop_daemons
|
||||
/opt/zapret/init.d/sysv/zapret restart_daemons
|
||||
```
|
||||
|
||||
nftables сводят практически на нет конфликты между разными системами управления, поскольку позволяют
|
||||
использовать независимые таблицы и хуки. Используется отдельная nf-таблица "zapret".
|
||||
@ -1450,10 +1538,12 @@ nftables сводят практически на нет конфликты ме
|
||||
|
||||
Так же возможно прицепиться своим скриптом к любой стадии применения и снятия фаервола со стороны zapret скриптов :
|
||||
|
||||
```
|
||||
INIT_FW_PRE_UP_HOOK="/etc/firewall.zapret.hook.pre_up"
|
||||
INIT_FW_POST_UP_HOOK="/etc/firewall.zapret.hook.post_up"
|
||||
INIT_FW_PRE_DOWN_HOOK="/etc/firewall.zapret.hook.pre_down"
|
||||
INIT_FW_POST_DOWN_HOOK="/etc/firewall.zapret.hook.post_down"
|
||||
```
|
||||
|
||||
Эти настройки доступны в config.
|
||||
Может быть полезно, если вам нужно использовать nftables set-ы, например ipban/ipban6.
|
||||
@ -1465,14 +1555,20 @@ nfset-ы принадлежат только одной таблице, след
|
||||
--------------
|
||||
|
||||
custom код вынесен в отдельный shell include
|
||||
```
|
||||
/opt/zapret/init.d/sysv/custom
|
||||
```
|
||||
или
|
||||
```
|
||||
/opt/zapret/init.d/openwrt/custom
|
||||
```
|
||||
|
||||
Нужно свой код вписать в функции :
|
||||
```
|
||||
zapret_custom_daemons
|
||||
zapret_custom_firewall
|
||||
zapret_custom_firewall_nft
|
||||
```
|
||||
|
||||
В файле custom пишите ваш код, пользуясь хелперами из "functions" или "zapret".
|
||||
Смотрите как там сделано добавление iptables или запуск демонов.
|
||||
@ -1513,7 +1609,9 @@ install_easy.sh автоматизирует ручные варианты пр
|
||||
через make. Для этого нужны gcc, make и необходимые -dev пакеты. Можно форсировать режим
|
||||
компиляции следующим вызовом :
|
||||
|
||||
```
|
||||
install_easy.sh make
|
||||
```
|
||||
|
||||
Под openwrt все уже сразу готово для использования системы в качестве роутера.
|
||||
Имена интерфейсов WAN и LAN известны из настроек системы.
|
||||
@ -1537,11 +1635,15 @@ install_easy.sh автоматизирует ручные варианты пр
|
||||
Копируем zapret на роутер в /tmp.
|
||||
|
||||
Запускаем установщик :
|
||||
```
|
||||
sh /tmp/zapret/install_easy.sh
|
||||
```
|
||||
Он скопирует в /opt/zapret только необходимый минимум файлов.
|
||||
|
||||
После успешной установки можно удалить zapret из tmp для освобождения RAM :
|
||||
```
|
||||
rm -r /tmp/zapret
|
||||
```
|
||||
|
||||
Для более гибкой настройки перед запуском инсталятора следует выполнить раздел "Выбор параметров".
|
||||
|
||||
@ -1561,13 +1663,17 @@ Android
|
||||
tpws будет работать в любом случае, он не требует чего-либо особенного.
|
||||
В android нет /etc/passwd, потому опция --user не будет работать. Вместо нее можно
|
||||
пользоваться числовыми user id и опцией --uid.
|
||||
|
||||
Рекомендую использовать gid 3003 (AID_INET). Иначе можете получить permission denied на создание сокета.
|
||||
Например : --uid 1:3003
|
||||
|
||||
В iptables укажите : "! --uid-owner 1" вместо "! --uid-owner tpws".
|
||||
Напишите шелл скрипт с iptables и tpws, запускайте его средствами вашего рут менеджера.
|
||||
Скрипты автозапуска лежат тут :
|
||||
```
|
||||
magisk : /data/adb/service.d
|
||||
supersu : /system/su.d
|
||||
```
|
||||
|
||||
nfqws может иметь такой глюк. При запуске с uid по умолчанию (0x7FFFFFFF) при условии работы на сотовом интерфейсе
|
||||
и отключенном кабеле внешнего питания система может частично виснуть. Перестает работать тач и кнопки,
|
||||
@ -1581,10 +1687,12 @@ wifi такого не наблюдается. suspend обработчика nf
|
||||
|
||||
Ответ на вопрос куда поместить tpws на android без рута, чтобы потом его запускать из приложений.
|
||||
Файл заливаем через adb shell в /data/local/tmp/, лучше всего в субфолдер.
|
||||
```
|
||||
mkdir /data/local/tmp/zapret
|
||||
adb push tpws /data/local/tmp/zapret
|
||||
chmod 755 /data/local/tmp/zapret /data/local/tmp/zapret/tpws
|
||||
chcon u:object_r:system_file:s0 /data/local/tmp/zapret/tpws
|
||||
```
|
||||
|
||||
Как найти стратегию обхода сотового оператора : проще всего раздать инет на комп с linux.
|
||||
Можно записать live image linux на флэшку и загрузиться с нее или запустить виртуалку с linux
|
||||
@ -1598,21 +1706,29 @@ chcon u:object_r:system_file:s0 /data/local/tmp/zapret/tpws
|
||||
Если это не эмулятор android, то универсальная архитектура - arm (любой вариант).
|
||||
Если вы точно знаете, что ОС у вас 64-разрядная, то лучше вместо arm - aarch64.
|
||||
|
||||
```
|
||||
mount --bind /dev /data/linux/dev
|
||||
mount --bind /proc /data/linux/proc
|
||||
mount --bind /sys /data/linux/sys
|
||||
chroot /data/linux
|
||||
```
|
||||
|
||||
Первым делом вам нужно будет один раз настроить DNS. Сам он не заведется.
|
||||
|
||||
```
|
||||
echo nameserver 1.1.1.1 >/etc/resolv.conf
|
||||
```
|
||||
|
||||
Далее нужно средствами пакетного менеджера установить iptables-legacy. Обязательно НЕ iptables-nft,
|
||||
который как правило присутствует по умолчанию. В ядре android нет nftables.
|
||||
```
|
||||
ls -la $(which iptables)
|
||||
```
|
||||
Линк должен указывать на legacy вариант.
|
||||
Если нет, значит устанавливайте нужные пакеты вашего дестрибутива, и убеждайтесь в правильности ссылок.
|
||||
```
|
||||
iptables -S
|
||||
```
|
||||
Так можно проверить, что ваш iptables увидел то, что туда насовал android. iptables-nft выдаст ошибку.
|
||||
Далее качаем zapret в /opt/zapret. Обычные действия с install_prereq.sh, install_bin.sh, blockcheck.sh.
|
||||
|
||||
@ -1651,6 +1767,7 @@ nfqueue поломан. можно собрать фиксящий модуль
|
||||
|
||||
Чтобы избежать проблемы с offload-ом при использвании nfqws, следует комбинировать tpws в режиме tcp proxy и nfqws.
|
||||
Правила NFQUEUE пишутся для цепочки OUTPUT.
|
||||
|
||||
connbytes придется опускать, поскольку модуля в ядре нет. Но это не смертельно.
|
||||
|
||||
Скрипт автозапуска - /system/etc/autorun.sh. Создайте свой скрипт настройки zapret,
|
||||
@ -1658,10 +1775,13 @@ connbytes придется опускать, поскольку модуля в
|
||||
поднятия сети и iptables от huawei.
|
||||
|
||||
ПРЕДУПРЕЖДЕНИЕ.
|
||||
|
||||
На этом модеме происходят хаотические сбросы соединений tcp по непонятным причинам.
|
||||
Выглядит это так, если запускать curl с самого модема :
|
||||
```
|
||||
curl www.ru
|
||||
curl: (7) Failed to connect to www.ru port 80: Host is unreachable
|
||||
```
|
||||
Возникает ошибка сокета EHOSTUNREACH (errno -113). То же самое видно в tpws.
|
||||
В броузере не подгружаются части веб страниц, картинки, стили.
|
||||
В tcpdump на внешнем интерфейсе eth_x виден только единственный и безответный SYN пакет, без сообщений ICMP.
|
||||
|
Loading…
Reference in New Issue
Block a user