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 · 13 comments
Open

PFSense 2.7 + dvtws #440

DeAlexPesh opened this issue Sep 30, 2024 · 13 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

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

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

6 participants