Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PFSense 2.7 + dvtws #440

Open
DeAlexPesh opened this issue Sep 30, 2024 · 33 comments
Open

PFSense 2.7 + dvtws #440

DeAlexPesh opened this issue Sep 30, 2024 · 33 comments

Comments

@DeAlexPesh
Copy link

DeAlexPesh commented Sep 30, 2024

У кого-то получилось завезти эту связку?
Возможно, глупый вопрос, но как можно завернуть трафик на 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 подключение им?

@bol-van
Copy link
Owner

bol-van commented Oct 1, 2024

wan интерфейс - тот, на котором сидит ип от провайдера
номера правил могут быть одни и те же
они нужны для последовательности их обработки
и если удалять по номеру - снесутся все

фильтр с ип не нужен
если идет трансмит на инет, то этого уже достаточно

@DeAlexPesh
Copy link
Author

а если нужен не 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

@bol-van
Copy link
Owner

bol-van commented Oct 1, 2024

а если нужен не any а ограниченное число ip или только подсеть?
при применении правил не закроются ли все остальные явно не прописанные соединения?

значит пишите from
если несколько адресов, может быть имеет смысл сделать table
и еще надо в --debug посмотреть приходят ли пакеты до или после nat
после nat уже нет локального адреса

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

@DeAlexPesh
Copy link
Author

получается вот эта запись верна?

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"

@bol-van
Copy link
Owner

bol-van commented Oct 1, 2024

Если кроме 192.168.0.0/16 кто-то еще ходит через этот шлюз, тогда from имеет смысл. Иначе - нет.
так же from $SUBNET некорректно для recv. там source будет инетовский адрес

@DeAlexPesh
Copy link
Author

DeAlexPesh commented Oct 3, 2024

в общем сделал так:

#!/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

@bol-van
Copy link
Owner

bol-van commented Oct 3, 2024

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

@DeAlexPesh
Copy link
Author

pfctl -d; pfctl -e

только в документации нашел хотел написать что трафик пошел...
теперь найти бы еще рабочий вариант дурения в сетях РТ... хотябы ютрубу

@zetcamp
Copy link

zetcamp commented Oct 5, 2024

теперь найти бы еще рабочий вариант дурения в сетях РТ... хотябы ютрубу

Попробуйте ключи (и bin файлы tls и quic) из конфига этого пакета.
https://github.com/Anonym-tsk/nfqws-keenetic/blob/master/etc/nfqws/nfqws.conf

@TurboBlaze
Copy link

TurboBlaze commented Oct 13, 2024

В итоге удалось-ли решить вопрос с ютрубом через dvtws?

@geokvant
Copy link

geokvant commented Oct 14, 2024

В итоге удалось ли решить вопрос с ютрубом через dvtws?

На билайне шпд dvtws на OPNsense работает отменно на всех устройствах в сети.

    --dpi-desync=fake,split \
    --dpi-desync-split-pos=2 \
    --dpi-desync-autottl=1:3-20 \
    --dpi-desync-fooling=md5sig,badsum \

@TurboBlaze
Copy link

Везёт Вам. Попробовал Ваши параметры, увы не работают. Провайдер JustLan. До этого хорошо работало с tpws, но лавочку прикрыли.

@Miles1727
Copy link

Можно поподробнее описание как установить чтоб решить проблемы с фаерволами ?

@Miles1727
Copy link

Взял старый роутер установил на него OpenWRT И на нем завёл гудбай. В Pfsense создал интерфейс и таблицу маршрутизации. Всё работает

@vegetate7
Copy link

По поводу порядка прохождения пакетов в файрволах 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 - ни одного попадания не увидел.

@bol-van
Copy link
Owner

bol-van commented Mar 16, 2025

Спасибо, интересная информация.
Дебаг лог можете выложить ?
Не факт, что на самом деле все идет через dvtws

@vegetate7
Copy link

Сделал спец конфиг, только с 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.

@bol-van
Copy link
Owner

bol-van commented Mar 16, 2025

В логе у вас только SYN и SYN,ACK.
Данных нет.

Это может быть связано с quick правилами PF. Quick один раз срабатывает, дальше кэш, и правила снова не анализируются

@bol-van
Copy link
Owner

bol-van commented Mar 16, 2025

Тут писали, что в ядре 14.2 пофиксили проблему с зацикливанием divert-to в PF.
Проверял на исходящих пакетах с самой системы. Не подтверждаю.
На проходящих не проверял. Возможно, починили только для проходящих

@bol-van
Copy link
Owner

bol-van commented Mar 16, 2025

Чтобы autottl работало, достаточно завернуть входящие tcp с флагами syn,ack. Все не нужно, тк это создаст огромную и бесполезную нагрузку

@vegetate7
Copy link

Это может быть связано с quick правилами PF. Quick один раз срабатывает, дальше кэш, и правила снова не анализируются

И как обойти? Пробовать ловить на внутреннем интерфейсе роутера? Но это снова возвращает к проблема несовместимости стратегий с НАТ. И еще, получается PF и IPFW пользуются одним кешем?

@vegetate7
Copy link

Чтобы autottl работало, достаточно завернуть входящие tcp с флагами syn,ack. Все не нужно, тк это создаст огромную и бесполезную нагрузку

там и так только syn,ack.

@vegetate7
Copy link

О. а ну-ка, ну-ка...

dvtws_clear3.log

Тут исходящие заворачиваются на внутреннем интерфейсе, а входящие на внешнем. IPFW on top.
Как минимум без дурения - заработало

@bol-van
Copy link
Owner

bol-van commented Mar 16, 2025

Тут исходящие заворачиваются на внутреннем интерфейсе, а входящие на внешнем.

Это плохо. Он не сможет сопоставить. autottl работать не будет.
лучше тогда вообще не заворачивать входящие

Я не исследовал глубоко sense. Совмещать 2 фаервола - не лучшая идея, но иначе никак.
Исследуйте. Нащупаете что-то рабочее - будет остальным полезно

@vegetate7
Copy link

Ну тогда входящие ловить на внутреннем интерфейсе уже. как out xmit bridge0. Попробовал, так тоже работает (без дурения пока)

@bol-van
Copy link
Owner

bol-van commented Mar 16, 2025

Ему вообще наплевать как будут получены пакеты из очереди. Входящие они или исходящие.
Приходит пакет, анализируется, вытаскиваются ip источника , ip назначения, порты.
Это и есть исходные данные. В логе отражается каждый приходящий пакет

@vegetate7
Copy link

Вот такой скрипт запуска получился в итоге:

#!/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 он хочет куда-то в мультикаст, но не может.

@bol-van
Copy link
Owner

bol-van commented Mar 17, 2025

Из-за TLS 1.2 может быть

@DeAlexPesh
Copy link
Author

NETIF="pppoe0"
INTNETIF="bridge0"

можно краткое пояснение по этим параметрам?
что-за бридж?

@vegetate7
Copy link

NETIF="pppoe0"
INTNETIF="bridge0"

можно краткое пояснение по этим параметрам? что-за бридж?

NETIF - внешний интерфейс. В моем случе PPPOE соединение к провайдеру.
INTNETIF - внутренний интерфейс. У меня мини-компьютер с 5 портами, 4 из них соединены бриджом, и смотрят во внутреннюю сеть. В 5-й воткнут провайдерский провод.

@DeAlexPesh
Copy link
Author

DeAlexPesh commented Mar 31, 2025

NETIF - внешний интерфейс. В моем случе PPPOE соединение к провайдеру.
INTNETIF - внутренний интерфейс. У меня мини-компьютер с 5 портами, 4 из них соединены бриджом, и смотрят во внутреннюю сеть. В 5-й воткнут провайдерский провод.

вот с этими правилами юпуб и прочие работают, но отваливаются внутренние ресурсы, exlude не работает...
если поменять INTIF на NETIF ресурсы работаю, фильтрация нет

NETIF="pppoe1" 
INTIF="igb0"

setup_firewall() {
# pfctl -si | grep -q "Status: Enabled" && pfctl -d && pfctl -e

# Reorganize firewalls sequence
# IPFW on top:
  PF_APPEND="-a"
# PF on top:
# PF_APPEND=""

  for v in "" "6"; do
    pfilctl unlink -i ipfw:default$v inet$v
    pfilctl unlink -o ipfw:default$v inet$v
    pfilctl unlink -i pf:default-in$v inet$v
    pfilctl unlink -o pf:default-out$v inet$v
    pfilctl link -i ipfw:default$v inet$v
    pfilctl link -o ipfw:default$v inet$v
    pfilctl link -i $PF_APPEND pf:default-in$v inet$v
    pfilctl link -o $PF_APPEND pf:default-out$v inet$v
  done

  # CLEAN
  ipfw delete 100 2>/dev/null
  # LOCALNET
  ipfw add 100 pass tcp from "$SUBNET" to "$SUBNET" via "$INTIF"
  # HTTP, HTTPS
  ipfw add 100 divert 989 tcp from any to any 80,443 in not diverted recv "$INTIF"
  # QUIC
  ipfw add 100 divert 989 udp from any to any 443 in not diverted recv "$INTIF"
  # DICSORD
  ipfw add 100 divert 989 udp from any to any 50000-50099 in not diverted recv "$INTIF"
  # INCOMING FOR AUTOTTL
  ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack out not diverted xmit "$INTIF"
}

@vegetate7
Copy link

vegetate7 commented Mar 31, 2025

А внутренние, это какие? Может в $SUBNET не попадают?
Кстати по правильному там-бы еще так-же пропустить UDP 443, но сомневаюсь ,что часто бывает локальный квик сервер.

Ну и по exclude - это надо логи смотреть. Не мне, я в них не очень разбираюсь :))

@DeAlexPesh
Copy link
Author

DeAlexPesh commented Mar 31, 2025

А внутренние, это какие?

если кому надо

WEBSERVER="ip шлюза"

# CLEAN
ipfw delete 100 2>/dev/null
# LOCALNET
ipfw add 100 pass tcp from "${SUBNET}" to "${SUBNET}" via "${INTIF}"
# HTTP, HTTPS
ipfw add 100 pass tcp from any to "${WEBSERVER}" 80,443 in via "${INTIF}"
ipfw add 100 divert 989 tcp from any to any 80,443 in not diverted recv "${INTIF}"
# QUIC
ipfw add 100 pass udp from any to "${WEBSERVER}" 443 in via "${INTIF}"
ipfw add 100 divert 989 udp from any to any 443 in not diverted recv "${INTIF}"
# DICSORD
ipfw add 100 divert 989 udp from any to any 50000-50099 in not diverted recv "${INTIF}"
# INCOMING FOR AUTOTTL
ipfw add 100 pass tcp from "${WEBSERVER}" 80,443 to any tcpflags syn,ack out via "${INTIF}"
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack out not diverted xmit "${INTIF}"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants