update bins and docs

This commit is contained in:
bol-van
2024-08-24 09:52:27 +03:00
parent 2f11c330cd
commit f8a673b458
47 changed files with 58 additions and 48 deletions

View File

@@ -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, со всеми его унаследованными косяками + еще яблочно специфическими.