Разпределяне
на трафик от два (или повече) интернет
доставчика.
Отделяне
на локален, български и международен
трафик. Ограничаване на скорост.
Заб.:Авторът
е напълно наясно, че (може да) съществуват
неточности и грешки. Показаното тук е
само с учебна цел! Преди да направите
каквото и да е архивирайте важните си
данни (а защо не всичко?) ! Превода на
английските термини може да не е съвсем
точен. За контакти: 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