от Вальо(30-01-2007)

рейтинг (7)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Статията има за цел да Ви покаже едно от решенията за ограничаване на трафика генериран от peer-to-peer (p2p).Най удачния начин за това е като ползваме l7-filter и ipp2p.

А каво е p2p (peer-to-peer):

Peer to Peer (P2P) е термин, описващ технология, която изгражда мрежа от потребители, които свободно могат да разменят помежду си файлове без нуждата от сървър, който да играе ролята на посредник. Наместо един потребител да трябва да качи дадена информация на сървър, а всички останали да я изтеглят оттам, при P2P мрежите, трансферът се осъществява директно от хард диска на потребителя, към всички, които са заинтересувани от този файл. Това става с помощта на програма, наричана P2P или file sharing (анг. споделяне на файлове) клиент. Стартирайки тази програма на компютъра си, потребителят определя част от съдържанието на своя хард диск като "споделено", т.е. достъпно за всички останали, използващи съответния клиент.
Малко повече за iptables:
IPTABLES е firewall с невероятни възможности.. С него можете да филтрирате пакети или да маскирате ip адреси или портове(ip masquerade, NAT, PAT) и тн.. За да извършва филтриране на пакети или маскиране iptables се води по така наречените вериги(chains)- логически групиран списък от правила. Всяко правило от веригата е тест, на който ip хедърът се подлага. Веригите съдържат правила започващи от едно. Можете да задавате правилата или чрез спецификация, или чрез номер. Спецификацията на правило( rule specification ) е правилото или ( наборът от правила ), на което пакетът трябва да отговаря - тестът. Едно и също основно правило може да съществува в няколко вериги, така че аргументът верига(вижте по-долу) обикновено е задължителен. Ако целта на веригата е една от следните: ACCEPT (пропускане на пакета), DROP (отхвърляне на пакета), REJECT (отхвърляне на пакета и връщане на съобщение за грешка) или MASQUERADE (маскиране на пакета), тази цел завършва веригата, така че в тази верига няма да бъдат изпълнявани повече правила.
Що е l7-filter:
L7-филтъра е класификатор за линукския Netfilter който идентифицира пакети на база на данните от апликейшън леъра (оси модела). Той може да класифицира пакети като Kazaa, HTTP, Jabber, Citrix, Bittorrent, FTP, Gnucleus, eDonkey2000, и т.н. без значение от порта. Той Допълва съществуващи класификатори които са фиксирани по IP адреси, номер на порт и т.н.


За какво служи IPP2P и що за животно е:
Целта на IPP2P е да идентифицира peer-към-peer(p2p) данните в IP трафика. За тази цел е разширена iptables/netfilter архитектурата чрез нов сходен модул. В следствие на което IPP2P се интегрира лесно в Линукските защитни стени (Firewall) и функционалността му може да се използва чрез задаване на подходящи правила за филтриране.


Let's go...


Първото нещо което трябва да направим е да де-инсталираме iptables. Това можем да направим по следният начин:
removepkg iptables или removepkg /var/log/packages/iptables*



Следва да свалим пакетите които ще ни трябват, а те са:
kernel-source-2.4.3.33 - cd1
iptables-1.3.7 - тук
netfilter-layer7-v2.9 - тук
l7-protocols-2007-01-08 - тук
ipp2p-0.8.1_rc1 - тук

Извлечаме архивите със следните команди:

installpkg kernel-source-2.4.33.3-noarch-1.tgz
ln -s /usr/src/iptables-1.3.7 /usr/src/iptables
tar -xvzf l7-protocols-2007-01-08.tar.gz -C /usr/src/
tar -xvzf netfilter-layer7-v2.9.tar.gz -C /usr/src/
tar -xvzf ipp2p-0.8.1_rc1.tar.gz -C /usr/src/

Компилиране и пачване на ядрото:

Що е то ядрото и какво е компилиране ? Има хора, които това не е ясно, така че ще обясня тук.
Ядрото е общото между всички дистрибуции на Linux - това е нещо, което зависи от Линус Торвалдс. Вие можете да се сдобиете безплатно с него. Обикновенно го получавате в неговия изходен код (така, както са го писали Линус Торвалдс, Алан Кокс и др.), но, за да се зареди операционната система, трябва ядрото да е в машинен код. Т.е. трябва на превърнете ядрото от изходен в машинен код, който процес се нарича компилиране. Това обаче позволява да компилирате само тези тези части, които са ви нужни. Например, вие може би не се нуждаете от поддръжка на SCSI адаптери и устройства или на поддръжка на повече от 1GB RAM. Благодарение вие можете да настроите така ядрото, че то да е най-оптимизирано за вашата конфигурация. Когато инсталирате някаква дистрибуция на Linux, вие получавате компилирано ядро, което обаче е направено така, че да поддържа почти всичко, което го прави доста неоптимизирано. Това предполага, че бихте искали да го прекомпилирате.


Конфигурираме ядрото:
cd /usr/src/linux
patch -p1 make menuconfig

След това избираме следният модул:

Networking options --->
IP: Netfilter Configuration --->
Layer 7 match support (EXPERIMENTAL) (NEW)
[*] Layer 7 debugging output (EXPERIMENTAL)

Запазваме конфигурацията на ядрото...

Компилация на ядрото и модулите, инсталиране на модулите

Проверява за зависимости
make dep
make clean


Компилира самото ядро като bzip имидж. Ще го намерите като файл bzImage в директорията 'arch/i386/boot'.
make bzImage

Компилира модулите.
make modules

Инсталира модулите
make modules_install


Знаем, че по начало lilo търси и зарежда /boot/vmlinuz. Можем да преименуваме старото ядро:
mv /boot/vmlinuz /boot/vmlinuz.old
mv /boot/System.map /boot/System.map.old


Да копираме новото:

cp arch/i386/boot/bzImage /boot/vmlinuz
cp System.map /boot/System.map

Да добавим в /etc/lilo.conf опция за зареждане на старото ядро по избор, в случай че не тръгне новото:
image=/boot/vmlinuz.old
Името на файла-ядро

label=OldLinux
Произволно наименование на ядрото

root = /dev/hda1
root-дяла на вашата Linux-инсталация

И да изпълним командата:
lilo

Инсталираме iptables-1.3.7
cd /usr/src/iptables
patch -p1 chmod 755 extensions/.layer7-test
make KERNELDIR=/usr/src/linux
make KERNELDIR=/usr/src/linux install

Копираме протокола:

cp /usr/src/l7-protocols-2007-01-08 /etc/l7-protocols



Инсталираме pp2p:

cd /usr/src/ipp2p-0.8.1_rc1
pico Makefile


кадето е реда:
IPTABLES_SRC = /usr/src/iptables-1.2.9

го заменяме по следният начин:
IPTABLES_SRC = /usr/src/linux-2.4.33.3/include/config/ip/nf

и пишем:

make
cp libipt_ipp2p.so /usr/local/lib/iptables/
insmod ipt_ipp2p.o
depmod -a



На края можем да проверим дали всичко е миналко като хората по следният начин:
iptables -m layer7 --help
iptables -m ipp2p --help


Ето и един примерен вариант за ползване:

# kbps = KByte/sek
# Ограничаване на скоростта на канала ----------------------------------------------------------------
$ipr qdisc add dev eth1 root handle 1: htb default 2
$ipr qdisc add dev eth0 root handle 1: htb default 2
$ipr class add dev eth1 parent 1: classid 1:1 htb rate 200kbps burst 250k
$ipr class add dev eth0 parent 1: classid 1:1 htb rate 100kbps burst 250k
#unclassified--------------------------------------------------------------------------------
$ipr class add dev eth1 parent 1:1 classid 1:2 htb rate 20kbps ceil 30kbps burst 1k prio 7
$ipr class add dev eth0 parent 1:1 classid 1:2 htb rate 10kbps ceil 20kbps burst 1k prio 7
$ipr qdisc add dev eth1 parent 1:2 handle 2: esfq perturb 10
$ipr qdisc add dev eth0 parent 1:2 handle 2: esfq perturb 10
#web------------------------------------------------------------------------------------------
$ipt -t mangle -A POSTROUTING -m layer7 --l7proto http -j MARK --set-mark 3
$ipr class add dev eth1 parent 1:1 classid 1:3 htb rate 150kbps ceil 200kbps burst 150k prio 2
$ipr class add dev eth0 parent 1:1 classid 1:3 htb rate 70kbps ceil 100kbps burst 150k prio 2
$ipr qdisc add dev eth1 parent 1:3 handle 3: esfq perturb 10 hash dst
$ipr qdisc add dev eth0 parent 1:3 handle 3: esfq perturb 10
$ipr filter add dev eth1 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
$ipr filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
#p2p----------------------------------------------------------------------------------------
$ipt -t mangle -A POSTROUTING -m layer7 --l7proto bittorrent -j MARK --set-mark 4
$ipt -t mangle -A POSTROUTING -m layer7 --l7proto directconnect -j MARK --set-mark 4
$ipr class add dev eth1 parent 1:1 classid 1:4 htb rate 10kbps ceil 20kbps burst 1k prio 3
$ipr class add dev eth0 parent 1:1 classid 1:4 htb rate 5kbps ceil 10kbps burst 1k prio 3
$ipr qdisc add dev eth1 parent 1:4 handle 4: esfq perturb 10
$ipr qdisc add dev eth0 parent 1:4 handle 4: esfq perturb 10
$ipr filter add dev eth1 protocol ip parent 1:0 prio 1 handle 4 fw flowid 1:4
$ipr filter add dev eth0 protocol ip parent 1:0 prio 1 handle 4 fw flowid 1:4
#ADMINxxx.xxx.xxx.gw------------------------------------------------------------------------
$ipt -t mangle -A OUTPUT -d xxx.xxx.xxx.adm1 -j MARK --set-mark 5
$ipt -t mangle -A OUTPUT -d xxx.xxx.xxx.adm2 -j MARK --set-mark 5
$ipr class add dev eth0 parent 1:1 classid 1:5 htb rate 30kbps burst 15k prio 1
$ipr qdisc add dev eth0 parent 1:5 handle 5: sfq perturb 100
$ipr filter add dev eth0 protocol ip parent 1:0 prio 1 handle 5 fw flowid 1:5
#-----------------------------------------------------------------------------




Е просто не ми е останало време за да напиша всичко и да я направя читава статията, но надявам се тоз път да сте доволни.... Първоначално статията имаше за цел да да покаже на тези които си имат поне малка представа как се работи с Гну/Линукс, но явно трябва да се пише като на първокласници... Е надявам се този път да ви хареса.... ако ли пък не то здраве да е!


<< Инсталация и настройка на Trac и SVN | Как да компилираме Фалкон поддръжка в MySQL 5 >>