PFSense(Opnsense) zapret (dvtws и twps)

Network OPNSense

Обсуждение тут

DVTWS

Качаем zapret из github, распаковываем, делаем исполняемым, копируем. Вместо звёздочек указать необходимую сборку

mkdir /opt/zapret && cd /opt/zapret && wget https://github.com/bol-van/zapret/releases/download/v**/zapret-v**.zip && unzip *.zip && chmod +x zapret-v$1/binaries/freebsd-x64/dvtws && cp zapret-v**/binaries/freebsd-x64/dvtws /usr/local/sbin/dvtws

Создаем директорию для списков

mkdir /usr/local/etc/dvtws

Разрешаем запуск демона

edit /etc/rc.conf.d/dvtws

пишем

dvtws_enable="YES"

далее

edit /usr/local/etc/rc.d/dvtws && chmod +x /usr/local/etc/rc.d/dvtws

пишем (параметры нужно подбирать самостоятельно через blockcheck или ручками). Всё о подборе параметров, их описание и для чего нужны файлы hostlist читаем тут.

#!/bin/sh
. /etc/rc.subr
SERVICE_NAME="dvtws"
SERVICE_CMD="/usr/local/sbin/dvtws"
pidfile="/var/run/dvtws.pid"
configpath="/usr/local/etc/dvtws"
load_rc_config $SERVICE_NAME

: ${dvtws_enable:=yes}

is_service_running() {
  pgrep -f "${SERVICE_CMD}" > ${pidfile} && return 0 || return 1
}
require_module() {
  if ! kldstat | grep "" > /dev/null; then
   if ! kldload ""; then
    exit 1
   fi
  fi
  echo "$Module  loaded"
  return 1
}

mng_service() {
  if [ "" = "start" ]; then
    require_module ipfw
    require_module ipdivert

    ipfw delete 100
#у меня тут pppoe, вам нужно подставить свой интерфейс
    ipfw add 100 divert 989 tcp from any to any 443 out not diverted xmit pppoe0
    ipfw add 100 divert 989 udp from any to table\(discord\) 50000-50030 out not diverted xmit pppoe0
    pfctl -d ; pfctl -e

#тут необходимо создать список с адресами/сетями серверов голосовой связи по пути "/usr/local/etc/dvtws/dvtws_discord"
    cat /usr/local/etc/dvtws/dvtws_discord | while read line;do
    ipfw table discord add $line 1
    done > /dev/null 2>&1

#   --debug=@/var/log/dvtws/debug.log
#тут пишем свои условия для dvtws, udp=50000-50030 для голосовой связи дискорда, tcp=80 просто на всякий случай, udp=443 для ютуба, tcp=443 для сайтов по спискам. Параметры указывать не буду, ибо они индивидуальны
    ${SERVICE_CMD} \
    --debug=0 \
    --port=989 \
    --pidfile=/var/run/dvtws.pid \
    --filter-udp=50000-50030  \
    --new \
    --filter-tcp=80  \
    --hostlist-auto=${configpath}/dvtws_auto \
    --hostlist-auto-fail-threshold=3 \
    --hostlist-auto-fail-time=60 \
    --hostlist-auto-retrans-threshold=3 \
    --hostlist-auto-debug=${configpath}/dvtws_debug \
    --hostlist=${configpath}/dvtws_host \
    --hostlist=${configpath}/dvtws_auto \
    --new \
    --filter-udp=443  \
    --new \
    --filter-tcp=443  \
    --hostlist-auto=${configpath}/dvtws_auto \
    --hostlist-auto-fail-threshold=3 \
    --hostlist-auto-fail-time=60 \
    --hostlist-auto-retrans-threshold=3 \
    --hostlist-auto-debug=${configpath}/dvtws_debug \
    --hostlist=${configpath}/dvtws_host \
    --hostlist=${configpath}/dvtws_auto \
    | logger -t "${SERVICE_NAME}" >/dev/null 2>&1

  elif [ "" = "stop" ]; then
    ipfw delete 100
    ipfw table discord flush
    pkill -f ${SERVICE_NAME}
    pfctl -d; pfctl -e
  fi
}
show_service_status() {
  if is_service_running; then
    echo "Сервис ${SERVICE_NAME} запущен."
  else
    echo "Сервис ${SERVICE_NAME} не работает."
  fi
}
case "" 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

чтобы управлять сервисом из web интерфейса делаем

edit /usr/local/opnsense/service/conf/actions.d/actions_dvtws.conf

пишем

[start]
command:/usr/local/etc/rc.d/dvtws start
parameters:
type:script
message:starting dvtws
[stop]
command:/usr/local/etc/rc.d/dvtws stop
parameters:
type:script
message:stopping dvtws
[restart]
command:/usr/local/etc/rc.d/dvtws restart
parameters:
type:script
message:restarting dvtws
[status]
command:/usr/local/etc/rc.d/dvtws status; exit 0
parameters:
type:script_output
message:request dvtws status

перезапускаем configd

service configd restart

создаём сервис

edit /usr/local/etc/inc/plugins.inc.d/dvtws.inc

пишем плагин для web’a

<?php

/*
 * Copyright (C) 2017 EURO-LOG AG
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/**
 * register service
 * @return array
 */
function dvtws_services()
{
    global $config;

    $services = array();
    $services[] = array(
        'description' => gettext('Anti-DPI server'),
        'configd' => array(
            'restart' => array('dvtws restart'),
            'start' => array('dvtws start'),
            'stop' => array('dvtws stop'),
        ),
        'name' => 'dvtws',
        'pidfile' => '/var/run/dvtws.pid'
    );
    return $services;
}

function dvtws_syslog()
{
    $logfacilities = array();
    $logfacilities['dvtws'] = array(
        'facility' => array('dvtws'),
    );
    return $logfacilities;

ну и напоследок сделаем запуск при старте

edit /usr/local/etc/rc.syshook.d/start/99-dvtws

пишем

#!/bin/sh
#Start dvtws service
/usr/local/etc/rc.d/dvtws start

проверяем что плагин регистрируется

pluginctl -s

в появившемся списке должен присутствовать dvtws. А в system-diagnoctics-services web интерфейса строка

Готово, dvtws установлен, настроен и настроено управление через web. Осталось наполнить hostlist для своих хотелок и перезагрузиться

edit /usr/local/etc/dvtws/dvtws_host

или же оставить всё на усмотрение самого dvtws, который будет наполнять

/usr/local/etc/dvtws/dvtws_auto

за наполение этого файла отвечают параметры

    --hostlist-auto-fail-threshold=3 \
    --hostlist-auto-fail-time=60 \
    --hostlist-auto-retrans-threshold=3 \

а файл

/usr/local/etc/dvtws/dvtws_debug 

будет объяснять почему в файле появляется та или иная запись

TPWS(возможно не работает)

скопировано отсюда, но изменено для себя

  • Установка bin`арника
mkdir /opt/zapret && cd /opt/zapret && wget https://github.com/bol-van/zapret/releases/download/v**/zapret-v**.zip && unzip *.zip && chmod +x zapret-v$1/binaries/freebsd-x64/tpws && cp zapret-v**/binaries/freebsd-x64/tpws /usr/local/sbin/tpws 

Скрипт для запуска

nano /usr/local/etc/rc.d/tpws && chmod +x /usr/local/etc/rc.d/tpws
#!/bin/sh
SERVICE_NAME="tpws"
SERVICE_CMD="/usr/local/sbin/tpws"
pidfile="/var/run/${SERVICE_NAME}.pid"
is_service_running() {
pgrep -f "${SERVICE_CMD}" > ${pidfile} && return 0 || return 1
}
#для меня параметры неактуальны, поэтому придётся подбирать всё полностью под себя
mng_service() {
if [ "" = "start" ]; then
${SERVICE_CMD} \
--debug=0 \
--port=988 \
--bind-addr=127.0.0.1 \
--enable-pf \
--bind-linklocal=force \
--split-http-req=method \
--split-pos=2 \
--maxconn=9216 \
| logger -t "${SERVICE_NAME}" >/dev/null 2>&1 &
elif [ "" = "stop" ]; then
pkill -f "${SERVICE_CMD}"
fi
}
show_service_status() {
if is_service_running; then
echo "Сервис ${SERVICE_NAME} запущен."
else
echo "Сервис ${SERVICE_NAME} не работает."
fi
}
case "" 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

  • Правила в NAT

tpws - alias для порта: 988
Вместо "192.168.1.141" нужно поставить "LAN subnets"
Filter rule association: None
  • Управление сервисом как обычно, log`и в Status — System Logs — General…
service tpws start   # можно добавить в автозагрузку, например через плагин Shellcmd
service tpws restart
service tpws stop
service tpws status

Управление сервисом только для OPNsense

edit /usr/local/opnsense/service/conf/actions.d/actions_tpws.conf
[start]
command:/usr/local/etc/rc.d/tpws start
parameters:
type:script
message:starting tpws
[stop]
command:/usr/local/etc/rc.d/tpws stop
parameters:
type:script
message:stopping tpws
[restart]
command:/usr/local/etc/rc.d/tpws restart
parameters:
type:script
message:restarting tpws
[status]
command:/usr/local/etc/rc.d/tpws status; exit 0
parameters:
type:script_output
message:request tpws status
service configd restart
edit /usr/local/etc/inc/plugins.inc.d/tpws.inc
<?php

/*
* Copyright (C) 2017 EURO-LOG AG
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

/**
* register service
* @return array
*/
function tpws_services()
{
global $config;

$services = array();
$services[] = array(
'description' => gettext('tpws TCP/IP stack'),
'configd' => array(
'restart' => array('tpws restart'),
'start' => array('tpws start'),
'stop' => array('tpws stop'),
),
'name' => 'tpws',
'pidfile' => '/var/run/tpws.pid'
);
return $services;
}

function tpws_syslog()
{
$logfacilities = array();
$logfacilities['tpws'] = array(
'facility' => array('tpws'),
);
return $logfacilities;
}

ну и напоследок сделаем запуск при старте

edit /usr/local/etc/rc.syshook.d/start/80-tpws
#!/bin/sh
Start tpws service
/usr/local/etc/rc.d/tpws start
pluginctl -s

Теперь в службах должен появиться пункт tpws TCP/IP stack