ot alex_c(20-04-2005)

reiting (37)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

Poradi molbata na edin ot posetitelite na foruma reshih da pokazha kak sa realizirani neshtata za ogranichavane na izhodiasht trafik pri men.

Predi da zapochna, iskam da zaiavia, che ne pretendiram za unikalnost ne az sum otkril toplata voda, mozhe da ima i po-elegantni resheniia ot moeto. TSelta mi e da namalia broia na postingite vuv foruma s molbi za pomosht, kakto i da prizova za alternativni resheniia, ot koito shte imat polza vsichki, poseshtavashti tozi sait.

Bih iskal da izkazha blagodarnost na ekipa na ludost.net, otkudeto se svalia aktualna informatsiia za vsichki bulgarski mrezhi (veroiatno sushtestvuvat i drugi iztochnitsi) i bez koiato se obezsmislia tsialata operatsiia.

Ogranichavaneto na izhodiashtiia trafik stava na niakolko etapa

1. Opredeliane na maksimalnite parametri na kanala i mrezhov interfeis, na koito shte se prilagat ogranicheniiata.

Pod maksimalnite parametri na kanala se ima v predvid maksimalnite skorosti za upload (BG i International), razresheni vi ot vashiia dostavchik. Tozi vupros se utochniava s nego, no da priemem, che za sluchaia skorostite sa: BG 2 Mbit/s, INT 512 Kbit/s.

Za opredeliane na mrezhov nterfeis, na koito shte se prilagat ogranicheniiata, triabva da se ima v predvid, che ogranichavaneto na skorostite stava samo za izhodiasht trafik. Triabva da iziasnite koi e interfeisut, ot koito izliza upload trafika. V povecheto sluchai tova e interfeisut, prez koito se svurzvate s dostavchika si (da priemem, che tova e eth0).

2. Opredeliane na algoritum za ogranichavane na trafika

Kato algoritum e izbran HTB, makar che mogat da se polzvat i drugi takiva.

3. Opredeliane na klientski adresi, koito shte budat ogranichavani i stoinostite na samoto ogranichavane.

Da priemem, che klientskite adresi sa ot mrezha klas S, koiato e (suvsem proizvolno) 212.104.111.0/24.

Neka ogranicheniiata na IP adres da sa: 32 96 Kbit/s za INT i 64 160 Kbit/s za BG.

4. Iztegliane na faila s bulgarskite mrezhi

Aktualnata versiia na faila s bulgarskite mrezhi mozhe da se iztegli ot http://ip.ludost.net/ sled populvane na suotvetnata forma. Za avtomatizirano iztegliane mozhe da se izpolzva slednata komanda:

#wget -q -O bg_nets-new.txt \ "http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default="

S tazi komanda informatsiiata za bulgarskite mrezhi se zapisva vuv faila bg_nets-new.txt.

Formatut na faila e sledniia:

# ipformat.pm: (c) Boyan Krosnov, (soon to be released) under the GPL

# ipformat.pm: using template prefix

# prefix notation

# ipgetintervals.pm: (c) Boyan Krosnov, (soon to be released) under the GPL

# prefix data acquired from http://ip.ludost.net/

# ipgetintervals.pm: datasets list cleared

# ipgetintervals.pm: added bg to the list of datasets

# ipgetintervals.pm: loading file var/country.db

# ipgetintervals.pm: dumping database

62.44.96.0/19

62.73.64.0/18

62.176.64.0/18

62.200.195.0/24

62.204.128.0/19

62.213.160.0/19

80.72.64.0/19

80.80.128.0/19

i t.n.

T.k. ima veroiatnost da nastupiat promeni v bulgarskite mrezhi, failut s mrezhite triabva periodicheski da se izteglia i pravilata za ogranichavane na trafika periodicheski da se promeniat. Predpolaga se, che shte se suzdade skript, s koito shte se pravi tova. Gornata komanda stoi v nachaloto na tozi skript. Udachno e skriptut da se izpulniava prez opredelen period ot vreme chrez cron.

5. Markirane na paketi, idvashti ot daden IP adres i prednaznacheni za BG ili INT prostranstvoto.

Ideiata e vsichki paketi, idvashti ot daden IP adres i prednaznacheni za BG da se markirat s edna marka (napr. 1) chrez iptables, a paketite, idvashti ot sushtiia IP adres i prednaznacheni za INT s druga (napr. 2). Tova stava po sledniia nachin:

Suzdava se veriga mark-out v tablitsata mangle:

#/sbin/iptables -t mangle -N mark-out

Izhodiashtiiat trafik kum BG prostranstvoto se prekarva prez tazi veriga i se markira s edni marki.


file=bg_nets.txt

line_count=`wc $file | awk '{ print $1 }'`

for name in `seq $line_count`

do

read name

mat=`expr match "$name" '#'`

if [ "$mat" -eq 0 ]

then

/sbin/iptables -t mangle -I POSTROUTING 1 -d $name -j mark-out

fi

done


TSelta na reda

mat=`expr match "$name" '#'`

e da otkrie ima li simvol # v tekushtiia red.

Sled tova v zavisimost ot rezultata suotvetniia red se ignorira (ako ima #) ili se izpolzva kato adres na BG mrezha.

Pravilata za suvpadenie na paketi, nasocheni kum BG prostranstvoto, se vmukvat v nachaloto na verigata POSTROUTING, za da sme sigurni, che niama drugi pravila, koito da otkloniavat paketi za BG prostranstvoto ot verigata mark-out.

Vsichki ostanali paketi ot daden IP adres, koito ne sa popadnali vuv verigata mark-out, sa nasocheni kum INT prostranstvoto i triabva da se markirat sus suotvetnata marka za mezhdunaroden trafik.

Markiraneto na paketi ot konkreten IP adres, popadnali vuv verigata mark-out i takiva, koito sa ostanali izvun verigata mark-out (medunaroden trafik) stava s komandite:

ip=2

while [ $ip -lt 255 ]; do

/sbin/iptables -t mangle -A mark-out -s 212.104.111."$ip" -j MARK --set-mark 1`printf "%03d" $ip`

/sbin/iptables -t mangle -A POSTROUTING -s 212.104.111."$ip" -j MARK --set-mark 2`printf "%03d" $ip`

ip=`expr $ip + 1`

done

Po tozi nachin vsichki paketi za BG shte budat markirani suotvetno 1002, 1003 ... 1254, a za INT 2002, 2003 ... 2254.

Za ip e izbrana nachalna stoinost 2, zashtoto se predpolaga, che 212.104.111.1 e default gateway za klientskata mrezha i e naznachen na vtoriiat interfeis na rutirashtata mashina.

Ako iskate izhodiashtiiat trafik kum dadeni adresi da ne se markira naprimer trafika kum lokalni survuri (abe, ostanaha li takiva?), sled tsikula triabva da se vmuknat spetsialni pravila za tiah:

/sbin/iptables -t mangle -I POSTROUTING 1 -o eth0 -d ip.ad.re.ss -j ACCEPT

6. Suzdavane na klasove i nasochvane na trafik prez tiah.

Kakto veche be spomenato, kato algoritum shte se izpolzva HTB.

/sbin/tc qdisc del dev eth0 root

/sbin/tc qdisc add dev eth0 root handle 1: htb default 30

/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 3mbit burst 20k

/sbin/tc class add dev eth0 parent 1: classid 1:10 htb rate 2mbit burst 20k

/sbin/tc class add dev eth0 parent 1: classid 1:20 htb rate 512kbit burst 20k

/sbin/tc class add dev eth0 parent 1:1 classid 1:30 htb rate 256kbit burst 10k

ip=2

while [ $ip -lt 255 ]; do

/sbin/tc class add dev eth0 parent 1:10 classid 1:1`printf "%03d" $ip` htb rate 64kbit ceil 160kbit burst 15k

/sbin/tc class add dev eth0 parent 1:20 classid 1:2`printf "%03d" $ip` htb rate 32kbit ceil 96kbit burst 15k

/sbin/tc filter add dev eth0 protocol ip parent 1: prio 1 handle 1`printf "%03d" $ip` fw flowid 1:1`printf "%03d" $ip`

/sbin/tc filter add dev eth0 protocol ip parent 1: prio 1 handle 2`printf "%03d" $ip` fw flowid 1:2`printf "%03d" $ip`

ip=`expr $ip + 1`

done


Po tozi nachin se suzdavat klasove za BG trafik 1002, 1003 ... 1254 i klasove za INT trafik 2002, 2003 ... 2254. V tezi klasove popada trafika, markiran sus suotvetnite marki chrez iptables.

7. Pulen listing na skriptovete

Skript mark_peering.sh


#!/bin/bash

#mark_peering.sh Script for marking of Peering & International upload traffic via iptables

wget -q -O bg_nets-new.txt "http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default="

newfile=bg_nets-new.txt

file=bg_nets.txt

#Check for existence of the files

if [[ ! -r "$newfile" || ! -r "$file" ]]

then

echo "Both files to be compared must exist and be readable."

exit 1

fi

cmp $newfile $file &> /dev/null

if [ $? -ne 0 ] # Test exit status of "cmp" command.

then

echo "Doing changes"

mv -f $newfile $file

line_count=`wc $file | awk '{ print $1 }'`


for name in `seq $line_count`

do

read name

mat=`expr match "$name" '#'`

if [ "$mat" -eq 0 ]

then

/etc/init.d/iptables restart

/sbin/iptables -t mangle -I POSTROUTING 1 -d $name -j mark-out

fi

done

ip=2

while [ $ip -lt 255 ]; do

/sbin/iptables -t mangle -A mark-out -s 212.104.111."$ip" -j MARK --set-mark 1`printf "%03d" $ip`

/sbin/iptables -t mangle -A POSTROUTING -s 212.104.111."$ip" -j MARK --set-mark 2`printf "%03d" $ip`

ip=`expr $ip + 1`

done

/sbin/iptables -t mangle -A mark-out -j ACCEPT

else

echo "Everything is the same"

rm -f $newfile

fi

exit 0


Skript htb_eth0.sh


#!/bin/bash

# htb_eth0.sh Script for upload traffic shaping divided to International & Peering classes

/sbin/insmod sch_htb 2>/dev/null

/sbin/insmod cls_fw 2>/dev/null

/sbin/tc qdisc del dev eth0 root

/sbin/tc qdisc add dev eth0 root handle 1: htb default 30

/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit burst 20k

/sbin/tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2mbit burst 20k

/sbin/tc class add dev eth0 parent 1:1 classid 1:20 htb rate 512kbit burst 20k

/sbin/tc class add dev eth0 parent 1:1 classid 1:30 htb rate 256kbit burst 10k

ip=2

while [ $ip -lt 255 ]; do

/sbin/tc class add dev eth0 parent 1:10 classid 1:1`printf "%03d" $ip` htb rate 64kbit ceil 160kbit burst 15k

/sbin/tc class add dev eth0 parent 1:20 classid 1:2`printf "%03d" $ip` htb rate 32kbit ceil 96kbit burst 15k

/sbin/tc filter add dev eth0 protocol ip parent 1: prio 1 handle 1`printf "%03d" $ip` fw flowid 1:1`printf "%03d" $ip`

/sbin/tc filter add dev eth0 protocol ip parent 1: prio 1 handle 2`printf "%03d" $ip` fw flowid 1:2`printf "%03d" $ip`

ip=`expr $ip + 1`

done

E, tova e vsichko. Za komentari i predlozheniia - pishete
P.S. Izvinete me za uzhasniia HTML, no predpochitam da pisha skriptove, a ne Web stranitsi


<< Instalatsiia na Postfix Admin s poddruzhka na PostgreSQL | Nelegitimen dostup do resursi (ueb-bazirani poshtenski uslugi) >>