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

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


Сборка ядра для Ubuntu с патчами IMQ и nDPI

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

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

2. Скачиваем ядро. 4.4.0
 sudo wget http://security.ubuntu.com/ubuntu/pool/main/l/linux/linux-source-4.4.0_4.4.0-59.80_all.deb  
 sudo dpkg -i ./linux-source-4.4.0_4.4.0-59.80_all.deb
 sudo ln -s ./linux-source-4.4.0 ./linux  
 sudo tar -xjf ./linux-source-4.4.0/linux-source-4.4.0.tar.bz2 &&  cd /usr/src/linux
3. Скачиваем подправленный IMQ патч
 sudo wget https://www.dropbox.com/s/mm54cij8oip8e8r/linux-imq-4.4.diff -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-*/ 
 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
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 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

19 комментариев:

  1. Что такое connlabel? Все таки нужно патчить ядро или нет?

    ОтветитьУдалить
    Ответы
    1. Система меток. Примеры использования я не нашел, и раз вы спрашиваете для чего он, то патчить вам ничего не нужно и вы не используете это.

      Удалить
    2. Ну это не маркировка iptables?

      Удалить
    3. К MARK/CONNMARK отношения не имеет.

      Удалить
    4. Спасибо будем пробовать.

      Удалить
  2. Возник вопрос по поводу приоретизации трафика, как это связать с tc. Немного не понял момент с маркировкой и связкой с tc. Есть очереди HTB на интерфейсе туда завешаны трубы class по приоритетам, вопрос как заставить маркированный трафик идти именно в нужный класс

    ОтветитьУдалить
    Ответы
    1. в iptables маркируем с помощью -j MARK --set-mark 5
      в tc (пример) tc filter add dev imq0 protocol ip parent 1: prio 1 handle 5 fw flowid 1:10
      Можно в iptables с помощью -j CLASSIFY --set-class 1:10.
      Так же не забываем про CONNMARK, чтоб маркировать соединения и RETURN, чтоб повторно не маркировать уже промаркированный пакет.

      Удалить
  3. Many thanks for your effort! i follow your instructions since 14.04.1 (kernel 3.13) and i found your page to be the only source for nDPI AND IMQ!
    Pity that my russian isn't that great, tho :-)

    ОтветитьУдалить
  4. при сборке nDPI -
    ndpiReader.c:47:24: fatal error: pcap/nflog.h: Нет такого файла или каталога

    ОтветитьУдалить
  5. Этот комментарий был удален автором.

    ОтветитьУдалить
  6. В ядрах 4.x (4.4 точно) сменилось api, поэтому нужно ставить xtables версии 2.10.

    https://fossies.org/diffs/xtables-addons/2.9_vs_2.10/extensions/xt_DELUDE.c-diff.html

    И nflog.h нет в libpcap-dev в версии для trusty (1.5.3-2 на данный момент), но есть в 1.7.4, поэтому можно взять для новых версий отсюда https://launchpad.net/ubuntu/+source/libpcap

    ОтветитьУдалить
  7. Также для новых xtables-addons нужен libxtables > 10, поэтому ставим 11 сперва.

    (здесь я и xtables-addons сразу последний уже беру)

    http://ftp.univ-nantes.fr/ubuntu/pool/main/i/iptables/libxtables11_1.6.0-2ubuntu3_amd64.deb
    http://ftp.ubuntu.com/ubuntu/ubuntu/pool/universe/x/xtables-addons/xtables-addons-common_2.11-1_amd64.deb
    http://ftp.ubuntu.com/ubuntu/ubuntu/pool/universe/x/xtables-addons/xtables-addons-dkms_2.11-1_all.deb

    Да, стоит заметить, на ядре, собранном без CONFIG_NF_CONNTRACK_LABELS, у вас ndpi не будет нормально работать. Да и вообще ему нужен conntrack, так что если он для вас неприемлем, можете и не пытаться ставить никакие dpi-расширения для netfilter.

    ОтветитьУдалить
    Ответы
    1. Спасибо. При следующем обновлении мануала все это добавлю. Но пока все работает трогать ничего не хочется =)

      Удалить
    2. Может вы под debian 8 собирали? может запилите свою инструкцию?

      Удалить
  8. А тем временем пару месяцев назад вышел nDPI 1.8
    Вы будете допиливать свою версию вслед за ней? =)

    ОтветитьУдалить
    Ответы
    1. Конечно. Но когда буду немного свободен =) старая версия вполне нормально работает. Поэтому без острой необходимости нет. Как будет время обновлю инструкцию и под Ubuntu и под Centos

      Удалить
    2. Инструкция по части nDpi не меняется. Все так же, последняя доступная версия на гитхабе будет собираться. По части Ubuntu обновил. Новое ядро (версия 4.4), поправил ссылку на патч iptable

      Удалить