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