bol-van / zapret

DPI bypass multi platform
8.45k stars 637 forks source link

PFSense 2.7 + dvtws #440

Open DeAlexPesh opened 1 month ago

DeAlexPesh commented 1 month ago

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

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

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

DeAlexPesh commented 1 month ago

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

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

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

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

DeAlexPesh commented 1 month ago

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

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 commented 1 month ago

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

DeAlexPesh commented 1 month ago

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

#!/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 commented 1 month ago

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 commented 1 month ago

pfctl -d; pfctl -e

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

zetcamp commented 1 month ago

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

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

TurboBlaze commented 1 month ago

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

geokvant commented 1 month ago

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

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

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

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

Miles1727 commented 1 month ago

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