суббота, 24 января 2015 г.

Centos, ndpi и imq. Обновлено 3.06.2015.

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

Еще один мануал сборки ядра с Ndpi и imq. Теперь для Centos 7. Проверялся только под x64! Мануал максимально подробный, на уровне "копировать-вставить".

Переходим в домашний каталог и создаем необходимые директории
 cd ~/ 
 mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
 echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros 

Устанавливаем необходимые пакеты
 yum install rpm-build redhat-rpm-config asciidoc hmaccalc nano perl-ExtUtils-Embed pesign xmlto
 yum groupinstall "Development Tools"
 yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel zlib-devel
 yum install newt-devel numactl-devel pciutils-devel python-devel zlib-devel
 yum install ncurses-devel qt-devel bc libnetfilter_conntrack-devel  libnfnetlink-devel libpcap-devel net-tools wget libselinux-devel

Получаем исходники последнего ядра (на момент написания это 3.10.0-123.20.1) и патч  подправленный (с офф сайта патч выдавал режекты) IMQ.
 rpm -i http://vault.centos.org/7.0.1406/updates/Source/SPackages/kernel-3.10.0-123.20.1.el7.src.rpm 
 cd ~/rpmbuild/SPECS
 rpmbuild -bp --target=$(uname -m) kernel.spec
 cd ~/rpmbuild/SOURCES/ && wget https://www.dropbox.com/s/jay95g9tqbnhu29/linux-3.10-imq.diff

Переходим в каталог и копируем  конфиг
 cd ~/rpmbuild/BUILD/kernel-*/linux-*/
 /bin/cp configs/kernel-3.10.0-x86_64.config .config   

Подправим spec файл
 cd ~/rpmbuild/SPECS/  
 /bin/cp kernel.spec kernel.spec.back
 sed -i -e '5 s/^/%define buildid .IMQ\n/;' kernel.spec  
 sed -i -e '/Patch999999/i\Patch999998: linux-3.10-imq.diff' kernel.spec
 sed -i -e '/ApplyOptionalPatch linux-kernel-test.patch/i\ApplyOptionalPatch linux-3.10-imq.diff' kernel.spec

Накладываем патч IMQ и включаем модуль
 cd ~/rpmbuild/BUILD/kernel-*/linux-*/
 patch -p1 < ../../../SOURCES/linux-3.10-imq.diff
 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

Подправим файл конфига
 sed -i -e '1 s/^/# x86_64\n/;' .config  

Копируем наши конфиги
 /bin/cp ./.config ../../../SOURCES/kernel-3.10.0-x86_64.config  
 /bin/cp ./.config ../../../SOURCES/kernel-3.10.0-x86_64-debug.config  

Ну и сборка
 cd ~/rpmbuild/SPECS/   
 rpmbuild -bb --without kabichk  --without debug --without debuginfo --target=`uname -m` kernel.spec  

После устанавливаем наше ядро.
 rpm -ivh --force ../RPMS/x86_64/kernel-*.rpm 
Перезагружаемся и проверяем
 reboot  
 modprobe xt_IMQ  
 lsmod | grep IMQ  

Если все нормально то увидим приблизительно следующее
 xt_IMQ         12532 0  

Теперь iptables.
 cd ~/ && rpm -ivh http://vault.centos.org/7.0.1406/os/Source/SPackages/iptables-1.4.21-13.el7.src.rpm 
 cd ~/rpmbuild/SPECS
 rpmbuild -bp  iptables.spec 
 cd ~/rpmbuild/SOURCES/ && wget https://www.dropbox.com/s/x2pvnznhq3z4jnt/imq-iptables-1.4.13.diff
 cd ~/rpmbuild/SPECS/

Подправим iptables.spec
 sed -i -e '/Patch1/a\Patch2: imq-iptables-1.4.13.diff' iptables.spec
 sed -i -e '/%patch1 -p1/a\%patch2 -p1 -b imq-iptables-1.4.13' iptables.spec

Теперь можем собрать и установить
 rpmbuild -bb iptables.spec  
 rpm -Uvh  ../RPMS/x86_64/iptables-*.rpm   

Далее xtables
 cd ~/  
 wget https://www.dropbox.com/s/l16zkc8gbubf9ae/xtables-addons-2.6.tar.xz  
 tar -xvf xtables-addons-2.6.tar.xz  
 cd xtables-addons-2.6  
 ./configure  
 make 
 make install 

Следующий шаг nDpi. Использоваться будет версия nDpi без патча ядра. Недостатком этого является отсутствие возможности использовать xt_connlabel. Если кому-то будет интересно, выложу дополнение по сборке с патчем.
 cd ~/  
 wget http://devel.aanet.ru/ndpi/nDPI-1.5.1.20150513.tar.gz  
 tar -xvzf nDPI-1.5.1.20150513.tar.gz && cd ./nDPI-1.5.1.20150513/ && ./autogen.sh && cd ./ndpi-netfilter/
 sed -i -e 's/net, __ndpi_free_flow, n)/net, __ndpi_free_flow, n, 0 ,0)/' src/main.c
 make
 make install  
 make modules_install  
 modprobe xt_ndpi    

Проверяем с помощью lsmod | grep xt_ndpi. Если все нормально то в выводе увидите xt_ndpi
Протоколы с которыми можно работать.
 iptables -m ndpi -h  

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

Полноценное тестирование не проводил. Максимум что я проверил - поднятие интерфейсов IMQ, перенаправление трафика с интерфейсов на IMQ и  1-2 правила nDpi с маркировкой. Поэтому если что-то работает не так просьба отписаться.

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 (Естественно если модуль уже был загружен до этого, то его надо выгрузить).

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

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

  1. Hello great tutorial, but I have one problem when I try to build rpm it give the following error:
    Makefile:506: /home/manage/rpmbuild/BUILD/kernel-3.10.0-123.20.1.el7/linux-3.10.0-123.20.1.el7.nDPI.x86_64/arch//Makefile: No such file or directory
    make: *** No rule to make target `/home/manage/rpmbuild/BUILD/kernel-3.10.0-123.20.1.el7/linux-3.10.0-123.20.1.el7.nDPI.x86_64/arch//Makefile'. Stop.
    + true
    + '[' -s .newoptions ']'
    + rm -f .newoptions
    + make ARCH= oldnoconfig
    Makefile:506: /home/manage/rpmbuild/BUILD/kernel-3.10.0-123.20.1.el7/linux-3.10.0-123.20.1.el7.nDPI.x86_64/arch//Makefile: No such file or directory
    make: *** No rule to make target `/home/manage/rpmbuild/BUILD/kernel-3.10.0-123.20.1.el7/linux-3.10.0-123.20.1.el7.nDPI.x86_64/arch//Makefile'. Stop.
    error: Bad exit status from /var/tmp/rpm-tmp.28Elcy (%prep)

    It will be highly appreciated if the you clarify the above error message as there is no help available elswhere.

    Regards,
    Zia

    ОтветитьУдалить
    Ответы
    1. Hello. Thank you! Today I will update instructions. There is an update patch IMQ and ndpi, as well as double-check assembly in Virtualboks.

      Sorry for my English.

      Удалить
    2. I have updated the tutorial. Try again. I build on Сentos 7 without errors

      Удалить
    3. Hello and Thanks for taking time and fixing the problems. I am going to try it in a moment and give you feedback afterwards.

      regards,
      Zia

      Удалить
    4. Great. I have compiled and Installed successfully both kernel and iptables following your tutorial.

      Once again l would like to thank your efforts. I have been searching for nDPI tutorial since long. You are lifesaver.


      regards,
      Zia

      Удалить
    5. My pleasure.
      I also was looking for. Nothing was found, and he decided to make a tutorial.

      You can watch for updates Ndpi modules in my blog or topic http://www.linux.org.ru/forum/general/9685281

      Удалить
  2. Thanks once again, I have one other question, it is possible to compile nDPI on Centos 6.5, If possible and you have time, kindly do tutorial on how to compile nDPI on Centos 6.5. I have an old server which is running on Centos 6.5.

    regards,
    Zia

    ОтветитьУдалить
  3. не собирается на 7.1

    [root@localhost linux-3.10.0-229.11.1.el7.centos.x86_64]# cd ~/rpmbuild/SPECS/
    [root@localhost SPECS]# rpmbuild -bb --without kabichk --without debug --without debuginfo --target=`uname -m` kernel.spec
    Building target platforms: x86_64
    Building for target x86_64
    Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.fjbAUG
    + umask 022
    + cd /root/rpmbuild/BUILD
    + patch_command='patch -p1 -F1 -s'
    + cd /root/rpmbuild/BUILD
    + rm -rf kernel-3.10.0-229.11.1.el7
    + /usr/bin/mkdir -p kernel-3.10.0-229.11.1.el7
    + cd kernel-3.10.0-229.11.1.el7
    + /usr/bin/xz -dc /root/rpmbuild/SOURCES/linux-3.10.0-229.11.1.el7.tar.xz
    + /usr/bin/tar -xf -
    + STATUS=0
    + '[' 0 -ne 0 ']'
    + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
    + mv linux-3.10.0-229.11.1.el7 linux-3.10.0-229.11.1.el7.centos.IMQ.x86_64
    + cd linux-3.10.0-229.11.1.el7.centos.IMQ.x86_64
    + cp /root/rpmbuild/SOURCES/kernel-3.10.0-ppc64-debug.config /root/rpmbuild/SOURCES/kernel-3.10.0-ppc64.config /root/rpmbuild/SOURCES/kernel-3.10.0-ppc64le-debug.config /root/rpmbuild/SOURCES/kernel-3.10.0-ppc64le.config /root/rpmbuild/SOURCES/kernel-3.10.0-s390x-debug.config /root/rpmbuild/SOURCES/kernel-3.10.0-s390x-kdump.config /root/rpmbuild/SOURCES/kernel-3.10.0-s390x.config /root/rpmbuild/SOURCES/kernel-3.10.0-x86_64-debug.config /root/rpmbuild/SOURCES/kernel-3.10.0-x86_64.config .
    + ApplyOptionalPatch linux-3.10-imq.diff
    + local patch=linux-3.10-imq.diff
    + shift
    + '[' '!' -f /root/rpmbuild/SOURCES/linux-3.10-imq.diff ']'
    ++ wc -l /root/rpmbuild/SOURCES/linux-3.10-imq.diff
    ++ awk '{print $1}'
    + local C=1753
    + '[' 1753 -gt 9 ']'
    + ApplyPatch linux-3.10-imq.diff
    + local patch=linux-3.10-imq.diff
    + shift
    + '[' '!' -f /root/rpmbuild/SOURCES/linux-3.10-imq.diff ']'
    Patch999998: linux-3.10-imq.diff
    + case "$patch" in
    + patch -p1 -F1 -s
    2 out of 6 hunks FAILED -- saving rejects to file include/linux/skbuff.h.rej
    1 out of 1 hunk FAILED -- saving rejects to file include/net/netfilter/nf_queue.h.rej
    error: Bad exit status from /var/tmp/rpm-tmp.fjbAUG (%prep)


    RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.fjbAUG (%prep)
    [root@localhost SPECS]#
    что делать?

    ОтветитьУдалить
    Ответы
    1. Ядро другое. Патч imq надо подправлять под это ядро. Либо собирать на старом ядре. Патч может в течении пары дней подправлю. К сожалению сейчас сменил место работы, и нет под рукой физической машины с Centos, как будет время подправлю патч.

      Удалить
  4. собрал со старым ядром - трафик детектится.
    Но интересно классифицировать и посмотреть какую полосу "жрёт" например торрент трафик? И соответственно прижать.
    Могли бы вы не большой пример (простой) написать? С использованием IMQ и TC

    ОтветитьУдалить
    Ответы
    1. Вечером постараюсь скинуть скрипт динамического шейпера. там же можно и статистику смотреть.

      Удалить
    2. Готово. http://a7lanov.blogspot.ru/2015/08/blog-post.html
      Через этот скрипт можно просматривать статистику. Думаю разберетесь.

      Удалить
  5. и xt_IMQ чем отличается от imq ? без последнего интерфейсы imq не подымаются

    ОтветитьУдалить
    Ответы
    1. Ну судя по тому где они лежат первое часть netfilter второе драйвер самого устройства. Естественно без второго интерфейсы не поднимутся.

      Удалить
  6. можете патч подправить для нового ядра?

    ОтветитьУдалить
    Ответы
    1. было несколько попыток подправить патч. С наложением проблем не было. Но вот сборка не проходила. Надо глубоко патч править. К сожалению в данный момент на это времени совсем нет да и знаний в программировании недостаточно.

      Удалить
  7. Если кого интересует могу дополнить ман сборкой на последнем 3.18.22 ядре на спеках от elrepo уже с поддержкой как imq так и ndpi. Последнее 3.10 ядро от рхела серьезно подлатали патчами ни одни ханк не проходит. Врядли кто то будет морочится и писать патч только под него.

    ОтветитьУдалить
    Ответы
    1. Интересует - ждем. Пилите. Спасибо :)

      Удалить
    2. так и не дождались печально.

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

    ОтветитьУдалить
  9. По поводу ядра kernel-3.10.0-327.13.1 очень много залатали если использовать linux-3.10-imq.diff то ядро не собирается.
    Вся та же инструкция подправленная под актуальные версии.
    Сборка ядра 4.4.6 на SPEC от ELRepo.

    #Download
    cd ~/rpmbuild/SOURCES
    wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.6.tar.xz
    cd ~/rpmbuild/SPECS
    rpm -i http://ftp.colocall.net/pub/elrepo/kernel/el7/SRPMS/kernel-lt-4.4.6-1.el7.elrepo.nosrc.rpm

    #правка SPEC
    cd ~/rpmbuild/SPECS/
    /bin/cp kernel-lt-4.4.spec kernel-lt-4.4-IMQ.spec
    sed -i -e '8 s/^/%define buildid .IMQ\n/;' kernel-lt-4.4-IMQ.spec
    sed -i -e '303 s/^/%{__patch} -p1 -F1 -d "$RPM_BUILD_DIR\/%{name}-%{LKAver}\/linux-%{version}-%{release}.%{_target_cpu}" < "$RPM_SOURCE_DIR\/linux-4.4-imq-test.diff"\n/;' kernel-lt-4.4-IMQ.spec

    #Патч ядра
    yum install libunwind-devel openssl-devel xz-devel
    cd ~/rpmbuild/SPECS
    rpmbuild -bp --target=$(uname -m) kernel-lt-4.4.spec
    cd ~/rpmbuild/SOURCES
    wget https://www.dropbox.com/s/fdbrz93780gwpih/linux-4.4-imq-test.diff
    cd ~/rpmbuild/BUILD/kernel-*/linux-*/
    patch -p1 < ../../../SOURCES/linux-4.4-imq-test.diff



    #Настройка ядра
    cd ~/rpmbuild/BUILD/kernel-*/linux-*/
    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

    #Копирование конфига
    cd ~/rpmbuild/BUILD/kernel-*/linux-*/
    /bin/cp ./.config ../../../SOURCES/config-4.4.6-x86_64

    #сборка ядра
    cd ~/rpmbuild/SPECS/
    rpmbuild -bb --without kabichk --without debug --without debuginfo --target=`uname -m` kernel-lt-4.4-IMQ.spec

    #Установка ядра
    rpm -ivh --force ../RPMS/x86_64/kernel-lt-4.4.6-1.IMQ.el7.centos.x86_64.rpm
    rpm -ivh --force ../RPMS/x86_64/kernel-lt-devel-4.4.6-1.IMQ.el7.centos.x86_64.rpm

    #Iptables
    cd ~/ && rpm -ivh http://vault.centos.org/7.2.1511/os/Source/SPackages/iptables-1.4.21-16.el7.src.rpm
    cd ~/rpmbuild/SOURCES/ && wget https://raw.githubusercontent.com/imq/linuximq/master/latest/imq-iptables-1.4.13.diff
    cd ~/rpmbuild/SPECS/
    rpmbuild -bp iptables.spec

    #Подправим iptables.spec
    sed -i -e '/Patch4/a\Patch5: imq-iptables-1.4.13.diff' iptables.spec
    sed -i -e '/%patch4 -p1/a\%patch5 -p1 -b imq-iptables-1.4.13' iptables.spec

    #Сборка пакета и установка
    rpmbuild -bb iptables.spec
    rpm -Uvh ../RPMS/x86_64/iptables-*.rpm

    #xtables
    cd ~/
    git clone http://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons
    cd xtables-addons/
    ./autogen.sh
    ./configure
    make
    make install

    #nDpi
    cd ~/
    git clone -b netfilter https://github.com/vel21ripn/nDPI.git
    ./autogen.sh
    cd ndpi-netfilter
    make
    make install
    make modules_install

    ОтветитьУдалить
    Ответы
    1. Патч для kernel-lt-4.4.33-1.el7.elrepo.nosrc.rpm подойдет? т.к. 4.4.6 уже нет.

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

    ОтветитьУдалить
  11. С патчем от Vel собралось на 4.4.33 http://devel.aanet.ru/ndpi/linux-imq-4.4.diff.xz

    ОтветитьУдалить