от Uvigii(18-08-2004)

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

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

Разпределяне на трафик от два (или повече) интернет доставчика.


Отделяне на локален, български и международен трафик. Ограничаване на скорост.


Заб.:Авторът е напълно наясно, че (може да) съществуват неточности и грешки. Показаното тук е само с учебна цел! Преди да направите каквото и да е архивирайте важните си данни (а защо не всичко?) ! Превода на английските термини може да не е съвсем точен. За контакти: uvigii@mail.bg , най актуалната версия на:http://uvigii.jeckyll.net/pub/doc/lb/LB.html


Специални благодарности на Kennedy за неоценимата помощ, както и за изготвянето на графиките към документа!

1.На кого може да е полезен този документ? Забележки.

2.Разпределяне на трафик от два интернет доставчика.

2.1 Подготовка на ядрото

2.2 Проучване

2.3 Рутинг таблици

3.Маркиране на пакети пристигащи от локални, български и международни източнци.

3.1 Предварително маркирани от ISP пакети

3.2 Маркиране на пакети

4.Ограничаване на скорост.

5.Заключение. Връзки към други документи.


1. На кого може да е полезен този документ? Забележки.

Имаме си домашен компютър който изпълнява ролята на рутер, свързани сме на договорена скорост към глобалната мрежа посредством доставчик на интернет услуги (ISP).

Вариант A: По една или друга причина нашия ISP не може да ни предложи по-висока скорост на връзката, а ние много се нуждаем от това. Искаме да използваме услугите на втори ISP, без при това да се откажем от първия.

Вариант Б: Всяко пропадане на свързаността ни с интернет ни се струва неприемливо. За преодоляването на този проблем сме решили да използваме връзки едновременно към два ISP. Дори едната връзка с интернет да отпадне поради технически проблем, целият трафик би се пренасочвал през другата. Ако връзките и към двата ISP функционират искаме те да се натоварват пропорционално на техните капацитети.

Вариант В: Конкурентен доставчик предлага услуги които перфектно допълват услугите които ползваме в момента. Ние имаме добър международен трафик, но българския и “локалния” – куцат. Напротив алтернативния доставчик на “кеширани услуги” има добра база от аудио-визуални файлчета които е готов да сподели на прилична скорост. Ние не искаме да се лишим от качествен достъп до “мрежата” , но същевременно ни блазни идеята да гледаме някой и друг филм.

Вариант Г: Други или комбинация от горните.

Забележки: С метода описан по нататък е невъзможно! да се постигне перфектно балансиране на натоварването при “multipath route” тъй като то се извършва за връзка (не за пакет), но при достатъчно голям брой паралелни връзки се постига добра практическа точност.


2. Разпределяне на трафик от два интернет доставчика.


2.1 Подготовка на ядрото

Необходимо е да изтеглим кръпка за ядрото което ще използваме, след което да я приложим.


root@uvigii:/usr/src/linux# patch -p1 < routes-2.6.7-10.diff
трябва да изберем :

[*] TCP/IP networking

[*] IP: advanced router

[*] IP: equal cost multipath

в конфигурацията на ядрото, да компилираме и инсталираме.


2.2 Проучване

Трябва да знаем какво точно предлага всеки един от доставчиците, да изготвим списък с мрежовите адресите на интерфейсите свързани към тях. Адресите (IP) на локалните сървъри, адресите на мрежите и мрежовите маски на локални и български ISP. Трябва също да изясним дали локалните за ISP адреси са достъпни от външни за него мрежи.


Пример(фиг.1):




eth0 inet addr:192.168.168.17 Bcast:192.168.168.31 Mask:255.255.255.240

eth2 inet addr:212.104.120.230 Bcast:212.104.230.255 Mask:255.255.255.0

wlan0 inet addr:212.116.159.54 Bcast:212.116.159.63 Mask:255.255.255.224


eth0 е свързан към ЛАН

eth2 е свързан към ISP1 80 kbps + 512 kbps - локален

wlan0 е свързан към ISP0 512 kbps – локален , от които 256 kbps BG и 32 kbps друг,


w.a.r.e – адресът на локания сървър на ISP1

m.i.r.r – адресът на локания сървър на ISP0


Таз стъпка не е задължителна но е доста улеснителна. Създаваме директория /etc/lb/ (или както на вас ви харесва) след което създаваме няколко конфигурационни файла съдържащи адресите на мрежите и хостовете които сме получили при проучването. Виж точка 5.

lo_net0.conf – локалните за ISP0 мрежи

lo_net1.conf – локалните за ISP1 мрежи

bg_net1.conf – българските за ISP1 мрежи (които и според ISP0 би трябвало да са същите)

all_net.conf – всички останали мрежи


2.3 Рутинг таблици

Ще ни бъде необходимо да преценим всички възможни ситуации които ще възникнат по време на работа и да ги обмислим внимателно!

В Линукс могат да съществуват няколко рутинг таблици (man ip). Целта ни е така да ги подредим и приоритезираме, че да получим желания от нас резултат (А,Б или В). Изхождаме от ситуация в която са конфигурирани интерфейсите, а шлюза по подразбиране (default gateway) е конфигуриран към единия доставчик. За улеснение използваме следния шел скрипт (в курсив):

#!/bin/bash

#/etc/lb/rc.lb

# This script is done by : Robert Kurjata Sep, 2003.

# feel free to use it in any usefull way

# Modifyed Milan Enev Jul, 2004.

##################

IP=/sbin/ip

PING=/bin/ping

EXTIF0=wlan0

EXTIP0=212.116.159.54

EXTM0=27

EXTGW0=212.116.159.33

EXTIF1=eth2

EXTIP1=212.104.120.230

EXTM1=24

EXTGW1=212.104.120.1


Най напред е необходимо да премахнем “default gateway” в main (50) таблицата, както и старите правила.

echo "removing old rules"

$IP rule del prio 50 table main

$IP rule del prio 201 from $EXTIP0/$EXTM0 table 201

$IP rule del prio 202 from $EXTIP1/$EXTM1 table 202

$IP rule del prio 211 table 211

$IP rule del prio 212 table 212

$IP rule del prio 220 table 220

$IP rule del prio 221 table 221


да изчистим таблиците:

echo "flushing tables"

$IP route flush table 201

$IP route flush table 202

$IP route flush table 211

$IP route flush table 212

$IP route flush table 220

$IP route flush table 221


след което да ги премахнем

echo "removing tables"

$IP route del table 201

$IP route del table 202

$IP route del table 211

$IP route del table 212

$IP route del table 220

$IP route del table 221


при което main таблицата трябва да изглежда по подобен начин:

root@uvigii:~# ip route show table main

192.168.168.16/28 dev eth0 proto kernel scope link src 192.168.168.17

212.116.159.32/27 dev wlan0 proto kernel scope link src 212.116.159.54

212.104.120.0/24 dev eth2 proto kernel scope link src 212.104.120.230

127.0.0.0/8 dev lo scope link

т.е. да съдържа само пътища към мрежите достъпни директно през локалните интерфейси.


Създаваме две(или повече) таблици, по една за всеки интерфейс свързан към ISP. Това се прави тъй като искаме на връзки инициализирани през един интерфейс да бъде отговаряно през същия интерфейс.

$IP rule add prio 201 from $EXTIP0/$EXTM0 table 201

$IP rule add prio 202 from $EXTIP1/$EXTM1 table 202

$IP route add default via $EXTGW0 dev $EXTIF0 src $EXTIP0 proto static table 201

$IP route append prohibit default table 201 metric 1 proto static

$IP route add default via $EXTGW1 dev $EXTIF1 src $EXTIP1 proto static table 202

$IP route append prohibit default table 202 metric 1 proto static


След което създаваме по една таблица за локалния трафик на всеки един от ISP. (Може да разкоментираме реда с ехо и да проверим какво точно се генерира при изпълнението на тази част от скрипта)

$IP rule add prio 211 table 211

for i in $(cat /etc/lb/lo_net0.conf); do

#echo "$IP route add $i via $EXTGW0 dev $EXTIF0 src $EXTIP0 proto static able 211"

ip route add $i via $EXTGW0 dev $EXTIF0 src $EXTIP0 proto static table 211

done


$IP rule add prio 212 table 212

for i in $(cat /etc/lb/lo_net1.conf); do

#echo "$IP route add $i via $EXTGW1 dev $EXTIF1 src $EXTIP1 proto static able 212"

$IP route add $i via $EXTGW1 dev $EXTIF1 src $EXTIP1 proto static table 212

done


Създаваме една таблица която съдържа пътищата към българските мрежи (описани в файла /eth/lb/bg_net1.conf). Това е първата таблица с “multipath” route! За всяка мрежа ще създадем възможност да бъде достъпна през всеки един от интерфейсите. Параметърът weight указва колко пъти да се “ползва този интерфейс” преди да се използва другия(ите). Малко по подробно: Ако се опитаме да достигнем мрежа от описаните по долу (български) рутинг системата ще насочи пакета през единия интерфейс ( в случая EXTIF0), при опит за създаване на втора връзка към хост от тaзи мрежa пакетът ще бъде изпратен през другия интерфейс (EXTIF1). Следващите 5 връзки ще бъдат също през втория доставчик. Съотношението на параметрите weight за първия и втория “route” би трябвало да е същото както съотношението на “bandwidth” на тези мрежи за двaтa ISP. Този подход би могъл да има по-различен резултат от очаквания! По този начин ще се опитаме да балансираме за всяка мрежа поотделно. Може би е по добре да се генерира по едно правило (rule) за всяка мрежа, а “route” да е само 1. При което ще се балансира за БГ мрежите като цяло. Преценката оставям на Вас.

echo "BG Traffic"

$IP rule add prio 220 table 220

for i in $(cat /etc/lb/bg_net1.conf); do

$IP route add $i table 220 proto static \

nexthop via $EXTGW0 dev $EXTIF0 weight 1\

nexthop via $EXTGW1 dev $EXTIF1 weight 6

# echo " $IP route add $i table 220 proto static \

# nexthop via $EXTGW0 dev $EXTIF0 weight 1\

# nexthop via $EXTGW1 dev $EXTIF1 weight 3"

done


Което не е локално или българско най вероятно е международно:

echo "Int. Traffic"

$IP rule add prio 221 table 221

$IP route add default table 221 proto static \

nexthop via $EXTGW0 dev $EXTIF0 weight 3\

nexthop via $EXTGW1 dev $EXTIF1 weight 1

$IP route flush cache

####################################### /etc/lb/rc.lb end ################################

За да “проверяваме” от време на време "gateway" (и връзката към) на всеки ISP можем да ползваме следното не чак толкова елегантно но все пак ефективно решение:

#while : ; do

# $PING -c 1 $EXTGW0 > /dev/null 2>&1

# $PING -c 1 $EXTGW1 > /dev/null 2>&1

# sleep 60

#done

Това ще "гарантира" актуалността на рутинг таблиците т.е. ако някой от интерфейсите "падне" всички пакети (към интернет) ще бъдат насочвани през другия интерфейс. Ако връзката се вдигне: интерфейсът ще се ползва отново.


3.Маркиране на пакети пристигащи от локални, български и международни източници

Необходимо (ако желаем да поставим някакъв лимит на скоростта, който да се доближава до реалността) е да знаем кой пакет по кой интерфейс е пристигнал, също така е необходимо да предположим според ISP този пакет дали пристига от “българска” мрежа или не (доста от доставчиците използват прозрачни прокси сървъри, при което пакета който ние получаваме е генериран на машината на доставчика).

3.1 Предварително маркирани от ISP пакети

В тази ситуация трябва само да определим какво и с каква стойност маркира ISP в хедъра на IP пакетите. И да го използваме за нашите цели.

3.2 Маркиране на пакети

Един от възможните подходи (друг е "man tc filter") е да използваме модула ”mark” на “iptables” (man iptables). Следващите редове са извадка от rc.firewall който ползвам в момента. (сигурен съм, че колегите програмисти биха могли да измислят по елегантно решение)


#!/bin/sh

#/etc/rc.d/rc.firewall

#Milan Enev , Sep, 2002

function mark_src {

for i in $(cat $1); do

#echo " $IPTABLES -t mangle -A $2 -s $i -j MARK --set-mark $3"

$IPTABLES -t mangle -A $2 -s $i -j MARK --set-mark $3

done

$IPTABLES -t mangle -A $2 -m mark --mark $3 -j RETURN

}


function mark_dst {

$IPTABLES -t mangle -N $1_$2

$IPTABLES -t mangle -A $1 -m mark --mark $2 -j $1_$2

for i in `seq $4 $5`; do

$IPTABLES -t mangle -A $1_$2 -d $3$i/32 -j MARK --set-mark $(($2 | $i))

done

}


#INTERFACE SETTINGS

IPTABLES=/usr/sbin/iptables

EXTIF0="wlan0"

EXTIF1="eth2"

INTIF0="eth0"

INTIF1="eth1"


#IP

LONET0_M_F_T="18 30"

LONET0_M="192.168.168."

ALL="0/0"

##Files

#

LO_NET_EXTIF0="/etc/lb/lo_net0.conf"

LO_NET_EXTIF1="/etc/lb/lo_net1.conf"

BG_NET_EXTIF1="/etc/lb/bg_net1.conf"

ALL_NET="/etc/lb/all_net.conf"


##MARK

LO_MARK_EXTIF0="0x1000"

INT_MARK_EXTIF0="0x1200"

LO_MARK_EXTIF1="0x2000"

BG_MARK_EXTIF1="0x2100"

INT_MARK_EXTIF1="0x2200"

С битове от 0-7 се маркират локалните (-d) машини (достатъчно за клас “C” мрежа); с бит 8 и 9 се маркира дали пакета е с локален - 00, български - 01 или с международен - 10 произход; с битове 12 и 13 се маркира интерфейса по който пристига пакета (-i). Например пакет пристигащ от ISP1 (0x2000) от бългрски източник (0x0100) би трябвало да се маркира с (0x2000 OR 0x0100) т.е. с 0x2100.


$IPTABLES -t mangle -N MARK_0_S

$IPTABLES -t mangle -N MARK_0_D

$IPTABLES -t mangle -N MARK_1_S

$IPTABLES -t mangle -N MARK_1_D

По една верига за входящите пакети на всеки интерфейс свързан към ISP, по една верига за изходящите пакети на всеки интерфейс свързан към локалната мрежа.


$IPTABLES -t mangle -A PREROUTING -i $EXTIF0 -j MARK_0_S

$IPTABLES -t mangle -A PREROUTING -i $EXTIF1 -j MARK_1_S

В зависимост по кой интерфейс е пристигнал пакета: той се насочва към съответната верига.


$IPTABLES -t mangle -A POSTROUTING -o $INTIF0 -j MARK_0_D

Ако пакета е предназначен за локалната мрежа свързана чрез INTIF0 той ще бъде насочен към MARK_0_D веригата.

# Net;Chain;Mark

Функцията mark_src се извиква със следните параметри: файл с описание на локалните мрежите (и/или хостове); веригата в която да се генерират правилата; стойност на маската с която ще се маркират пакетите попаднали в тази верига. Тя създава правила за маркиране на пристигащите (от ISP) пакети.


mark_src $LO_NET_EXTIF0 MARK_0_S $LO_MARK_EXTIF0

С този ред се генерират правила за маркиране на “локални” за ISP0 пакети.


mark_src $ALL_NET MARK_0_S $INT_MARK_EXTIF0

С този ред се генерират правила за маркиране на всички (не “локални”) за ISP0 пакети.


mark_src $LO_NET_EXTIF1 MARK_1_S $LO_MARK_EXTIF1

С този ред се генерират правила за маркиране на “локални” за ISP1 пакети.


mark_src $BG_NET_EXTIF1 MARK_1_S $BG_MARK_EXTIF1

С този ред се генерират правила за маркиране на за ISP1 пакети пристигащи от български мрежи.


mark_src $ALL_NET MARK_1_S $INT_MARK_EXTIF1

С този ред се генерират правила за маркиране на всички (не “локални” и не “бг”) за ISP0 пакети.


# Chain;Mark;Network_mark;FromIP;ToIP;

Функцията mark_dst се извиква със следните параметри: веригата в която да се генерират правилата; стойност на маската с която ще се маркират пакетите попаднали в тази верига; адрес на локалната мрежа; две числа указващи интервала за генериране на правила(пример от 1 до 10). Тя създава правила за маркиране на излизащите към локалната мрежа пакети. Това става като се приложи логическата операция ИЛИ (OR) към вече маркираните според източник пакети и се добави адреса на получателя като втори байт към стойността с която се маркира. Например пакет пристигащ от ISP1 (0x2000) от бългрски източник (0x0100), отиващ към хост с IP 192.168.168.18 (0x0012) би трябвало да се маркира с (0x2000 OR 0x0100 OR 0x0012) т.е. с 0x2112. 0x0012(hex) = 18 (dec)


mark_dst MARK_0_D $LO_MARK_EXTIF0 $LONET0_M $LONET0_M_F_T

С този ред се генерират правила за маркиране на “локални” за ISP0 пакети, както и техния получател


mark_dst MARK_0_D $INT_MARK_EXTIF0 $LONET0_M $LONET0_M_F_T

С този ред се генерират правила за маркиране на всички (не “локални”) за ISP0 пакети, както и техния получател


mark_dst MARK_0_D $LO_MARK_EXTIF1 $LONET0_M $LONET0_M_F_T

С този ред се генерират правила за маркиране на “локални” за ISP1 пакети, както и техния получател


mark_dst MARK_0_D $BG_MARK_EXTIF1 $LONET0_M $LONET0_M_F_T

С този ред се генерират правила за маркиране на за ISP1 пакети пристигащи от български мрежи, както и техния получател


mark_dst MARK_0_D $INT_MARK_EXTIF1 $LONET0_M $LONET0_M_F_T

С този ред се генерират правила за маркиране на всички (не “локални” и не “бг”) за ISP0 пакети, както и техния получател


echo "-Enabbling SNAT..."

#$IPTABLES -t nat -A POSTROUTING -o $EXTIF0 -j SNAT –to source a.b.c.d

#$IPTABLES -t nat -A POSTROUTING -o $EXTIF1 -j SNAT –to source a.b.e.f

$IPTABLES -t nat -A POSTROUTING -o $EXTIF0 -j MASQUERADE

$IPTABLES -t nat -A POSTROUTING -o $EXTIF1 -j MASQUERADE

NAT (без коментар)


4. Ограничаване на скорост
Може да използваме каквото преценим за полезно в случая. Едно добро решение е HTB. HTB е подходящ в случаите когато от ISP получаваме достъп до интернет с фиксирана скорост. С негова помощ можем да определим “гарантирана” (rate - параметър) за всеки потребител “bandwidth” при което неизползвания от от другите клиенти трафик се разпределя пропорционално (максималната му стойност се дава с параметъра - ceil) между активните потребители. – фиг.2. Разбира се, възможно е да групираме класовете в зависимост от услугите (сървисите: http, ftp ...) които се ползват, от адресите на източниците или получателите на информацията.


Тъй като ние можем да ограничаваме “скоростта” само на изходящия трафик, но не и на входящия логично е да закачим HTB на изхода на интерфейса свързан с локалната мрежа.

1:1 е "root" клас - класът който съдържа всички "подкласове"
1:2 е класът в който ще ограничава скоростта на изпращане (от рутера към ЛАН) на пристигналите от ISP0 пакети.
1:3 е класът в който ще ограничава скоростта на изпращане на пристигналите от ISP1 пакети
1:21 е класът в който ще ограничава скоростта на изпращане на пакети на пристигналите от локалните за ISP0 мрежи.
1:22 е класът в който ще ограничава скоростта на изпращане на пакети на пристигналите от български и международни за ISP0 мрежи.
1:31 е класът в който ще ограничава скоростта на изпращане на пакети на пристигналите от локалните за ISP1 мрежи.
1:32 е класът в който ще ограничава скоростта на изпращане на пакети на пристигналите от "българските" за ISP1 мрежи.
1:33 е класът в който ще ограничава скоростта на изпращане на пакети на пристигналите от "международни" за ISP1 мрежи.

За клас 1:21 са закачени "leaf"(крайни, за които няма закачени други) класовете от 1:4114 до 1:4126 по един за всеки клиент. Те са крайни и в тях се извършва фактическото ограничаване (shape) на скоростта. За всеки потребител (IP) има по 4КБ "гарантиран" "локален" "bandwidth" с възможност да се покачва до 64КБ ако другите клиенти не ползват своя дял в момента.
За клас 1:22 са закачени "leaf" класовете от 1:4626 до 1:4638 по един за всеки клиент. За всеки потребител (IP) има по 1КБ "гарантиран" "бг + международен" "bandwidth" с възможност да се покачва до 10КБ ако другите клиенти не ползват своя дял в момента.
Важно е да се отбележи, че класовете 1:21 и 1:22 в случая! са ограничени! т.е те не могат да "заемат" от сходните/подобни (siblings - които имат общ "parent" клас) т.е. 1:21 от 1:22 и обратно. Това е направено с цел да се отрази максимално точно предлаганите от ISP0 условия (сравни с фиг.1).
За всеки краен (leaf) клас е закачена SFQ опашка (queue). Тя осигурява равноправие на всяка отделна връзка в този клас (не допуска някоя отделна връзка да доминира над другите като изразходва целия "bandwidth" на класа).



За клас 1:31 са закачени "leaf" класовете от 1:8210 до 1:8222 по един за всеки клиент. За всеки потребител (IP) има по 4КБ "гарантиран" "локален" "bandwidth" с възможност да се покачва до 64КБ ако другите клиенти не ползват своя дял в момента.
За клас 1:32 са закачени "leaf" класовете от 1:8466 до 1:8478 по един за всеки клиент. За всеки потребител (IP) има по 4КБ "гарантиран" "бг" "bandwidth" с възможност да се покачва до 32КБ ако другите клиенти не ползват своя дял в момента.
За клас 1:33 са закачени "leaf" класовете от 1:8722 до 1:8734 по един за всеки клиент. За всеки потребител (IP) има по 4КБ "гарантиран" "международен" "bandwidth" с възможност да се покачва до 4КБ ако другите клиенти не ползват своя дял в момента.

Важно е да се отбележи, че клас 1:31 може! да заема! "bandwidth" от класове 1:32 и 1:33 т.е. ако в момента няма "бг" или "международен" или той е с по-малка от максималната (ceil) стойност (фиг.1).






Със следния rc.tc скрипт може да генерираме правила отговарящи на постановката показана на фиг.2. Имената на класовете отговарят на имената на веригите създадени в POSTROUTING веригата на mangle таблицата, както и на стойността с която се маркират попадащите в тях пакети. Веригите в iptables, могат да се ползват за опростена статистика(iptables -t mangle -L -nv) на преминалите пакети, тяхния източник и получател т.е. за всеки потребител (IP) може да видим получените от него "български, локалени и международени" пакети (и байтове) по всеки интерфейс (от всеки ISP по отделно).



#!/bin/sh

#/etc/rc.d/rc.tc

#Milan Enev 2003

# HTB

HTBVER="0.0.1"

INTIF0="eth0"

EXTIF0="wlan0"

EXTIF1="eth2"

TC="/sbin/tc"

LOIP0="192.168.168.17"

CLI0="192.168.168.18"

LONET0_M_F_T="18 30"

LO_MARK_EXTIF0="0x1000"

INT_MARK_EXTIF0="0x1200"

LO_MARK_EXTIF1="0x2000"

BG_MARK_EXTIF1="0x2100"

INT_MARK_EXTIF1="0x2200"

function start {

#

#-=-=-=-=-=-=-=-=- Outgoing Wlan0 -=-=-=-=-=--=-=

$TC qdisc add dev $EXTIF0 root handle 1: htb default 1 r2q 1

$TC class add dev $EXTIF0 parent 1:0 classid 1:1 htb rate 8kbps ceil 2mbps

$TC qdisc add dev $EXTIF0 parent 1:1 sfq perturb 10

#-=-=-=-=-=-=-=-=- End Outgoing Wlan0 -=-=-=-=-=-=

$TC qdisc add dev $INTIF0 root handle 1: htb default 11

# Class ID's

$TC class add dev $INTIF0 parent 1:0 classid 1:1 htb rate 10mbps ceil 10mbps

$TC class add dev $INTIF0 parent 1:1 classid 1:2 htb rate 64kbps ceil 64kbps

$TC class add dev $INTIF0 parent 1:1 classid 1:3 htb rate 64kbps ceil 64kbps

$TC class add dev $INTIF0 parent 1:1 classid 1:4 htb rate 64kbps ceil 64kbps

#

$TC class add dev $INTIF0 parent 1:1 classid 1:11 htb rate 1mbps ceil 6mbps

$TC qdisc add dev eth0 parent 1:11 handle 11: sfq perturb 10

### interface;parent class;classid;rate;ceil;Priority;FromIP;ToIP All in KiloBytes !!!

$TC class add dev $INTIF0 parent 1:2 classid 1:21 htb rate 32kbps ceil 64kbps

shf $INTIF0 1:21 $LO_MARK_EXTIF0 4 64 40 $LONET0_M_F_T

$TC class add dev $INTIF0 parent 1:2 classid 1:22 htb rate 10kbps ceil 10kbps

shf $INTIF0 1:22 $INT_MARK_EXTIF0 1 10 10 $LONET0_M_F_T


$TC class add dev $INTIF0 parent 1:3 classid 1:31 htb rate 32kbps ceil 32kbps

shf $INTIF0 1:31 $LO_MARK_EXTIF1 4 64 40 $LONET0_M_F_T

$TC class add dev $INTIF0 parent 1:3 classid 1:32 htb rate 32kbps ceil 32kbps

shf $INTIF0 1:32 $BG_MARK_EXTIF1 4 32 20 $LONET0_M_F_T

$TC class add dev $INTIF0 parent 1:3 classid 1:33 htb rate 4kbps ceil 4kbps

shf $INTIF0 1:33 $INT_MARK_EXTIF1 1 4 10 $LONET0_M_F_T


}

function stop {


$TC qdisc del dev $INTIF0 root

$TC qdisc del dev $EXTIF0 root

$TC qdisc del dev $EXTIF1 root

}



function shf {

#Shaper,Handle,Filter,

#device;parent;rate;ceil;FromIP;ToIP

#

#

for i in `seq $7 $8`; do

#echo "$TC class add dev $1 parent $2 classid 1:$(($3 | $i)) htb rate $4kbps ceil $5kbps

#$TC qdisc add dev $1 parent 1:$(($3 | $i)) handle $(($3 | $i)) sfq perturb 10

#$TC filter add dev $1 protocol ip parent 1:0 prio $6 handle $(($3 | $i)) fw flowid 1:$(($3 | $i))" >> /etc/lb/log.txt

$TC class add dev $1 parent $2 classid 1:$(($3 | $i)) htb rate $4kbps ceil $5kbps

$TC qdisc add dev $1 parent 1:$(($3 | $i)) handle $(($3 | $i)) sfq perturb 10

$TC filter add dev $1 protocol ip parent 1:0 prio $6 handle $(($3 | $i)) fw flowid 1:$(($3 | $i))

done

}

## interface;parent class;classid;rate;ceil;Priority;FromIP;ToIP All in KiloBytes !!!

stop

start


5.Заключение. Връзки към други документи.
Извинявам се за всички неточности, недуразумения и грешки. Всякакви корекции и предложения са добре дошли.

http://www.ssi.bg/~ja/#routes Static, Alternative Routes, Dead Gateway Detection, NAT
http://www.ssi.bg/~ja/nano.txt HowTo за горното (изключително подробно и полезно!!!)
http://www.lartc.org/howto задължително!
http://ip.ludost.net/ Много полезен сайт! От него можем да си набавим списък с "бг. мрежите".


20040812114000



<< Инсталиране на SuSE Linux 9.1 [Част 3] | Supermount за linux-2.6.x или как да забравим за mount >>