PFSense 2.7 + dvtws
У кого-то получилось завезти эту связку? Возможно, глупый вопрос, но как можно завернуть трафик на divert порт? стандартными средствами pfctl это реально ну или скриптом при запуске dvtws? или, возможно, используя tpws как прокси без "дурения"? запускаю так:
#!/bin/sh
SERVICE_NAME="dvtws"
SERVICE_CMD="/usr/local/sbin/dvtws"
is_service_running() {
pgrep -f "${SERVICE_CMD}" > /dev/null && return 0 || return 1
}
require_module() {
if ! kldstat | grep "${1}" > /dev/null; then
if ! kldload "${1}"; then
exit 1
fi
fi
echo "Модуль ${1} загружен."
return 1
}
mng_service() {
if [ "${1}" = "start" ]; then
# require_module ipfw
require_module ipdivert
${SERVICE_CMD} \
--debug=1 \
--daemon \
--port=989 \
--параметры \
--hostlist=/opt/zapret.auto \
--hostlist-exclude=/opt/zapret.exclude \
| logger -t "${SERVICE_NAME}" >/dev/null 2>&1 &
elif [ "${1}" = "stop" ]; then
pkill -f "${SERVICE_CMD}"
fi
}
show_service_status() {
if is_service_running; then
echo "Сервис ${SERVICE_NAME} запущен."
else
echo "Сервис ${SERVICE_NAME} не работает."
fi
}
case "${1}" in
start)
mng_service start
;;
stop)
mng_service stop
;;
status)
show_service_status
;;
restart)
mng_service stop
sleep 2
mng_service start
;;
*)
echo "Usage: ${SERVICE_NAME} {start|stop|status|restart}"
exit 1
;;
esac
не совсем понимаю как работает ipfw нашел правила и немного изменил под себя (ориентируясь по ощущениям)
ipfw delete 100
ipfw add 100 divert 989 tcp from $SUBNET to not $SUBNET 80,443 out not diverted xmit igb1
ipfw add 100 divert 989 tcp from not $SUBNET 80,443 to $SUBNET tcpflags syn,ack in not diverted recv igb1
ipfw add 100 divert 989 udp from $SUBNET to not $SUBNET 443 out not diverted xmit igb1
но почему все правила под номером 100
и можно ли сделать так чтобы учитывался только трафик из внутренней сети $SUBNET во внешнюю сеть ! $SUBNET ?
и не заблокирует ли мне оно все остальное после применения этих правил?
igb1 - должен быть физический WAN интерфейс или если это ppoe1 подключение им?
wan интерфейс - тот, на котором сидит ип от провайдера номера правил могут быть одни и те же они нужны для последовательности их обработки и если удалять по номеру - снесутся все
фильтр с ип не нужен если идет трансмит на инет, то этого уже достаточно
а если нужен не any а ограниченное число ip или только подсеть?
при применении правил не закроются ли все остальные явно не прописанные соединения?
теоретически вот так должно работать?
#!/bin/sh
SERVICE_NAME="dvtws"
SERVICE_CMD="/usr/local/sbin/dvtws"
NETIF="pppoe1"
is_service_running() {
pgrep -f "${SERVICE_CMD}" > /dev/null && return 0 || return 1
}
require_module() {
if ! kldstat | grep "${1}" > /dev/null; then
if ! kldload "${1}"; then
exit 1
fi
fi
echo "Модуль ${1} загружен."
return 1
}
mng_service() {
if [ "${1}" = "start" ]; then
require_module ipdivert
require_module ipfw
ipfw delete 100
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit "$NETIF"
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv "$NETIF"
ipfw add 100 divert 989 udp from any to any 443 out not diverted xmit "$NETIF"
${SERVICE_CMD} \
--debug=1 \
--daemon \
--port=989 \
--параметры \
--hostlist=/opt/zapret.auto \
--hostlist-exclude=/opt/zapret.exclude \
| logger -t "${SERVICE_NAME}" >/dev/null 2>&1 &
elif [ "${1}" = "stop" ]; then
ipfw delete 100
pkill -f "${SERVICE_CMD}"
fi
}
show_service_status() {
if is_service_running; then
echo "Сервис ${SERVICE_NAME} запущен."
else
echo "Сервис ${SERVICE_NAME} не работает."
fi
}
case "${1}" in
start)
mng_service start
;;
stop)
mng_service stop
;;
status)
show_service_status
;;
restart)
mng_service stop
sleep 2
mng_service start
;;
*)
echo "Usage: ${SERVICE_NAME} {start|stop|status|restart}"
exit 1
;;
esac
а если нужен не
anyа ограниченное число ip или только подсеть? при применении правил не закроются ли все остальные явно не прописанные соединения?
значит пишите from если несколько адресов, может быть имеет смысл сделать table и еще надо в --debug посмотреть приходят ли пакеты до или после nat после nat уже нет локального адреса
дивертится лишь то, что попадает под правило если не будет dvtws, то все по этому правилу будет дропнуто перестанет работать только веб, тк прописаны порты
получается вот эта запись верна?
SUBNET="192.168.0.0/16"
NETIF="pppoe1"
...
ipfw delete 100
ipfw add 100 divert 989 tcp from "$SUBNET" to any 80,443 out not diverted xmit "$NETIF"
ipfw add 100 divert 989 tcp from "$SUBNET" 80,443 to any tcpflags syn,ack in not diverted recv "$NETIF"
ipfw add 100 divert 989 udp from "$SUBNET" to any 443 out not diverted xmit "$NETIF"
Если кроме 192.168.0.0/16 кто-то еще ходит через этот шлюз, тогда from имеет смысл. Иначе - нет. так же from $SUBNET некорректно для recv. там source будет инетовский адрес
в общем сделал так:
#!/bin/sh
SERVICE_NAME="dvtws"
SERVICE_CMD="/usr/local/sbin/dvtws"
# SUBNET="192.168.0.0/16"
SUBNET="192.168.1.мой_ип"
NETIF="pppoe1"
is_service_running() {
pgrep -f "${SERVICE_CMD}" > /dev/null && return 0 || return 1
}
require_module() {
if ! kldstat | grep "${1}" > /dev/null; then
if ! kldload "${1}"; then
exit 1
fi
fi
echo "Модуль ${1} загружен."
return 1
}
mng_service() {
if [ "${1}" = "start" ]; then
require_module ipdivert
require_module ipfw
ipfw delete 100
ipfw add 100 divert 989 tcp from "$SUBNET" to any 80,443 out not diverted xmit "$NETIF"
ipfw add 100 divert 989 tcp from any 80,443 to "$SUBNET" tcpflags syn,ack in not diverted recv "$NETIF"
ipfw add 100 divert 989 udp from "$SUBNET" to any 443 out not diverted xmit "$NETIF"
${SERVICE_CMD} \
--debug=1 \
--port=989 \
--мои_параметры \
--hostlist=/opt/zapret.auto \
--hostlist-exclude=/opt/zapret.exclude \
| logger -t "${SERVICE_NAME}" >/dev/null 2>&1 &
elif [ "${1}" = "stop" ]; then
ipfw delete 100
pkill -f "${SERVICE_CMD}"
fi
}
show_service_status() {
if is_service_running; then
echo "Сервис ${SERVICE_NAME} запущен."
else
echo "Сервис ${SERVICE_NAME} не работает."
fi
}
case "${1}" in
start)
mng_service start
;;
stop)
mng_service stop
;;
status)
show_service_status
;;
restart)
mng_service stop
sleep 2
mng_service start
;;
*)
echo "Usage: ${SERVICE_NAME} {start|stop|status|restart}"
exit 1
;;
esac
в логах вижу и больше ничего не меняется:
read 1200 bytes from /opt/quic_initial_www_google_com.bin
adding low-priority default empty desync profile
we have 1 user defined desync profile(s) and default low priority profile 0
Loading hostlist /opt/zapret.auto
loading plain text list
Loaded 28 hosts from /opt/zapret.auto
Loading hostlist /opt/zapret.exclude
loading plain text list
Loaded 6 hosts from /opt/zapret.exclude
initializing conntrack with timeouts tcp=60:300:60 udp=60
creating divert4 socket
binding divert4 socket
set_socket_buffers fd=3 rcvbuf=131072 sndbuf=65536
fd=3 SO_RCVBUF=131072
fd=3 SO_SNDBUF=65536
initializing raw sockets
set_socket_buffers fd=4 rcvbuf=4096 sndbuf=65536
fd=4 SO_RCVBUF=4096
fd=4 SO_SNDBUF=65536
set_socket_buffers fd=5 rcvbuf=4096 sndbuf=65536
fd=5 SO_RCVBUF=4096
fd=5 SO_SNDBUF=65536
Running as UID=2147483647 GID=2147483647
где можно отладить?
с any вместо $SUBNET трафик вроде пошел, но локальных ip там не вижу
судя по ipfw show проходит только recv трафик
00100 0 0 divert 989 tcp from any to any 80,443 out not diverted xmit pppoe1
00100 5332 292880 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv pppoe1
00100 0 0 divert 989 udp from any to any 443 out not diverted xmit pppoe1
65535 45775182 47653985658 allow ip from any to any
ipfw add 100 divert 989 tcp from any 80,443 to "$SUBNET" tcpflags syn,ack in not diverted recv "$NETIF"
это тоже под сомнением. если правило выполняется до nat, то будет to адрес самой системы с pfsense если так хочется фильтровать по ip клиента, xmit надо делать до nat, а recv после nat но в Pfsense nat делает pf. на каком этапе будет вызван ipfw - не факт еще, надо проверять и смотреть
чтобы Ipfw заработал под pfsense, нужно пнуть pf сначала pfctl -d; pfctl -e см docs/bsd.txt
pfctl -d; pfctl -e
только в документации нашел хотел написать что трафик пошел... теперь найти бы еще рабочий вариант дурения в сетях РТ... хотябы ютрубу
теперь найти бы еще рабочий вариант дурения в сетях РТ... хотябы ютрубу
Попробуйте ключи (и bin файлы tls и quic) из конфига этого пакета. https://github.com/Anonym-tsk/nfqws-keenetic/blob/master/etc/nfqws/nfqws.conf
В итоге удалось-ли решить вопрос с ютрубом через dvtws?
В итоге удалось ли решить вопрос с ютрубом через dvtws?
На билайне шпд dvtws на OPNsense работает отменно на всех устройствах в сети.
--dpi-desync=fake,split \
--dpi-desync-split-pos=2 \
--dpi-desync-autottl=1:3-20 \
--dpi-desync-fooling=md5sig,badsum \
Везёт Вам. Попробовал Ваши параметры, увы не работают. Провайдер JustLan. До этого хорошо работало с tpws, но лавочку прикрыли.
Можно поподробнее описание как установить чтоб решить проблемы с фаерволами ?
Взял старый роутер установил на него OpenWRT И на нем завёл гудбай. В Pfsense создал интерфейс и таблицу маршрутизации. Всё работает
По поводу порядка прохождения пакетов в файрволах PFsense - это можно менять утилитой pfilctl, например так:
### reorganize firewalls sequence
# IPFW on top:
PF_APPEND="-a"
## PF on top:
#PF_APPEND=""
#inet4
pfilctl unlink -i ipfw:default inet
pfilctl unlink -o ipfw:default inet
pfilctl unlink -i pf:default-in inet
pfilctl unlink -o pf:default-out inet
pfilctl link -i ipfw:default inet
pfilctl link -o ipfw:default inet
pfilctl link -i $PF_APPEND pf:default-in inet
pfilctl link -o $PF_APPEND pf:default-out inet
#inet6
pfilctl unlink -i ipfw:default6 inet6
pfilctl unlink -o ipfw:default6 inet6
pfilctl unlink -i pf:default-in6 inet6
pfilctl unlink -o pf:default-out6 inet6
pfilctl link -i ipfw:default6 inet6
pfilctl link -o ipfw:default6 inet6
pfilctl link -i $PF_APPEND pf:default-in6 inet6
pfilctl link -o $PF_APPEND pf:default-out6 inet6
В этом случае, IPFW будет получать исходящие пакеты после NAT (и входящие до NAT). И наоборот, если убрать ключик "-a".
Но вот какая беда, похоже dvtws не может прочитать имя запрашиваемого хоста. Во всяком случае, сколько я не смотрел в --gebug=1 |grep youtube - ни одного попадания не увидел.
Спасибо, интересная информация. Дебаг лог можете выложить ? Не факт, что на самом деле все идет через dvtws
Сделал спец конфиг, только с 7071 портом на внешнем сервере. Чтобы не мешать домашним :) Адреса затер, прошу отнестись с пониманием. dvtws_clear.log Немного исследовал что происходит. Короче, если IPFW on top (чтобы он был после NAT), то по какой-то причине он не получает пакетов прошедших через исходящий NAT. Проверял навешиванием счетчиков в правила. ни внешний адрес, ни xmit pppoe0 ничего не считают. Входящие приходят, как recv pppoe0 и с внешним адресом роутера. Лог - с вариантом PF on top (ipfw находится за NAT). Соответственно у наших пакетов - внутренние адреса. Стратегии, не работающие через NAT скорее всего обломаются. Как это все победить - я не знаю :)
Дальше. Hostname - так и не распознался. Тут я немного не уверен, что знаю как работает SNI. Но на этом адресе SNI нет, может ли клиент знать об этом и не посылать ClientHelo? В любом случае - нет хостнейма - не работают хостлисты :(
И последнее. несмотря на то, что все пакеты reinject unmodified - что-то ломается, браузер висит в ожидании. Если убрать заворачивание входящих пакетов - начинает работать. Значит обламываются стратегии с autottl.
В логе у вас только SYN и SYN,ACK. Данных нет.
Это может быть связано с quick правилами PF. Quick один раз срабатывает, дальше кэш, и правила снова не анализируются
Тут писали, что в ядре 14.2 пофиксили проблему с зацикливанием divert-to в PF. Проверял на исходящих пакетах с самой системы. Не подтверждаю. На проходящих не проверял. Возможно, починили только для проходящих
Чтобы autottl работало, достаточно завернуть входящие tcp с флагами syn,ack. Все не нужно, тк это создаст огромную и бесполезную нагрузку
Это может быть связано с quick правилами PF. Quick один раз срабатывает, дальше кэш, и правила снова не анализируются
И как обойти? Пробовать ловить на внутреннем интерфейсе роутера? Но это снова возвращает к проблема несовместимости стратегий с НАТ. И еще, получается PF и IPFW пользуются одним кешем?
Чтобы autottl работало, достаточно завернуть входящие tcp с флагами syn,ack. Все не нужно, тк это создаст огромную и бесполезную нагрузку
там и так только syn,ack.
О. а ну-ка, ну-ка...
Тут исходящие заворачиваются на внутреннем интерфейсе, а входящие на внешнем. IPFW on top. Как минимум без дурения - заработало
Тут исходящие заворачиваются на внутреннем интерфейсе, а входящие на внешнем.
Это плохо. Он не сможет сопоставить. autottl работать не будет. лучше тогда вообще не заворачивать входящие
Я не исследовал глубоко sense. Совмещать 2 фаервола - не лучшая идея, но иначе никак. Исследуйте. Нащупаете что-то рабочее - будет остальным полезно
Ну тогда входящие ловить на внутреннем интерфейсе уже. как out xmit bridge0. Попробовал, так тоже работает (без дурения пока)
Ему вообще наплевать как будут получены пакеты из очереди. Входящие они или исходящие. Приходит пакет, анализируется, вытаскиваются ip источника , ip назначения, порты. Это и есть исходные данные. В логе отражается каждый приходящий пакет
Вот такой скрипт запуска получился в итоге:
#!/bin/sh
SERVICE_NAME="dvtws"
SERVICE_CMD="/usr/local/sbin/dvtws"
SUBNET="192.168.0.0/16"
#SUBNET="any"
NETIF="pppoe0"
INTNETIF="bridge0"
# All arguments here: https://github.com/bol-van/zapret (search for `nfqws` on the page)
# HTTP(S) strategy
#NFQWS_ARGS="--dpi-desync=fake,multisplit --dpi-desync-split-pos=1,midsld --dpi-desync-ttl=1 --dpi-desync-repeats=16 --dpi-desync-fooling=badseq,md5sig --dpi-desync-fake-tls=/usr/local/etc/zapret/tls_clienthello.bin"
NFQWS_ARGS="--dpi-desync=fakedsplit --dpi-desync-ttl=1 --dpi-desync-autottl=3 --dpi-desync-split-pos=midsld"
#NFQWS_ARGS="--dpi-desync=fakedsplit --dpi-desync-ttl=1 --dpi-desync-split-pos=midsld"
# QUIC strategy
NFQWS_ARGS_QUIC="--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=11 --dpi-desync-fake-quic=/usr/local/etc/zapret/quic_initial.bin"
NFQWS_QUIC_LISTS="--hostlist=/usr/local/etc/zapret/anti-dpi.hosts.only"
# UDP strategy (doesn't use lists from NFQWS_EXTRA_ARGS)
NFQWS_ARGS_UDP="--filter-udp=50000-50099 --dpi-desync=fake --dpi-desync-any-protocol --dpi-desync-repeats=6 --dpi-desync-cutoff=n2"
# auto - automatically detects blocked resources and adds them to the auto.list
NFQWS_COMMON_LISTS="--hostlist=/usr/local/etc/zapret/anti-dpi.hosts.only --hostlist-auto=/var/run/anti-dpi.hosts.auto --hostlist-auto-debug=/var/run/nfqws-autohosts.log --hostlist-exclude=/usr/local/etc/zapret/anti-dpi.hosts.exclude"
#NFQWS_COMMON_LISTS="--hostlist=/usr/local/etc/zapret/anti-dpi.hosts.only"
NFQWS_EXTRA_ARGS=""
# /var/run/anti-dpi.hosts.auto
# /usr/local/etc/zapret/anti-dpi.hosts.force
# /usr/local/etc/zapret/anti-dpi.hosts.exclude
# list - applies rules only to domains in the user.list
#NFQWS_EXTRA_ARGS="--hostlist=/opt/etc/nfqws/user.list"
# all - applies rules to all traffic except domains from exclude.list
#NFQWS_EXTRA_ARGS="--hostlist-exclude=/opt/etc/nfqws/exclude.list"
is_service_running() {
pgrep -f "${SERVICE_CMD}" > /dev/null && return 0 || return 1
}
require_module() {
if ! kldstat | grep "${1}" > /dev/null; then
if ! kldload "${1}"; then
exit 1
fi
fi
echo "module ${1} loaded."
return 1
}
mng_service() {
if [ "${1}" = "start" ]; then
require_module ipdivert
require_module ipfw
#pfctl -d
#pfctl -e
### reorganize firewalls sequence
# IPFW on top:
PF_APPEND="-a"
# PF on top:
#PF_APPEND=""
#inet4
pfilctl unlink -i ipfw:default inet
pfilctl unlink -o ipfw:default inet
pfilctl unlink -i pf:default-in inet
pfilctl unlink -o pf:default-out inet
pfilctl link -i ipfw:default inet
pfilctl link -o ipfw:default inet
pfilctl link -i $PF_APPEND pf:default-in inet
pfilctl link -o $PF_APPEND pf:default-out inet
#inet6
pfilctl unlink -i ipfw:default6 inet6
pfilctl unlink -o ipfw:default6 inet6
pfilctl unlink -i pf:default-in6 inet6
pfilctl unlink -o pf:default-out6 inet6
pfilctl link -i ipfw:default6 inet6
pfilctl link -o ipfw:default6 inet6
pfilctl link -i $PF_APPEND pf:default-in6 inet6
pfilctl link -o $PF_APPEND pf:default-out6 inet6
ipfw delete 100
#localnet
ipfw add 100 pass tcp from "$SUBNET" to "$SUBNET" via "$INTNETIF"
#http,https
ipfw add 100 divert 989 tcp from any to any 80,443 in not diverted recv "$INTNETIF"
#quic
ipfw add 100 divert 989 udp from any to any 443 in not diverted recv "$INTNETIF"
#dicsord
ipfw add 100 divert 989 udp from any to any 50000-50099 in not diverted recv "$INTNETIF"
#incoming for AUTOTTL
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack out not diverted xmit "$INTNETIF"
${SERVICE_CMD} \
${SERVICE_DAEMON} \
${SERVICE_DEBUG} \
--port=989 \
$NFQWS_ARGS_UDP --new \
$NFQWS_ARGS_QUIC $NFQWS_QUIC_LISTS --new \
$NFQWS_ARGS $NFQWS_COMMON_LISTS \
$NFQWS_EXTRA_ARGS
elif [ "${1}" = "stop" ]; then
ipfw delete 100
pkill -f "${SERVICE_CMD}"
fi
}
show_service_status() {
if is_service_running; then
echo "Service ${SERVICE_NAME} running."
else
echo "Service ${SERVICE_NAME} not running."
fi
}
SERVICE_DAEMON="--daemon"
SERVICE_DEBUG=""
case "${1}" in
start)
mng_service start
;;
start_debug)
SERVICE_DAEMON=""
SERVICE_DEBUG="--debug=1"
mng_service start
;;
stop)
mng_service stop
;;
status)
show_service_status
;;
restart)
mng_service stop
sleep 2
mng_service start
;;
*)
echo "Usage: ${SERVICE_NAME} {start|stop|status|restart}"
exit 1
;;
esac
Заработал ютуб ( а так-же rutracker, facebook, etc...) на десктопах в домашней сети. Ютуб на мобильниках в домашней сети (quic ?). А вот ютуб на LG WebOs не заработал. Судя по tcpdump он хочет куда-то в мультикаст, но не может.
Из-за TLS 1.2 может быть
NETIF="pppoe0" INTNETIF="bridge0"
можно краткое пояснение по этим параметрам? что-за бридж?
NETIF="pppoe0" INTNETIF="bridge0"
можно краткое пояснение по этим параметрам? что-за бридж?
NETIF - внешний интерфейс. В моем случе PPPOE соединение к провайдеру. INTNETIF - внутренний интерфейс. У меня мини-компьютер с 5 портами, 4 из них соединены бриджом, и смотрят во внутреннюю сеть. В 5-й воткнут провайдерский провод.