bol-van / zapret

DPI bypass multi platform
5.81k stars 510 forks source link

Интеграция с pfSense, проблемы, вопросы, ньюансы #275

Open TolianIPB opened 4 weeks ago

TolianIPB commented 4 weeks ago

Хочу вначале поблагодарить автора за большой труд и внимание к деталям. А также обширную документацию.

Текущая версия: 2.7.2-RELEASE (amd64) FreeBSD 14.0-CURRENT Репозиторий не расширял.

Цель - перенаправить только Youtube. И очень желательно, чтобы работало через Squid proxy server в pfSense, тогда благодаря кэшу страницы Ютуба и видео будет открываться быстрее. IPv6 не используется, ибо не предоставляется провайдером.

Проверял вручную запуск /opt/zapret/binaries/freebsd-x64/dvtws - делаю вывод, что не запускается.

# /opt/zapret/binaries/freebsd-x64/dvtws --daemon --port 989 --dpi-desync=split2
# ps -ax | grep dvtws
 3582  0  S+      0:00.00 grep dvtws
# /opt/zapret/binaries/freebsd-x64/dvtws --port 989 --dpi-desync=split2
creating divert4 socket
socket (DIVERT4): Address family not supported by protocol family

* install_bin.sh не сработал. Не распихал бинарники.

Что делал:

1. Редактировал /etc/inc/filter.inc

было:

`       update_filter_reload_status(gettext("Setting up TFTP helper"));
        $natrules .= "# TFTP proxy\n";
        $natrules .= "rdr-anchor \"tftp-proxy/*\"\n";

стало:

        update_filter_reload_status(gettext("Setting up TFTP helper"));
    $natrules .= "# ZAPRET redirection\n";
    $natrules .= "rdr-anchor \"zapret\"\n";

        $natrules .= "# TFTP proxy\n";
        $natrules .= "rdr-anchor \"tftp-proxy/*\"\n";

Вроде как правильно и по инструкции. Но есть сомнения.

2. /etc/zapret.anchor прописал так:

rdr pass on bridge0 inet proto tcp to port {80,443} -> 127.0.0.1 port 988
rdr pass on igb3 inet proto tcp to port {80,443} -> 127.0.0.1 port 988
rdr pass on igb4 inet proto tcp to port {80,443} -> 127.0.0.1 port 988

У меня три LAN сети: bridge0 - на нём же выставлен локальный IP адрес и используется два порта. igb3 - на этом интерфейсе ещё один локальный IP igb4 - на этом интерфейсе ещё один локальный IP

3. /usr/local/etc/rc.d/zapret.sh (chmod 755) прописал так:

#!/bin/sh

kldload ipfw
kldload ipdivert

ipfw delete 100
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit igb0
pkill ^dvtws$
/opt/zapret/binaries/freebsd-x64/dvtws --daemon --port 989 --dpi-desync=split2

# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state
pfctl -d ; pfctl -e

igb0 - WAN интерфейс.

В /usr/local/etc/rc.d/zapret.sh не вписывал запуск строки /usr/local/etc/rc.d/zapret.sh , потому, что планировал сначала проверить запуск демона, а потом запустить вручную. То, что касается IPv6 также не указывал.

Когда я всё это сделал, pfSense у мня загрузилась и не подняла ни одного интерфейса. Это я уже понял, когда к роутеру подключил монитор и клавиатуру.

Возможно в /etc/inc/filter.inc я что-то не так написал. (см. выше) Возможно в /etc/zapret.anchor нельзя указывать bridge0 Возможно правила /etc/inc/filter.inc обрабатываются раньше, чем подымаются интерфейсы в новой версии pfSense.

dvtws вроде должен запускаться, не только как демон. socket (DIVERT4): Address family not supported by protocol family Нужно что-то добавить в ядро и/или пересобрать? Пересобирать сам не пробовал ибо лишней FreeBSD под боком нет.

Очень хочется, чтобы Ютуб заработал и Squid поддерживался.

В идеале, конечно бы хотелось, чтобы не весь трафик 80,443 портов шёл на демона, а только домены ютуба. Но с доменами через pfSense вроде как не получится, а вот с IP адресами можно попробовать через "Сетевая Трансляция Адресов (NAT) / Проброс Порта или правил Сетевой Трансляции Адресов (NAT) в самом pfSense.

Готов тестировать, посильно помогать, выполнять задания - проверить, оценить работоспособность и т.д.

bol-van commented 4 weeks ago

address family ошибка означает, что модуль ядра ipdivert не загружен kldload ipdivert

во-вторых у вас какая-то мешанина tpws и dvtws tpws запускается через якорь pf ему диверт не нужен

dvtws пока только через ipfw. и не надо править якоря если вы там ошибетесь с закорючкой или отредактируете чем-то на винде, что заменит переводы строк на crlf, то сенс просто сломается я попытаюсь организовать divert-to средствами pf как руки дойдут

на скуид как кэш не надейтесь. он не может кэшировать https технология web cache устарела

TolianIPB commented 4 weeks ago

если вы там ошибетесь с закорючкой или отредактируете чем-то на винде

Только vi, только хардкор :)

address family ошибка означает, что модуль ядра ipdivert не загружен

Я просто выполнял инструкции для pfSense. Значит нужно выполнить ещё инструкции для FreeBSD.

Поместите следующие строки в /boot/loader.conf (создать, если отсутствует) :
-----------
ipdivert_load="YES"
net.inet.ip.fw.default_to_accept=1
-----------
В /etc/rc.conf :
-----------
firewall_enable="YES"
firewall_script="/etc/rc.firewall.my"
-----------
/etc/rc.firewall.my :
-----------
ipfw -q -f flush
-----------
В /etc/rc.firewall.my можно дописывать правила ipfw, чтобы они восстанавливались после перезагрузки.
Оттуда же можно запускать и демоны zapret, добавив в параметры "--daemon". Например так :
-----------
pkill ^dvtws$
/opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=split2

во-вторых у вас какая-то мешанина tpws и dvtws tpws запускается через якорь pf ему диверт не нужен

Я чётко следовал инструкции начиная с заголовка:

pfsense
-------

В инструкции всё, что обращалось к tpws было связано с IPv6, поэтому я его не запускал. Т.е. я следовал инструкции от заголовка "pfsense" до следующего заголовка "OpenBSD".

я попытаюсь организовать divert-to средствами pf как руки дойдут

Я немного (а похоже сильно) запутался. Но в любом случае спасибо Вам большое!

bol-van commented 4 weeks ago

я пишу инструкции больше понятийно-описательные, а не пошаговые в стиле нажать тут нажать здесь

надо хоть немного понимать как это работает, иначе вряд ли получится

TolianIPB commented 4 weeks ago

Спасибо за Ваш ответ. Постараюсь разобраться. Буду следить за обновлениями.

motogon commented 4 weeks ago

я пишу инструкции больше понятийно-описательные, а не пошаговые в стиле нажать тут нажать здесь

надо хоть немного понимать как это работает, иначе вряд ли получится

Добрый день .

Поднял виртуальную машину с pfSense . Далее сделал по инструкции https://habr.com/ru/articles/835228/

на компе в сетевых настройках указал ip этой виртуалки , в качестве gw - ютюб открылся нормально . Но аналогичное , замена gw на appletv - результата не дала. Те трафик идёт через pfSense

ps -ax | grep tpws 50261 - Ss 1:06.93 tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-linklocal=force --split-http-req=method --split-pos=2

запущен.

Прошу подсказать , как можно диагностировать проблему . Можно включить логи ? что бы понять идёт трафик от appletv , через tpws или нет ?

Спасибо

bol-van commented 4 weeks ago

запустите tpws с --debug в консоли и поймете

motogon commented 4 weeks ago

запустите tpws с --debug в консоли и поймете

спасибо

vegetate7 commented 4 weeks ago

Настройка редиректа в TPWS без правки filter.inc (чтобы не терять при обновлении). Screenshot_20240815_025337 LAN Subnets (и !LAN Subnets) - это чтобы на консоль pfsense ходить мимо прокси. Эти правила попадут почти туда-же, куда предложено в доке, не очень много кто настраивает tftp-proxy:

....
rdr-anchor "tftp-proxy/*" all
rdr pass on bridge0 inet proto tcp from <LAN__NETWORK> to ! <LAN__NETWORK> port = http -> 127.0.0.1 port 988
rdr pass on bridge0 inet6 proto tcp from any to any port = http -> fe80::5a9c:fcff:fe10:ffa4 port 988
rdr pass on bridge0 inet6 proto tcp from any to any port = https -> fe80::5a9c:fcff:fe10:ffa4 port 988
rdr pass on bridge0 inet proto tcp from <LAN__NETWORK> to ! <LAN__NETWORK> port = https -> 127.0.0.1 port 988
....

PS: OOps, вижу в discussions уже предложили то-же самое. Ну, знчит путь верен :)

romanticfm commented 3 weeks ago

часто тпвс не работает с автозагрузки висит, отвечает, ничего не делает после перезапуска все норм

bol-van commented 3 weeks ago

Вообщем что у нас с divert-to в pf. Сломан он, увы. Проблема известная, кто-то даже выкатил патч но в релизе freebsd-14 все такой же infinite loop Я отказался от raw сокетов на BSD полностью. Заменил их на divert. Уже в сорцах, пока еще не в бинариках. Но это не помогает. Оно циклит. Так что пока , увы, никак без ipfw