mirror of
https://github.com/bol-van/zapret.git
synced 2025-05-24 22:32:58 +03:00
update bins and docs
This commit is contained in:
@@ -185,9 +185,9 @@ The setup is similar to OpenBSD, but there are important nuances.
|
||||
use it for redirection target.
|
||||
3. pf.conf syntax is a bit different from OpenBSD.
|
||||
4. How to set maximum table size : sysctl net.pf.request_maxcount=2000000
|
||||
5. The word 'divert-packet' is absent in the pfctl binary, divert-packet rules
|
||||
are not working. 'divert-to' is not the same thing. Looks like its not
|
||||
possible to use `dvtws` with PF in FreeBSD.
|
||||
5. `divert-to` is broken. Loop avoidance scheme does not work.
|
||||
This makes `dvtws` unusable with pf.
|
||||
Someone posted kernel patch but 14-RELEASE is still broken.
|
||||
|
||||
`/etc/pf.conf`:
|
||||
```
|
||||
@@ -303,6 +303,8 @@ rdr pass on em1 inet6 proto tcp from any to any port = http -> fe80::20c:29ff:5a
|
||||
rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5ae3:4821 port 988
|
||||
```
|
||||
|
||||
Also there's a way to add redirect in the pfsense UI and start `tpws` from cron using `@reboot` prefix.
|
||||
This way avoids modification of pfsense code.
|
||||
|
||||
## OpenBSD
|
||||
|
||||
@@ -425,8 +427,7 @@ Then write the line:
|
||||
|
||||
Initially, the kernel of this OS was based on BSD. That's why it is still BSD
|
||||
but a lot was modified by Apple. As usual a mass commercial project priorities
|
||||
differ from their free counterparts. Apple guys do what they want. What
|
||||
everyone have updated long ago they keep old like a mammoth. But who cares?
|
||||
differ from their free counterparts. Apple guys do what they want.
|
||||
|
||||
MacOS used to have ipfw but it was removed later and replaced by PF. It looks
|
||||
like divert sockets are internally replaced with raw. Its possible to request a
|
||||
|
42
docs/bsd.txt
42
docs/bsd.txt
@@ -47,15 +47,6 @@ BSD не содержит системного вызова splice. tpws раб
|
||||
Управление асинхронными сокетами в tpws основано на linux-specific механизме epoll.
|
||||
В BSD для его эмуляции используется epoll-shim - прослойка для эмуляции epoll на базе kqueue.
|
||||
|
||||
Некоторые функции dvtws пришлось реализовывать через хаки.
|
||||
В BSD много ограничений, особенностей и багов при работе с низкоуровневой сетью, в особенности в области ipv6.
|
||||
Казалось бы столько лет прошло, а в коде все еще сидят ограничители 15-20 летней давности.
|
||||
Прямая отсылка ipv6 фреймов с измененным source address и вовсе невозможна через raw sockets.
|
||||
OpenBSD не дает отсылать через raw sockets tcp фреймы.
|
||||
Там, где функции нельзя было реализовать напрямую, либо их реализация привела бы к залезанию в низкоуровневые дебри,
|
||||
используются те же divert сокеты. Оказывается через них можно скармливать ядру любые пакеты, обходя ограничения
|
||||
raw sockets. Не знаю насколько это легально, но пока это работает. Однако, имейте в виду. Что-то может сломаться.
|
||||
|
||||
mdig и ip2net полностью работоспособны в BSD. В них нет ничего системо-зависимого.
|
||||
|
||||
FreeBSD
|
||||
@@ -122,10 +113,10 @@ ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
|
||||
Для всего трафика :
|
||||
ipfw delete 100
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||
# required for autottl mode only
|
||||
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
||||
/opt/zapret/nfq/dvtws --port=989 ---dpi-desync=split2
|
||||
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0
|
||||
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
||||
|
||||
Для трафика только на таблицу zapret, за исключением таблицы nozapret :
|
||||
ipfw delete 100
|
||||
@@ -135,15 +126,6 @@ ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted
|
||||
ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
||||
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
||||
|
||||
Недопущение зацикливания - повторного вхождения фейк пакетов на обработку.
|
||||
FreeBSD игнорирует sockarg в ipv6.
|
||||
Это искусственное ограничение в коде ядра, которое тянется уже лет 10-20.
|
||||
Кто-то в свое время посчитал код сырым, и до сих пор никто не удосужился поправить.
|
||||
dvtws в FreeBSD отсылает ipv4 фреймы через raw socket. Такие пакеты не 'diverted'. Они отсекаются по 'sockarg'.
|
||||
Для отсылки ipv6 фейков используется divert socket, потому что ipv6 raw сокеты в BSD не дают самому
|
||||
формировать IP заголовок и подменять source address. Фейки в ipv6 'diverted'. Они отсекаются по 'diverted'.
|
||||
В linux nfqws для недопущения зацикливания используется fwmark.
|
||||
|
||||
|
||||
PF в FreeBSD:
|
||||
Настройка аналогична OpenBSD, но есть важные нюансы.
|
||||
@@ -152,8 +134,10 @@ PF в FreeBSD:
|
||||
Смотрите через ifconfig адрес fe80:... и добавляете в правило
|
||||
3) Синтаксис pf.conf немного отличается. Более новая версия PF.
|
||||
4) Лимит на количество элементов таблиц задается так : sysctl net.pf.request_maxcount=2000000
|
||||
5) Слово 'divert-packet' отсутствует в бинарике pfctl, правила divert-packet выдают ошибку.
|
||||
'divert-to' - это не то. Не похоже, что в FreeBSD можно завести dvtws через PF.
|
||||
5) divert-to сломан. Он работает, но не работает механизм предотвращения зацикливаний.
|
||||
Кто-то уже написал патч, но в 14-RELEASE проблема все еще есть.
|
||||
Следовательно, на данный момент работа dvtws через pf невозможна.
|
||||
|
||||
/etc/pf.conf
|
||||
-----------
|
||||
rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::31c:29ff:dee2:1c4d port 988
|
||||
@@ -168,7 +152,7 @@ pfsense
|
||||
-------
|
||||
|
||||
pfsense основано на FreeBSD.
|
||||
pfsense использует фаервол pf, а он не поддерживает divert.
|
||||
pfsense использует фаервол pf, а он имеет проблемы с divert.
|
||||
К счастью, модули ipfw и ipdivert присутствуют в поставке последних версий pfsense.
|
||||
Их можно подгрузить через kldload.
|
||||
В некоторых более старых версиях pfsense требуется изменить порядок фаерволов через sysctl, сделав ipfw первым.
|
||||
@@ -204,7 +188,7 @@ sysctl net.inet6.ip6.pfil.outbound=ipfw,pf
|
||||
sysctl net.inet6.ip6.pfil.inbound=ipfw,pf
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||
pkill ^dvtws$
|
||||
dvtws --daemon --port 989 --dpi-desync=split2
|
||||
|
||||
@@ -261,6 +245,9 @@ rdr pass on em1 inet6 proto tcp from any to any port = http -> fe80::20c:29ff:5a
|
||||
rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5ae3:4821 port 988
|
||||
-----------
|
||||
|
||||
Так же есть более элегантный способ запуска tpws через @reboot в cron и правило перенаправления в UI.
|
||||
Это позволит не редактировать код pfsense.
|
||||
|
||||
|
||||
OpenBSD
|
||||
-------
|
||||
@@ -351,10 +338,7 @@ MacOS
|
||||
|
||||
Иначально ядро этой ОС "darwin" основывалось на BSD, потому в ней много похожего на другие версии BSD.
|
||||
Однако, как и в других массовых коммерческих проектах, приоритеты смещаются в сторону от оригинала.
|
||||
Яблочники что хотят, то и творят. Меняют, убирают, оставляют какие-то безумно старые версии API и утилит.
|
||||
То, что уже давно везде обновили, может быть еще древним как мамонт в самой последней версии MacOS.
|
||||
Но кого это волнует ?
|
||||
|
||||
Яблочники что хотят, то и творят.
|
||||
Раньше был ipfw, потом его убрали, заменили на PF.
|
||||
Есть сомнения, что divert сокеты в ядре остались. Попытка создать divert socket не выдает ошибок,
|
||||
но полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными косяками + еще яблочно специфическими.
|
||||
|
@@ -19,22 +19,16 @@ ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
|
||||
|
||||
; Loop avoidance.
|
||||
; FreeBSD artificially ignores sockarg for ipv6 in the kernel.
|
||||
; This limitation is coming from the ipv6 early age. Code is still in "testing" state. 10-20 years. Everybody forgot about it.
|
||||
; dvtws sends ipv6 forged frames using another divert socket (HACK). they can be filtered out using 'diverted'.
|
||||
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||
; required for autottl mode
|
||||
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
||||
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0
|
||||
; udp
|
||||
ipfw add 100 divert 989 udp from any to any 443 out not diverted not sockarg xmit em0
|
||||
ipfw add 100 divert 989 udp from any to any 443 out not diverted xmit em0
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
||||
ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted xmit em0
|
||||
|
||||
/opt/zapret/nfq/dvtws --port=989 --debug --dpi-desync=split
|
||||
|
||||
|
@@ -299,3 +299,13 @@ v60
|
||||
|
||||
blockcheck: port block test, partial ip block test
|
||||
nfqws: seqovl split/disorder modes
|
||||
|
||||
v61
|
||||
|
||||
C code cleanups
|
||||
dvtws: do not use raw sockets. use divert.
|
||||
nfqws,tpws: detect TLS 1.2 ClientHello from very old libraries with SSL 3.0 version in record layer
|
||||
nfqws,tpws: debug log to file and syslog
|
||||
tpws: --connect-bind-addr option
|
||||
tpws: log local endpoint (including source port number) for remote leg
|
||||
nfqws,tpws: reduced executable size by several KB by moving logging from macros to functions
|
||||
|
@@ -130,7 +130,7 @@ NFQWS_OPT_DESYNC_HTTP и NFQWS_OPT_DESYNC_HTTPS заменяют стратег
|
||||
9) На все остальные вопросы install_easy.sh отвечайте согласно выводимой аннонтации.
|
||||
|
||||
10) Если ломаются отдельные незаблокированные ресурсы, следует вносить их в исключения, либо пользоваться ограничивающим
|
||||
ipset или хост листом. Читайте основной толмуд readme.txt ради подробностей.
|
||||
ipset или хост листом. Читайте основной талмуд readme.txt ради подробностей.
|
||||
|
||||
Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
|
||||
В некоторых случаях вы не обойдетесь без знаний и основного "талмуда".
|
||||
|
@@ -571,7 +571,8 @@ You need to use nftables instead with hook priority 101 or higher.
|
||||
tpws is transparent proxy.
|
||||
|
||||
```
|
||||
--debug=0|1|2 ; 0(default)=silent 1=verbose 2=debug
|
||||
--debug=0|1|2|syslog|@<filename> ; 1 and 2 means log to console and set debug level. for other targets use --debug-level.
|
||||
--debug-level=0|1|2 ; specify debug level for syslog and @<filename>
|
||||
--bind-addr=<v4_addr>|<v6_addr>; for v6 link locals append %interface_name : fe80::1%br-lan
|
||||
--bind-iface4=<interface_name> ; bind to the first ipv4 addr of interface
|
||||
--bind-iface6=<interface_name> ; bind to the first ipv6 addr of interface
|
||||
@@ -584,6 +585,7 @@ tpws is transparent proxy.
|
||||
--bind-wait-ip=<sec> ; after ifup wait for ip address to appear up to N seconds
|
||||
--bind-wait-ip-linklocal=<sec> ; accept only link locals first N seconds then any
|
||||
--bind-wait-only ; wait for bind conditions satisfaction then exit. return code 0 if success.
|
||||
--connect-bind-addr=<v4_addr>|<v6_addr> ; address for outbound connections. for v6 link locals append %%interface_name
|
||||
--port=<port> ; port number to listen on
|
||||
--socks ; implement socks4/5 proxy instead of transparent proxy
|
||||
--local-rcvbuf=<bytes> ; SO_RCVBUF for local legs
|
||||
|
@@ -1,4 +1,4 @@
|
||||
zapret v.60
|
||||
zapret v.61
|
||||
|
||||
English
|
||||
-------
|
||||
@@ -282,6 +282,11 @@ nfqws
|
||||
ЗАМЕЧАНИЕ. Параметр --wsize считается устаревшим и более не поддерживается в скриптах.
|
||||
Функции сплита выполняются в рамках атаки десинхронизации. Это быстрее и избавляет от целого ряда недостатков wsize.
|
||||
|
||||
--debug позволяет выводить подробный лог действий на консоль, в syslog или в файл.
|
||||
Может быть важен порядок следования опций. --debug лучше всего указывать в самом начале.
|
||||
Опции анализируются последовательно. Если ошибка будет при проверке опции, а до анализа --debug еще дело не дошло,
|
||||
то сообщения не будут выведены в файл или syslog.
|
||||
|
||||
АТАКА ДЕСИНХРОНИЗАЦИИ DPI
|
||||
Суть ее в следующем. После выполнения tcp 3-way handshake идет первый пакет с данными от клиента.
|
||||
Там обычно "GET / ..." или TLS ClientHello. Мы дропаем этот пакет, заменяя чем-то другим.
|
||||
@@ -647,7 +652,8 @@ tpws
|
||||
-----
|
||||
|
||||
tpws - это transparent proxy.
|
||||
--debug=0|1|2 ; Количество буковок в output : 0(default)=тихо, 1=подробно, 2=отладка
|
||||
--debug=0|1|2|syslog|@<filename> ; 0,1,2 = логирование на косоль : 0=тихо, 1(default)=подробно, 2=отладка.
|
||||
--debug-level=0|1|2 ; указать уровень логирования для syslog и @<filename>
|
||||
--daemon ; демонизировать прогу
|
||||
--pidfile=<file> ; сохранить PID в файл
|
||||
--user=<username> ; менять uid процесса
|
||||
@@ -668,6 +674,10 @@ tpws - это transparent proxy.
|
||||
; --bind-linklocal=unwanted : согласиться на LL после N секунд
|
||||
; --bind-linklocal=prefer : согласиться на global address после N секунд
|
||||
--bind-wait-only ; подождать все бинды и выйти. результат 0 в случае успеха, иначе не 0.
|
||||
--connect-bind-addr ; с какого адреса подключаться во внешнюю сеть. может быть ipv4 или ipv6 адрес
|
||||
; если указан ipv6 link local, то требуется указать с какого он интерфейса : fe80::1%br-lan
|
||||
; опция может повторяться для v4 и v6 адресов
|
||||
; опция не отменяет правил маршрутизации ! выбор интерфейса определяется лишь правилами маршрутизации, кроме случая v6 link local.
|
||||
--socks ; вместо прозрачного прокси реализовать socks4/5 proxy
|
||||
--no-resolve ; запретить ресолвинг имен через socks5
|
||||
--resolve-threads ; количество потоков ресолвера
|
||||
@@ -725,6 +735,15 @@ tpws - это transparent proxy.
|
||||
--hostlist-auto-debug=<logfile> ; лог положительных решений по autohostlist. позволяет разобраться почему там появляются хосты.
|
||||
|
||||
|
||||
--debug позволяет выводить подробный лог действий на консоль, в syslog или в файл.
|
||||
Может быть важен порядок следования опций. --debug лучше всего указывать в самом начале.
|
||||
Опции анализируются последовательно. Если ошибка будет при проверке опции, а до анализа --debug еще дело не дошло,
|
||||
то сообщения не будут выведены в файл или syslog.
|
||||
--debug=0|1|2 позволяют сразу в одном параметре включить логирование на консоль и указать уровень.
|
||||
Сохранено для совместимости с более старыми версиями. Для выбора уровня в режиме syslog или file используйте
|
||||
отдельный параметр --debug-level. Если в этих режимах --debug не указывать уровень через --debug-level, то автоматически
|
||||
назначается уровень 1.
|
||||
|
||||
Параметры манипуляции могут сочетаться в любых комбинациях.
|
||||
|
||||
В случае http запроса split-http-req имеет преимущество над split-pos.
|
||||
|
Reference in New Issue
Block a user