понедельник, 6 октября 2014 г.

Ubuntu, imq, ndpi. Обновлено. 03.2021


Сборка ядра для Ubuntu с патчами IMQ и nDPI (UPD. Актуализировано под 18.04)

Очередное обновление от
Проверенно на Ubuntu Server 18.04. (Для тех кто использует версию 16.04 придется скачивать/применять другие версии ядер/iptables/патчей. Думаю разберетесь)
Приступим:

1. Ставим необходимые пакеты.
 cd /usr/src/ && sudo apt-get install bc libnetfilter-conntrack-dev libnftnl-dev libssl-dev flex libmnl-dev libncurses5-dev bison libnfnetlink-dev linuxdoc-tools kernel-package dh-autoreconf dkms iptables-dev bzr libpcap-dev git arptables ebtables libjansson4 libmxml1 libnftnl7
 sudo apt-get build-dep iptables  

2. Скачиваем ядро 5.4.0.
sudo wget  http://security.ubuntu.com/ubuntu/pool/main/l/linux/linux-source-5.4.0_5.4.0-128.144_all.deb  
sudo dpkg -i ./linux-source-5.4.0_5.4.0-128.144_all.deb
sudo ln -s ./linux-source-5.4.0 ./linux  
sudo tar -xjf ./linux-source-5.4.0/linux-source-5.4.0.tar.bz2 &&  cd /usr/src/linux
3. Скачиваем подправленный IMQ патч
sudo wget https://raw.githubusercontent.com/imq/linuximq/master/kernel/v5.x/linux-5.4-imq.patch -O kernel.patch

4. Накладываем патч IMQ
sudo patch -p1 < ./kernel.patch

5. Включаем imq.  
sudo make menuconfig  

Device Drivers; Network Device Support;
[M] IMQ (intermediate queueing device) support

Networking Supportt; Networking Options; Network Packet Filtering Framework (Netfilter); Core Netfilter Configuration → "IMQ" Target Support
 
6. Начинаем сборку. Вместо 7 ставим количество своих ядер процессора + 1.
sudo CONCURRENCY_LEVEL=7 fakeroot make-kpkg --initrd --append-to-version=-v-ndpi+imq kernel-image kernel-headers  

7. Устанавливаем.
 sudo dpkg -i ../linux*.deb  

8. Перезагружаемся
 sudo reboot  

9. Следующим делом iptables. Скачиваем, патчим, собираем и устанавливаем(проверено на iptables версий 1.6.0):
cd /usr/src
sudo apt-get source iptables   
cd /usr/src/iptables-*/ 
sudo wget https://raw.githubusercontent.com/imq/linuximq/master/iptables/iptables-1.6.0-imq.diff
sudo patch -p1 < ./iptables-1.6.0-imq.diff  
sudo dpkg-buildpackage -rfakeroot -uc -b   
sudo dpkg -i ../iptables_*.deb   ../libxtables*.deb

10. Xtables-addons
sudo apt install xtables-addons-dkms xtables-addons-source xtables-addons-common


11. Теперь nDPI. Переходим в каталог и начинаем сборку
cd /usr/src  
sudo git clone -b netfilter https://github.com/vel21ripn/nDPI.git
cd ./nDPI && sudo ./autogen.sh
cd src/lib ; sudo make ndpi_network_list.c.inc 
cd ../../ndpi-netfilter  
sudo make   
sudo make install   
sudo make modules_install   
sudo modprobe xt_ndpi  

12. И проверяем с помощью lsmod | grep xt_ndpi. Если все нормально то в выводе увидите xt_ndpi

13. Протоколы с которыми можно работать.
 iptables -m ndpi -h  

Дальше их уже можно маркировать и скармливать Linux Traffic Control.  
Как и в прошлый раз привожу ссылку на тему, с которой все началось. За патчи говорим спасибо


UPD. В новых патчах добавлен target Ndpi. Теперь можно упростить маркировки трафика или его классификацию. Например:
iptables -t mangle -A POSTROUTING -m ndpi --http -j MARK --set-mark 3  
iptables -t mangle -A POSTROUTING -m ndpi --http -j RETURN
Теперь можно записать как:
 iptables --t mangle -A POSTROUTING -m ndpi --proto bittorrent -j NDPI --value 3 --set-mark --ret  
А классификацию:
 iptables -t mangle -A POSTROUTING -m ndpi --bittorrent -j CLASSIFY --set-class 1:5  
 iptables -t mangle -A POSTROUTING -m ndpi --bittorrent -j RETURN  
Можно записать как:
 iptables -t mangle -A POSTROUTING -m ndpi --proto bittorrent -j NDPI --value 0X10005 --set-clsf --ret  

UPD2. Обновлено.  Цитата Vel

Большие изменения в BT: добавлен парсер сообщений (dht) и хеш для хранения ip:port получаемых парсером
По-умолчанию хеш отключен! Чтобы его включить нужно указать его размер 1-32 (параметр bt_hash_size). Число элементо хеша будет равно N*1024.
Кроме это можно указать время хранения данных в хеше 900-3600 секунд (параметр bt_hash_timeout)
Число хранимых элементов в хеше и другую информацию о хеше можно посмотреть в /proc/net/xt_ndpi/info
При тестировании на сети /24 с 300Мбитным трафиком число элементов было 0.8-1.2 миллиона элементов!
Каждый элемент - 24 байта!
Хэш включается командой  modprobe xt_ndpi bt_hash_size= bt_hash_timeout= подставив нужные значения  для bt_hash_size и bt_hash_timeout (Естественно если модуль уже был загружен до этого, то его надо выгрузить).

UPD3. 13.01.2015.  Патчить ядро для nDpi больше не нужно. Только Imq. но нельзя при этом использовать connlabel. Если нужен connlabel, то нужно патчить ядро патчем из архива nDpi.

P.S.  Уважаемые копипастеры. Будьте добры указывать первоисточники. Хотя бы ссылку на тему https://www.linux.org.ru/forum/general/9685281