Программа для блокирования сайтов из списка РКН с использованием DPDK и nDPI.
Программа осуществляет блокировку сайтов путем анализа зеркалированного трафика от пользователей. В случае нахождения вызываемого абонентом HTTP ресурса в списке блокировки, пользователю отсылается редирект на специальную страницу или сбрасывается соединение. Блокировка HTTPS ресурсов осуществляется на основе имени сервера в client hello запросе от пользователя или ip адреса сервера, если имени сервера нет в client hello запросе. В случае нахождения вызываемого абонентом HTTPS ресурса в списке блокировки, соединение с данными ресурсом будет сброшено. Для отправки данных в сторону пользователя необходим настроенный ip интерфейс под управлением ядра ОС.
Для сборки программы необходимы следующие библиотеки и программы:
- Poco >= 1.6
- nDPI = git dev (устанавливается автоматически)
- DPDK = 16.11.1
- git
- Установить DPDK
- Сгенерировать configure
./autogen.sh
- Запустить configure
./configure --with-dpdk_target=<target> --with-dpdk_home=<path_to_compiled_dpdk>
- Скомпилировать программу
make
Для работы DPDK необходимо настроить huge-pages и подключить необходимые сетевые адаптеры в DPDK.
Пример настройки для CentOS 7:
-
Создаем в каталоге /usr/lib/tuned папку dpdk-tune
-
Создаем в dpdk-tune файл tuned.conf:
[main]
include=latency-performance
[bootloader]
cmdline=isolcpus=1,2,3 default_hugepagesz=1G hugepagesz=1G hugepages=4
isolcpus=1,2,3 - Какие ядра освободить для работы dpdk/extfilter. default_hugepagesz=1G hugepagesz=1G - Размер страницы памяти для dpdk/extfilter. hugepages=4 - Количество страниц памяти для dpdk/extfilter (в данном примере под dpdk/extfilter будет выделено 4 Гигабайта памяти).
- Активируем профиль
tuned-adm profile dpdk-tune
-
Отправляем сервер на перезагрузку.
-
Загружаем необходимые драйвера
modprobe uio
insmod /path/to/dpdk/build/kmod/igb_uio.ko
- Подключаем сетевую карту к dpdk
/path/to/dpdk/tools/dpdk-devbind.py --bind=igb_uio dev_pci_num
Получить dev_pci_num можно при помощи команды:
/path/to/dpdk/tools/dpdk-devbind.py --status
Параметры работы программы задаются в конфигурационном файле. Для запуска программы необходимо указать путь к конфигурационному .ini файлу (--config-file в командой строке). Для запуска в режиме daemon необходимо указать ключи --daemon и --pidfile=/path/to/file.pid
Файлы с данными для блокировки (домены, url и т.д.) должны быть в формате nfqfilter.
Для загрузки обновленных списков блокировки без перезапуска программы необходимо подать сигнал HUP.
Если вы используете программу и она вам нравится, то вы можете отблагодарить автора через Yandex.Money 410014706910423