Поиск и обработка P2P трафика
Пиринговая сеть (P2P от англ. peer-to-peer – равный к равному) – это компьютерная сеть, основанная на равноправии участников. В такой сети отсутствуют выделенные серверы, а каждый узел является как сервером так и клиентом одновременно. Такая организация сети позволяет сохранить работоспособность при любом количестве и любом сочетании доступных узлов.
Иногда приходится отфильтровать и блокировать трафик пиринговых сетей, таких например как BitTorrent и eDonkey. Я думаю это головная боль не одного системного администратора так как в большинстве случаев заблокировать его не так то просто как может показаться на первый взгляд. Зачастую этот трафик не привязывается к определенному порту, поэтому появляется необходимость искать более интеллектуальные способы определения трафика нежели просто блокирование одного порта на фаерволе. Здесь описан модуль к iptables который автоматически обнаруживает сигнатуру пирингового трафика, который в дальнейшем можно блокировать. Модуль называется ipp2p
Ipp2p
iptables -i eth0 -A FORWARD -m ipp2p --ipp2p -j LOG --log-level=6 --log-prefix “p2p_net: ” "ipp2p: " iptables -i eth0 -A FORWARD -m ipp2p --ipp2p -j DROP iptables -i eth0 -A FORWARD -p udp -m ipp2p --bit -j DROP iptables -i eth0 -A FORWARD -p tcp -m ipp2p --edk -j DROP
Перейду ближе к установке Что имеется: Операционная система: Ubuntu 10.04 server LTS (Ядро версии 2.6.32.24) Фаервол: iptables v 1.4.6 (По умолчанию стоит фаервол версии 1.4.4, я обновил его используя исходники с официального сайта) К сожалению, исходный код модуля, уже давно не поддерживается и те кто будут пытаться установить код на новых версиях ядра (более 2.6.22) получат нижеследующую ошибку:
router:~# /ipp2p-0.8.2$ make Makefile:36: You need to install iptables sources and maybe set IPTABLES_SRC make -C /lib/modules/2.6.26-2-686/build SUBDIRS=/root/ipp2p-0.8.2 modules make[1]: Entering directory `/usr/src/linux' CC [M] /root/ipp2p-0.8.2/ipt_ipp2p.o /usr/src/ipp2p-0.8.2/ipt_ipp2p.c: In function 'match': /usr/src/ipp2p-0.8.2/ipt_ipp2p.c:751: error: 'const struct sk_buff' has no member named 'nh' /usr/src/ipp2p-0.8.2/ipt_ipp2p.c: At top level: /usr/src/ipp2p-0.8.2/ipt_ipp2p.c:871: warning: initialization from incompatible pointer type /usr/src/ipp2p-0.8.2/ipt_ipp2p.c:874: warning: initialization from incompatible pointer type /usr/src/ipp2p-0.8.2/ipt_ipp2p.c: In function 'init': /usr/src/ipp2p-0.8.2/ipt_ipp2p.c:883: error: implicit declaration of function 'ipt_register_match' /usr/src/ipp2p-0.8.2/ipt_ipp2p.c: In function 'fini': /usr/src/ipp2p-0.8.2/ipt_ipp2p.c:888: error: implicit declaration of function 'ipt_unregister_match' make[2]: *** [/usr/src/ipp2p-0.8.2/ipt_ipp2p.o] Error 1
Проблема заключается в больших изменениях в ядре ABI. И к счастью, эти изменения не так обширны, чтобы нельзя было изменить ipp2p, так чтобы он не мог работать на новых версиях ядра. Существует патченная версия для новых ядер. Скачать можно отсюда
Установка
Необходимо скачать исходные коды ядра, заголовочные файлы и исходные коды iptables`а. Как вы их будете получать оставляю за вашей совестью, главное, чтобы они были и были рабочими.
tar zxfv ipp2p-0.8.2+2.6.22.tar.gz cd ipp2p-0.8.2-patch
Здесь необходимо подправить файл Makefile, где необходимо указать пути к исходным файлам ядра и фаервола. Чтобы избежать ошибки (kernel: ip_tables: ipp2p match: invalid size 16 != 8) которая возникает после установки модуля необходимо в файле ipt_ipp2p.c закоментировать строки с 838 по 841:
struct ipp2p_match_info { long int dunno_what_this_is_for; long int i_also_dunno_what_this_is_for; };
и заменить строку 861:
.matchsize = sizeof(struct ipp2p_match_info),
на
.matchsize = XT_ALIGN(sizeof(struct ipt_p2p_info)),
На этом изменения заканчиваются.
make cp ipt_ipp2p.ko /lib/modules/`uname -r`/kernel/net/ipv4/ cp libipt_ipp2p.so /lib/xtables/ depmod -a modprobe ipt_ipp2p
Модуль загружен! Можно работать с P2P трафиком.