Най-често срещания алгоритъм за разпределяне на трафик между потребители е следния:
1. разделяне на трафика на входящ и изходящ;
2. разделяне на трафика на български и международен чрез подходящо маркиране на пакетите (вж. "Разпределяне на трафик от два (или повече) интернет доставчика");
3. разделяне на трафика за всеки потребител чрез повторно маркиране на пакетите за всеки вид трафик;
Освен това обикновено се налага да се прави контрол на достъпа на потребителите - чрез използването на iptables правила в PREROUTING или FORWARD веригите.
Проблемът при повечето от така реализирани алгоритми е значителното натоварване на сървъра поради ниската ефективност на набора от използваните правила в iptables и tc.
..........................................................
Малката ефективност на този метод е породена от линейното (последователното) обхождане на тези правила за всеки пакет. По този начин всеки пакет минава през около 260 правила, при това само в тези вериги! Още по-лошият вариант, при който няма разделян на изходящ/входящ трафик, броят на правилата обходени от всеки пакет е над 510!
Причината да се ползва IPMARK или IPCLASSIFY e:
- - IPMARK: маркира пакетите, като за стойността на маркера използва стойността на самото IP;
- IPMARK: приема като параметри 3 неща - IP-то по което ще маркираме и 2 параметъра за управление на получения MARK;
- IPMARK: IP-то по което ше маркираме се взима директно от пакета и в зависимост от това дали --addr параметъра е src или dst, се взима съответно src
IP-то или dst IP-то;
- IPMARK: 2-та параметъра за управление на получения MARK реализират побитово И и ИЛИ върху стойността на IP адреса;
Огромното предимство се състой в това, че не се маркира всеки пакет един по един и след това да се задават n на брой филтри в htb-то. IPCLASSIFY е разбработка на VladSun и разликата спрямо IPMARK се състой в това, че не е нужно да се задава филтър, а самият маркиран пакет знае към кой клас се отнася.
Процедурата по пачването на ядрото е както следва:
1. Сваляне на необходимите ни пакети:
2. Копираме свалените пакети в /usr/src и ги дезархивираме
3. Дезархивираме и инсталираме ipset, т.е.
- Код за потвърждение: Избери целия код
[debian ~]#cd /usr/src
[debian src]# tar jxvf ipset-XXXXX.tar.bz2
[debian src]# cd ipset-XXXXX
[debian ipset-XXXXX]# make install
4. Сваляме сорса на ядрото, което искаме да компилираме (в моят случай 2.6.21) и го разархивираме:
- Код за потвърждение: Избери целия код
[gaara@debian root]$ su
Password:
[debian ~]# apt-get install linux-source-2.6.21
[debian ~]# cd /usr/src/
[debian src]# tar jxvf linux-source-2.6.21.tar.bz2
5. Копираме IPCLASSIFY в patch-o-matic-ng-20070921/patchlets/ и премахваме iptables
- Код за потвърждение: Избери целия код
[debian src]# cp -r IPCLASSIFY/ patch-o-matic-ng-20070921/patchlets/
[debian src]# apt-get remove iptables
6. Поради факта, че netfilter отказва да включи IPMARK в официалната си версия, трябва да свалим и неофициалните пачове, т.е.
- Код за потвърждение: Избери целия код
[debian src]# cd patch-o-matic-ng
[debian patch-o-matic-ng]# export KERNEL_DIR=/usr/src/linux-source-2.6.21
[debian patch-o-matic-ng]# export IPTABLES_DIR=/usr/src/iptables-1.3.8
[debian patch-o-matic-ng]# ./runme --download
7. Прилагаме пачовете, като изпълним:
- Код за потвърждение: Избери целия код
[debian patch-o-matic-ng]# ./runme IPMARK
[debian patch-o-matic-ng]# ./runme IPCLASSIFY
[debian patch-o-matic-ng]# ./runme set
[debian patch-o-matic-ng]# ./runme ipp2p
Отговаряме с "y" или натискаме клавиша "Enter".
8. Задаваме на .IPCLASSIFY-test и .IPMARK-test да са изпълними, които се намират в iptables-1.3.8/extensions/
- Код за потвърждение: Избери целия код
[debian src]# cd iptables-1.3.8
[debian iptables-1.3.8]# chmod +x extensions/.IPMARK-test
[debian iptables-1.3.8]# chmod +x extensions/.IPCLASSIFY-test
9. Инсталираме iptables по следният начин:
- Код за потвърждение: Избери целия код
[debian iptables-1.3.8]# make KERNEL_DIR=/usr/src/linux-source-2.6.21
[debian iptables-1.3.8]# make install KERNEL_DIR=/usr/src/linux-source-2.6.21
10. Компилираме си ядрото, следвайки тази статия, като опциите, които трябва да включиме са (пътя до тях е Networking-> Networking options-> Network packet filtering framework (Netfilter)-> IP: Netfilter Configuration):
- Код за потвърждение: Избери целия код
<M> IPMARK target support
<M> IP set support
(256) Maximum number of IP sets
(1024) Hash size for bindings of IP sets
<M> ipmap set support
<M> macipmap set support
<M> portmap set support
<M> iphash set support
<M> nethash set support
<M> ipporthash set support
<M> iptree set support
<M> iptreemap set support
<M> set match support
<M> SET target support
<M> IPP2P match support
<M> IPCLASSIFY target support
Честито ново ядро с поддръжка на IPMARK, IPCLASSIFY, IPP2P и IPSET