|
@ -47,15 +47,6 @@ BSD не содержит системного вызова splice. tpws раб |
|
|
Управление асинхронными сокетами в tpws основано на linux-specific механизме epoll. |
|
|
Управление асинхронными сокетами в tpws основано на linux-specific механизме epoll. |
|
|
В BSD для его эмуляции используется epoll-shim - прослойка для эмуляции epoll на базе kqueue. |
|
|
В 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. В них нет ничего системо-зависимого. |
|
|
mdig и ip2net полностью работоспособны в BSD. В них нет ничего системо-зависимого. |
|
|
|
|
|
|
|
|
FreeBSD |
|
|
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 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 |
|
|
# 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 |
|
|
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 |
|
|
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2 |
|
|
|
|
|
|
|
|
Для трафика только на таблицу zapret, за исключением таблицы nozapret : |
|
|
Для трафика только на таблицу zapret, за исключением таблицы nozapret : |
|
|
ipfw delete 100 |
|
|
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 |
|
|
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 |
|
|
/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: |
|
|
PF в FreeBSD: |
|
|
Настройка аналогична OpenBSD, но есть важные нюансы. |
|
|
Настройка аналогична OpenBSD, но есть важные нюансы. |
|
@ -152,8 +134,10 @@ PF в FreeBSD: |
|
|
Смотрите через ifconfig адрес fe80:... и добавляете в правило |
|
|
Смотрите через ifconfig адрес fe80:... и добавляете в правило |
|
|
3) Синтаксис pf.conf немного отличается. Более новая версия PF. |
|
|
3) Синтаксис pf.conf немного отличается. Более новая версия PF. |
|
|
4) Лимит на количество элементов таблиц задается так : sysctl net.pf.request_maxcount=2000000 |
|
|
4) Лимит на количество элементов таблиц задается так : sysctl net.pf.request_maxcount=2000000 |
|
|
5) Слово 'divert-packet' отсутствует в бинарике pfctl, правила divert-packet выдают ошибку. |
|
|
5) divert-to сломан. Он работает, но не работает механизм предотвращения зацикливаний. |
|
|
'divert-to' - это не то. Не похоже, что в FreeBSD можно завести dvtws через PF. |
|
|
Кто-то уже написал патч, но в 14-RELEASE проблема все еще есть. |
|
|
|
|
|
Следовательно, на данный момент работа dvtws через pf невозможна. |
|
|
|
|
|
|
|
|
/etc/pf.conf |
|
|
/etc/pf.conf |
|
|
----------- |
|
|
----------- |
|
|
rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::31c:29ff:dee2:1c4d port 988 |
|
|
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 основано на FreeBSD. |
|
|
pfsense использует фаервол pf, а он не поддерживает divert. |
|
|
pfsense использует фаервол pf, а он имеет проблемы с divert. |
|
|
К счастью, модули ipfw и ipdivert присутствуют в поставке последних версий pfsense. |
|
|
К счастью, модули ipfw и ipdivert присутствуют в поставке последних версий pfsense. |
|
|
Их можно подгрузить через kldload. |
|
|
Их можно подгрузить через kldload. |
|
|
В некоторых более старых версиях pfsense требуется изменить порядок фаерволов через sysctl, сделав ipfw первым. |
|
|
В некоторых более старых версиях pfsense требуется изменить порядок фаерволов через sysctl, сделав ipfw первым. |
|
@ -204,7 +188,7 @@ sysctl net.inet6.ip6.pfil.outbound=ipfw,pf |
|
|
sysctl net.inet6.ip6.pfil.inbound=ipfw,pf |
|
|
sysctl net.inet6.ip6.pfil.inbound=ipfw,pf |
|
|
|
|
|
|
|
|
ipfw delete 100 |
|
|
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$ |
|
|
pkill ^dvtws$ |
|
|
dvtws --daemon --port 989 --dpi-desync=split2 |
|
|
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 |
|
|
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 |
|
|
OpenBSD |
|
|
------- |
|
|
------- |
|
@ -351,10 +338,7 @@ MacOS |
|
|
|
|
|
|
|
|
Иначально ядро этой ОС "darwin" основывалось на BSD, потому в ней много похожего на другие версии BSD. |
|
|
Иначально ядро этой ОС "darwin" основывалось на BSD, потому в ней много похожего на другие версии BSD. |
|
|
Однако, как и в других массовых коммерческих проектах, приоритеты смещаются в сторону от оригинала. |
|
|
Однако, как и в других массовых коммерческих проектах, приоритеты смещаются в сторону от оригинала. |
|
|
Яблочники что хотят, то и творят. Меняют, убирают, оставляют какие-то безумно старые версии API и утилит. |
|
|
Яблочники что хотят, то и творят. |
|
|
То, что уже давно везде обновили, может быть еще древним как мамонт в самой последней версии MacOS. |
|
|
|
|
|
Но кого это волнует ? |
|
|
|
|
|
|
|
|
|
|
|
Раньше был ipfw, потом его убрали, заменили на PF. |
|
|
Раньше был ipfw, потом его убрали, заменили на PF. |
|
|
Есть сомнения, что divert сокеты в ядре остались. Попытка создать divert socket не выдает ошибок, |
|
|
Есть сомнения, что divert сокеты в ядре остались. Попытка создать divert socket не выдает ошибок, |
|
|
но полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными косяками + еще яблочно специфическими. |
|
|
но полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными косяками + еще яблочно специфическими. |
|
|