Возможности
Реализация Netblock DPI базируется на использовании libnetfilter_queue + nDPI
Позволяет блокировку следующими методами :
- блокировка по связке ip:port
- блокировка по доменному имени (DNS)
- блокировка по URL
- блокировка HTTPS
- блокировка дополнительных портов (nDPI)
- производить перенаправление в случае блокировки
Установка Linux (на примере Debian 9)
Подгтотавливаем систему, устанавливаем необходимые библиотеки
Code Block language bash apt-get zip install autoconf libtool libpoconet46 g++ libnetfilter-acct-dev libnetfilter-conntrack-dev libnetfilter-cthelper0-dev libnetfilter-cttimeout-dev libnetfilter-log-dev libnetfilter-queue-dev
Скачиваем и устанавливаем nfq
Code Block language bash wget https://github.com/max197616/nfqfilter/archive/master.zip unzip master.zip cd nfqfilter-master ./autogen.sh ./configure make && make install cp src/nfqfilter /usr/local/sbin/ touch /var/log/nfqfilter.log
Настраиваем конфиг ( /etc/nfq/nfq.ini ), пример :
Code Block collapse true ; номер очереди queue = 0 ; файл с доменами для блокировки domainlist = /etc/nfq/domains ; файл с url для блокировки urllist = /etc/nfq/urls ; файл с ssl доменами для блокировки ssllist = /etc/nfq/ssl_host ; файл с ip:port для блокировки hostlist = /etc/nfq/hosts ; куда редиректить в случае наличия в списках redirect_url = https://127.0.0.1:9443/ ; дополнительные порты для протоколов (nDPI) protocols = /etc/nfq/protos ; время вывода статистики по использованию памяти, минут statistic_interval = 10 ; каким значением метить пакеты для iptables в случае наличия в списках ssl и hosts mark_value = 10 ; количество обрабатываемых пакетов (default: 1024) max_pending_packets = 100000 [logging] loggers.root.level = information ;loggers.root.level = debug loggers.root.channel = fileChannel channels.fileChannel.class = FileChannel channels.fileChannel.path = /var/log/nfqfilter.log channels.fileChannel.rotation = 1 M channels.fileChannel.archive = timestamp channels.fileChannel.formatter.class = PatternFormatter channels.fileChannel.formatter.pattern = %Y-%m-%d %H:%M:%S.%i [%P] %p %s - %t channels.fileChannel.formatter.times = local
В iptables создаём :
Code Block language bash iptables -t mangle -N NETBLOCK_DPI iptables -t mangle -A NETBLOCK_DPI -m connbytes --connbytes-mode bytes --connbytes-dir both --connbytes 100000 -j RETURN iptables -t mangle -A NETBLOCK_DPI -p tcp --dport 80 -j NFQUEUE --queue-num 0 iptables -t mangle -A NETBLOCK_DPI -p tcp --dport 443 -j NFQUEUE --queue-num 0 ipset -N NETBLOCK_DPI_SSL iptables -A FORWARD -m mark --mark 10 =p tcp -j REJECT --reject-with tcp-rst iptables -A FORWARD -m set --match-set NETBLOCK_DPI_SSL dst -p tcp -j REJECT --reject-with tcp-rst iptables -t mangle -A PREROUTING -j NETBLOCK_DPI
Запускаем следующим образом (daemonize, PID location, config location) :
Code Block language bash /usr/local/sbin/nfqfilter --daemon --pidfile=/var/run/nfqfilter.pid -c /etc/nfq/nfq.ini
Использование в связке с Abills
Скачиваем и инициализируем блок-лист UABlock (например), или настраиваем нужные нам блокировки с помощью админки ( Интерфейс управления ресурсами блокировки )
Code Block language bash /usr/abills/libexec/billd netblock TYPE=uablock FETCH=1 INIT=1
В конфигурационном файле /usr/abills/libexec/config.pl указываем параметры для установленного nfq :
Code Block language bash # директория с конфигурационными файлами $conf{NETBLOCK_NFQ_ETC} = "/etc/nfq/" # restart command line $conf{NETBLOCK_NFQ_RESTART} = "kill -9 `ps ax | grep nfqfilter | grep -v grep | awk '{print $1}'` && \ /usr/local/sbin/nfqfilter --daemon --pidfile=/var/run/nfqfilter.pid -c /etc/nfq/nfq.ini";
Запускаем блокировку :
Code Block language bash /usr/abills/libexec/billd netblock TYPE=uablock ACTIVE_BLOCK=1 DPI_BLOCK=1