OpenDPI (определение типов трафика) + iptables
OpenDPI - библиотека для классификации трафика на основе технологии глубокого анализа пакетов (DPI - Deep Packet Inspection). Проект IPP2P более не поддерживается, и, в качестве замены, предлагает использовать именно OpenDPI. В отличие от IPP2P, основной целью которого является определение именно p2p трафика, OpenDPI поддерживает широкий набор различных протоколов. OpenDPI изначально спроектирован для очень низкого уровня ложных положительных срабатываний. В отличие от L7-filter не требует наложения патчей на iptables и ядро; работает в виде модуля ядра и библиотеки xtables. Также определения протоколов представляют собой не список регэкспов, а модули на C, что повышает быстродействие. Недавно для этой библиотеки была реализована поддержка iptables.
А теперь давайте попробуем использовать OpenDPI на практике.
Идем в раздел Downloads сайта проекта. Скачиваем файлы opendpi-1.2.0.tar.gz и opendpi-netfilter-wrapper-1.1.tar.gz (эти версии актуальны на момент написания статьи). Если есть желание поиграться - изучите содержимое opendpi-1.2.0.tar.gz, попробуйте собрать обычным образом (./configure && make && make install), поэкспериментируете со скармливанием различных pcap-файлов демо-приложению OpenDPI_demo.
Приступаем к сборке модуля iptables. Вам понадобятся заголовки ядра и iptables. Также необходимо, чтобы в ядре были выставлены определенные опции:
- Опция Connection tracking events должна быть включена:
Connection tracking events Symbol: NF_CONNTRACK_EVENTS Location: -> Networking support -> Networking options -> Network packet filtering framework (Netfilter) -> Core Netfilter Configuration -> Netfilter connection tracking support
- Опция Connection tracking netlink interface должна быть отключена:
Connection tracking netlink interface Symbol: NF_CT_NETLINK Location: -> Networking support -> Networking options -> Network packet filtering framework (Netfilter) -> Core Netfilter Configuration -> Netfilter connection tracking support
Распакуйте opendpi-netfilter-wrapper-1.1.tar.gz и перейдите в каталог opendpi-netfilter-wrapper-1.1. Сюда распакуйте opendpi-1.2.0.tar.gz. Т.е. в каталоге opendpi-netfilter-wrapper-1.1 должны находиться файлы README, ipq_*.diff, каталог wrapper и каталог opendpi-1.2.0. В каталоге opendpi-1.2.0 соответственно исходники OpenDPI. Ниже все описанные действия в виде команд:
$ ls opendpi-1.2.0.tar.gz opendpi-netfilter-wrapper-1.1.tar.gz $ tar -xzf opendpi-netfilter-wrapper-1.1.tar.gz $ cd opendpi-netfilter-wrapper-1.1 $ tar -xzf ../opendpi-1.2.0.tar.gz
Теперь переходите в каталог opendpi-1.2.0:
$ cd opendpi-1.2.0
и применяйте патчи:
$ patch -p0 < ../ipq_main.h.diff $ patch -p0 < ../ipq_protocols.h.diff
После этого необходимо установить переменную среды:
$ export OPENDPI_PATH=$(pwd)
и перейти в каталог wrapper:
$ cd ../wrapper
UPD: Теперь нужно применить патч для поддержки ядра 2.6.35 (см. конец статьи).
Затем нужно выполнить:
$ make # make modules_install # cp ipt/libxt_opendpi.so /lib/xtables
Теперь можно использовать модуль:
# modprobe xt_opendpi
Изучите доступные опции:
# iptables -m opendpi --help
Попробуйте в действии:
# iptables -A OUTPUT -m opendpi --http -j DROP # wget http://ya.ru/ --2010-11-12 20:57:41-- http://ya.ru/ Connecting to 213.180.204.3:80... connected. HTTP request sent, awaiting response... ^C
Возможные ошибки при сборке:
- Если компилятор жалуется, что не может найти файлы generated/*.h, значит у вас нет заголовков ядра. Возможно также, что вы сделали make clean в каталоге с исходниками ядра.
- Если при modprobe вы получаете ошибку
FATAL: Error inserting xt_opendpi (/lib/modules/2.6.34-gentoo-r12/extra/xt_opendpi.ko): Device or resource busy
- Если вы получаете ошибку
/opendpi/opendpi-netfilter-wrapper-1.1/wrapper/src/main.c:466: error: dereferencing pointer to incomplete type
UPD:
Поизучав документацию по Netfilter, удалось внести изменения для работы на ядре 2.6.35. Патч можно скачать тут. Если вы его положите его на одном уровне с каталогом opendpi-netfilter-wrapper-1.1, то применять его нужно следующим образом:
patch -p3 < ../../opendpi-netfilter-wrapper-1.1_2.6.35_v2.patch
Команду эту выполнять после перехода в каталог wrapper (см. текст статьи выше).
UPD2:
Написал ebuild и добавил в свой оверлей.
29 комментариев
Комментарий от: sov1et
Текущая реализация l7filter не требует наложений патчев вообще. Её код вынесли из ядра в юзерспейс, где ей и место. Ососбенно хорошесть этого становится заметно на больших pps.
Ставится и конфигурится фильтрация торрентов насмного проще.
Комментарий от: Peter
Пример конфигурации очень прост: iptables -A FORWARD -m opendpi –<желаемый_протокол> -j DROP :)
А работа анализатора сетевых пакетов в юзерспейсе разве будет быстрее, чем в ядре? Особенно на больших pps? :)
Комментарий от: sov1et
Она не будет мешать ядру выполнять свои основные функции.
Нагружуать ядро всякими вычисления приводит к локам.
А то что торренты для клиента А забанятся на 2 секунды позже никак не повлияет на качество фаервола.
Комментарий от: Peter
Дело в том, что беготня сетевых пакетов из ядра в юзерспейс будет давать много излишней нагрузки на систему.
Комментарий от: buzz
А у меня проблема , убунту 10.10
root@assasin:~/opendpi-netfilter-wrapper-1.1/wrapper# make
make -C ipt
make[1]: Entering directory `/home/kocmuk/opendpi-netfilter-wrapper-1.1/wrapper/ipt’
if test -d opendpi_cpy; then \
cp /home/kocmuk/opendpi-netfilter-wrapper-1.1/opendpi-1.2.0/src/* opendpi_cpy -R; \
else \
mkdir opendpi_cpy; \
cp /home/kocmuk/opendpi-netfilter-wrapper-1.1/opendpi-1.2.0/src/* opendpi_cpy -R; \
fi
make libxt_opendpi.so
make[2]: Entering directory `/home/kocmuk/opendpi-netfilter-wrapper-1.1/wrapper/ipt’
gcc -fPIC -Iopendpi_cpy/include -Iopendpi_cpy/lib -I../src -DOPENDPI_NETFILTER_MODULE -O2 -Wall -D_INIT=libxt_opendpi_init -c -o libxt_opendpi.o libxt_opendpi.c;
libxt_opendpi.c:26: fatal error: xtables.h: No such file or directory
compilation terminated.
make[2]: *** [libxt_opendpi.o] Error 1
make[2]: Leaving directory `/home/kocmuk/opendpi-netfilter-wrapper-1.1/wrapper/ipt’
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/kocmuk/opendpi-netfilter-wrapper-1.1/wrapper/ipt’
make: *** [all] Error 2
Куда копать?
Комментарий от: Peter
buzz, у вас нет заголовков iptables. Нужно установить пакет типа iptables-dev.
Комментарий от: buzz
iptables-dev - не помогло.
А вот module-assistant auto-install xtables-addons-source - всё починило.
А вот ещё вопрос, я не хочу дропать всё.
Я хочу маркировать п2п и его уже урезать до 2мбит.
Как вот это реализовать?
Комментарий от: Peter
Маркируем пакеты:
iptables -A PREROUTING -t mangle -m opendpi –bittorrent -j MARK –set-mark 12
Потом нужно нарезать правила шейпера, это достаточно большая тема, информацию можно поискать в гугле. Статья по шейпированию у меня в планах есть, но по срокам пока ничего не знаю :)
Комментарий от: buzz
iptables -A PREROUTING -t mangle -m opendpi –bittorrent -j MARK –set-mark 12 - это понятно.
У меня слабое понимание в “резалке”
Я так понимаю, использовать надо “tc”
Можно простейший пример?
Мне от шейпера, надо лишь огрaничение p2p.
Комментарий от: Peter
#рутовый класс, 100 Мбит
/sbin/tc qdisc add dev eth0 root handle 1 htb default 99
/sbin/tc class add dev eth0 parent 1: classid 1:3 htb rate 100Mbit
#класс для 12 марки, от 2 до 100 мегабит, приоритет 5
/sbin/tc class add dev ppp0 parent 1:3 classid 1:10 htb rate 2Mbit ceil 100Mbit prio 5
/sbin/tc qdisc add dev ppp0 parent 1:10 handle 10 sfq perturb 10
/sbin/tc filter add dev ppp0 parent 1:0 protocol ip prio 5 handle 12 fw classid 1:10
#класс для всего остального, от 1 до 100 мегабит, приоритет 1
/sbin/tc class add dev ppp0 parent 1:3 classid 1:99 htb rate 1Mbit ceil 100Mbit prio 1
/sbin/tc qdisc add dev ppp0 parent 1:99 handle 99 sfq perturb 10
Комментарий от: buzz
Спасибо.
Но что-то не работает.
У меня вариант бридж.
2 интерфэйса eth0 и eth1
3 интерфэйс mybridge.
применил такие правила.
iptables -A PREROUTING -t mangle -m opendpi –bittorrent -j MARK –set-mark 12
/sbin/tc qdisc add dev mybridge root handle 1 htb default 99
/sbin/tc class add dev mybridge parent 1: classid 1:3 htb rate 100Mbit
#класс для 12 марки, от 2 до 100 мегабит, приоритет 5
/sbin/tc class add dev mybridge parent 1:3 classid 1:10 htb rate 2Mbit ceil 100Mbit prio 5
/sbin/tc qdisc add dev mybridge parent 1:10 handle 10 sfq perturb 10
/sbin/tc filter add dev mybridge parent 1:0 protocol ip prio 5 handle 12 fw classid 1:10
#класс для всего остального, от 1 до 100 мегабит, приоритет 1
/sbin/tc class add dev mybridge parent 1:3 classid 1:99 htb rate 1Mbit ceil 100Mbit prio 1
/sbin/tc qdisc add dev mybridge parent 1:99 handle 99 sfq perturb 10
Как можно проверить, проходит ли маркировка..?
а tc работает с интерфэйсом mybridge ?
Комментарий от: Peter
С бриджом должен работать. Чтобы проверить работает ли, можно посмотреть статистику tc: tc -s -d class show dev mybridge
, сколько пакетов попадает в тот или иной класс.
Комментарий от: buzz
Что-то считает…
root@assasin:~# tc -s -d class show dev mybridge
class htb 1:99 parent 1:3 leaf 99: prio 1 quantum 12500 rate 1000Kbit ceil 100000Kbit burst 1600b/8 mpu 0b overhead 0b cburst 1600b/8 mpu 0b overhead 0b level 0
Sent 127069 bytes 696 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 690 borrowed: 4 giants: 0
tokens: 181000 ctokens: 1813
class htb 1:10 parent 1:3 leaf 10: prio 5 quantum 25000 rate 2000Kbit ceil 100000Kbit burst 1600b/8 mpu 0b overhead 0b cburst 1600b/8 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 100000 ctokens: 2000
class htb 1:3 root rate 100000Kbit ceil 100000Kbit burst 1600b/8 mpu 0b overhead 0b cburst 1600b/8 mpu 0b overhead 0b level 7
Sent 127069 bytes 696 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 4 borrowed: 0 giants: 0
tokens: 1813 ctokens: 1813
Но, вот class htb 1:10 , который и должен резать p2p, ничего не посчитал.
Значит mark не проходит? я по торренту сейчас качаю и раздаю.
Как его глянуть?
Комментарий от: Peter
Еще можно посмотреть iptables -L -nv
на предмет того, попадают ли вообще пакеты под match.
Комментарий от: buzz
iptables -L -nv
Chain INPUT (policy ACCEPT 2314 packets, 202K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 708K packets, 810M bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1105 packets, 169K bytes)
pkts bytes target prot opt in out source destination
Судя по всему, и тут что-то считает…
A вот я не совсем понимаю, upload и download , он оба направления режет или как..?
Комментарий от: Peter
Поправка: iptables -t mangle -L -nv
. Забыл указать таблицу.
По идее должен резать оба направления.
Комментарий от: buzz
Что-то совсем всё печально.
Вроде как считает, что надо.
iptables -t mangle -L -nv
Chain PREROUTING (policy ACCEPT 54671 packets, 115M bytes)
pkts bytes target prot opt in out source destination
54205 115M MARK all – * * 0.0.0.0/0 0.0.0.0/0 protocol HTTP MARK xset 0xc/0xffffffff
iptables -A PREROUTING -t mangle -m opendpi –http -j MARK –set-mark 12
/sbin/tc qdisc add dev mybridge root handle 1 htb default 99
/sbin/tc class add dev mybridge parent 1: classid 1:3 htb rate 100Mbit
/sbin/tc class add dev mybridge parent 1:3 classid 1:10 htb rate 1Mbit ceil 10Mbit prio 5
/sbin/tc qdisc add dev mybridge parent 1:10 handle 10 sfq perturb 10
/sbin/tc filter add dev mybridge parent 1:0 protocol ip prio 5 handle 12 fw classid 1:10
И вот прокачиваю по http без ограничений.
Я так понимаю, должен то быть урезан в 1 мб?
( По хттп начал тестить, так как с меткой –bittorrent , по торрентом так же ничего не резалось. )
Комментарий от: buzz
Немного продвинулся.
не получается резать, если изпользуешь интерфэйс бридж, нужно реальные.
И режет только входящий поток.
так что заработало в такой конфигуреции.
iptables -A PREROUTING -t mangle -m opendpi –http -j MARK –set-mark 12
/sbin/tc qdisc add dev eth0 root handle 1 htb default 99
/sbin/tc class add dev eth0 parent 1: classid 1:3 htb rate 100Mbit
/sbin/tc class add dev eth0 parent 1:3 classid 1:10 htb rate 1Mbit ceil 2Mbit prio 5
/sbin/tc qdisc add dev eth0 parent 1:10 handle 10 sfq perturb 10
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 12 fw classid 1:10
/sbin/tc qdisc add dev eth1 root handle 1 htb default 99
/sbin/tc class add dev eth1 parent 1: classid 1:3 htb rate 100Mbit
/sbin/tc class add dev eth1 parent 1:3 classid 1:10 htb rate 1Mbit ceil 2Mbit prio 5
/sbin/tc qdisc add dev eth1 parent 1:10 handle 10 sfq perturb 10
/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 5 handle 12 fw classid 1:10
В данном варианте по http, скорость обрезается до 2мбит
Меняю маркировку с –http на –bittorrent, но торрент не режеться.
Проверял на дефолтной установке utorrent.
Такая же ситуация, если ставить –directconnect
Судя по всему, он не может пометить этот трафик.
iptables -t mangle -L -nv
Chain PREROUTING (policy ACCEPT 655K packets, 886M bytes)
pkts bytes target prot opt in out source destination
153K 51M MARK all – * * 0.0.0.0/0 0.0.0.0/0 protocol DirectConnect protocol Bittorrent MARK xset 0xc/0xffffffff
Как видно всего передано 886М , промаркировано 51
Он так плохо разбирает трафик?
Комментарий от: Peter
Видимо с маркировкой торрент-пакетов у него все плохо. Постараюсь потестировать на досуге.
непиараради
вот тут описанно
http://paranoidchaos.livejournal.com/4819.html
Комментарий от: solmedas
Но даже он не будет резать шифрованный торрент трафик, да?
Hi! Is it Okay if I ask anything kind of off topic? I’m trying to view this page on my iphone nonetheless it will not show up properly, do you may have any options? Thanks in advance!
I don’t even know how I ended up here, but I thought this post was good. Cheers!
Комментарий от: tufex
При загрузке iptables появляется сообщение iptables: match “opendpi” has version “libxtables.so.5″, but “libxtables.so.2″ is required. И правила не работают. Iptables 1.4.10 ядро 32
Комментарий от: Виктор
Погонял opendpi, картина следующая.
Arch linux - ведро 3.1, opendpi собирал с вашим патчем (без проблем), метки нормально ставятся только в OUTPUT таблици filter, в -A PREROUTING -t mangle метки толком не работают.
Debian - ведро 2.32, opendpi без патча на ядро, метки везде прекрасно выставляются.
Вывод, патч для новых ядер требует дороботки.
Комментарий от: Виктор
Хм… я похоже поспешил с выводами, opendpi в оригинале (на 2.6.32 ядре), только 10% битторрент траффа метит. Хотя флеш, quicktime и прочее исправно метит. Что-то мне подсказывает, что эти 90% трафа в зашифрованном виде идут.
Комментарий от: Ilya
Виктор писал, что opendpi заточен на 2.6.32 ядре.
Как будет себя вести классификатор с ядрами версии >3.0.0 ?
Комментарий от: Ilya
Извините, невозможно отправить email.
Возможная причина: Функция PHP mail() может быть отключена на сервере.
Идет загрузка формы...
Комментарий от: igrek
А вот примера конфигурации нехватает =\