OPNsense dvtws (zapret)

Network OPNSense

Ставим git (он вроде доступен без подключения репозиториев, но я уже не помню)

pkg update && pkg install git

Клонируем zapret из github

mkdir /opt && git clone https://github.com/bol-van/zapret.git /opt/zapret

Копируем бинарник

cp /opt/zapret/binaries/freebsd-x64/dvtws /usr/local/sbin && chmod +x /usr/local/sbin/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

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

#!/bin/sh
SERVICE_NAME="dvtws"
SERVICE_CMD="/usr/local/sbin/dvtws"
pidfile="/var/run/dvtws.pid"
is_service_running() {
  pgrep -f "${SERVICE_CMD}" > ${pidfile} && return 0 || return 1
}

mng_service() {
  if [ "" = "start" ]; then
    kldload ipfw
    kldload ipdivert
#pppoe это мой интерфейс наружу, у вас может быть свой
    ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit pppoe0
    ipfw add 100 divert 989 udp from any to table\(discord\) 50000-50030 out not diverted xmit pppoe0
#тут мы заполняем ipset для таблицы discord, либо создайте список с сетями, либо удалите
    ipfw table discord flush
    cat /usr/local/etc/dvtws/dvtws_discord | while read line;do
    ipfw table discord add $line 1
    done
#этот кусок

    pfctl -d ; pfctl -e
    ${SERVICE_CMD} \
    --debug=0 \
    --pidfile=/var/run/dvtws.pid \
    --port=989 \
#порты и правила discord
    --filter-udp=50000-50030 \
    --dpi-desync=fake \
    --dpi-desync-repeats=6 \
    --dpi-desync-any-protocol \
    --dpi-desync-cutoff=n2 \
    --new \
#порт 80(хз зачем, но пусть будет)
    --filter-tcp=80 \
    --dpi-desync=split2 \
    --dpi-desync-split-seqovl=1 \
    --hostlist-auto=/usr/local/etc/dvtws/dvtws_auto \
    --hostlist-auto-fail-threshold=3 \
    --hostlist-auto-fail-time=60 \
    --hostlist-auto-retrans-threshold=3 \
    --hostlist-auto-debug=/usr/local/etc/dvtws/dvtws_debug \
    --hostlist=/usr/local/etc/dvtws/dvtws_auto \
    --hostlist=/usr/local/etc/dvtws/dvtws_host \
    --hostlist-exclude=/usr/local/etc/dvtws/dvtws_exclude \
    --new \
#порт 443 это весь наш https трафик
    --filter-tcp=443 \
    --dpi-desync=split2 \
    --dpi-desync-split-seqovl=1 \
    --hostlist-auto=/usr/local/etc/dvtws/dvtws_auto \
    --hostlist-auto-fail-threshold=3 \
    --hostlist-auto-fail-time=60 \
    --hostlist-auto-retrans-threshold=3 \
    --hostlist-auto-debug=/usr/local/etc/dvtws/dvtws_debug \
    --hostlist=/usr/local/etc/dvtws/dvtws_auto \
    --hostlist=/usr/local/etc/dvtws/dvtws_host \
    --hostlist-exclude=/usr/local/etc/dvtws/dvtws_exclude \
    | logger -t "${SERVICE_NAME}" >/dev/null 2>&1 &
  elif [ "" = "stop" ]; then
    ipfw delete 100
    pkill -f ${SERVICE_NAME}
  fi
}

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

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 

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