Sávszélesség limitálása egy adott portra

Fórumok

Hello!

Remélem megszán engem egy hozzáértő emberke, aki a kisujjából kiráz egy ilyet. Átnyálaztam nem tudom hány gugli találatot, meg tc/cbq dokumentációt, példát, mégsem találtam meg, amire szükségem lenne (gondolom kb 2 parancs...)

Egy adott tcp porton szeretném a kimenő sávszélességet limitálni x KB/sec-re, minden egyéb forgalmat hagyva háborítatlanul továbbmenni. Összesen ennyi, köszi!

Hozzászólások

A legegyszerűbb szerintem az osztály alapú qdisc. Ha beletanulsz biztos szeretni fogod.
Nem olvastam át teljesen, és nem vagyok profi a témában, de remélem segítettem valamit, és itt megosztod a tapasztalatod :)

Nem tudom, nézted-e ezt. Nem a legfrissebb, de sokféle példa és leírás van benne, talán segít.

Holnapig ugyan nem tudok belenyúlni a "célgép"-be, de megnézem, van-e a kernelemben HTB támogatás. Tényleg sokkal egyszerűbb a kód, csak én megörültem, hogy jé, itt a megoldás, nem is olvastam tovább a doksit.

Ha tudja a kerne, mindeképp htb, ha nem, akkor majd ha legközelebb cserélnem kell...

Itt egy egyszerű megoldás ami ugyan nem KB/sec hanem csomag/sec, de hátha jó ez is neked.

iptables -A OUTPUT -p tcp --dport 80 -m limit --limit 10/sec -j "amit akarsz"

Természetesen a "sec" helyet lehet hour , min ...stb is.

Blogom

iptables -A OUTPUT -p tcp --dport 80 -m limit --limit 10/sec -j "amit akarsz"

Itt a --limit-burst 5, mert ez a default. Vagyis másodpercenként 10 alkalommal 5 csomag = 50
Egyébként jó lehet ez is, ha feltételezed, hogy egy csomag "átlagos" mérete 1500 byte és ennek megfelelően limitálsz.

"amit akarsz" mondjuk legyen ACCEPT, utána pedig
iptables -A OUTPUT -p tcp --dport 80 -j DROP

Ezzel csak annyi a baj, hogy amíg el nem érem a limitet, addig korlátozás nélkül futnak ki a csomagok a teljes sávszélességen, aztán pedig teljesen megszűnik a csomagok áramlása. De ettől még nekem a router, majd a modem FIFO tárolójában ugyanúgy fel fognak torlódni az ACK-k, nem?

Ezzel csak annyi a baj, hogy amíg el nem érem a limitet, addig korlátozás nélkül futnak ki a csomagok a teljes sávszélességen
Ez igaz. De értelmezd úgy, hogy
1db csomag/sec == 1,4KByte/sec(1500byte, ez lehet a max mérete egy csomagnak)
Ha mondjuk 20KB/s-et akarsz = 14 csomag/sec /-m limit --limit 14/sec --limit-burst 1/
Mondjuk ez 14 csomagot rögtön kienged, majd a másodperc fennmaradó idejében semmit. Talán optimálisabb így (15 csomagra)
-m limit --limit 3/sec --limit-burst 5

aztán pedig teljesen megszűnik a csomagok áramlása. De ettől még nekem a router, majd a modem FIFO tárolójában ugyanúgy fel fognak torlódni az ACK-k, nem?
Szerintem így nem.

Végülis az előnyei miatt a htb-s megoldást néztem ki magamnak, ám van vele egy kis gond. Írtam egy scriptet:

#!/bin/bash

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

tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit burst 15k

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 2kbit ceil 2kbit burst 5k
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 2kbit ceil 2kbit burst 5k
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 2kbit ceil 2kbit burst 5k
tc class add dev eth0 parent 1:1 classid 1:40 htb rate 128kbit ceil 100mbit burst 15k

tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
tc qdisc add dev eth0 parent 1:40 handle 40: sfq perturb 10

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 5511 0xffff flowid 1:10
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 5512 0xffff flowid 1:20
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 5513 0xffff flowid 1:30

SSH-n keresztül próbálom megetetni a gépemmel. A futtatás közben bedöglik az ssh kapcsolat, sőt, még a pingre sem reagál a gépezet. Marad egy reset. Mit rontottam el?

Köszi a segítséget.

Kössz! Nem volt meg... látszik milyen hülye vagyok az egészhez.

Az adsl bandwidth management howto alapján most épp itt tart a script:

#!/bin/bash
tc qdisc add dev eth0 root handle 1: htb default 26

tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit

tc class add dev eth0 parent 1:1 classid 1:20 htb rate 50mbit ceil 100mbit prio 0
tc class add dev eth0 parent 1:1 classid 1:21 htb rate 1kbit ceil 16kbit prio 1
tc class add dev eth0 parent 1:1 classid 1:22 htb rate 1kbit ceil 16kbit prio 2
tc class add dev eth0 parent 1:1 classid 1:23 htb rate 1kbit ceil 16kbit prio 3

tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 1:21 handle 21: sfq perturb 10
tc qdisc add dev eth0 parent 1:22 handle 22: sfq perturb 10
tc qdisc add dev eth0 parent 1:23 handle 23: sfq perturb 10

tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 22 fw flowid 1:22
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 23 fw flowid 1:23

iptables -t mangle -N MYSHAPER-OUT
iptables -t mangle -I POSTROUTING -o eth0 -j MYSHAPER-OUT

iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 5511 -j MARK --set-mark 21
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport 5511 -j MARK --set-mark 21

iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 5512 -j MARK --set-mark 22
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport 5512 -j MARK --set-mark 22

iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 5513 -j MARK --set-mark 23
iptables -t mangle -A MYSHAPER-OUT -p tcp --sport 5513 -j MARK --set-mark 23

iptables -t mangle -A MYSHAPER-OUT -p udp --dport 5511 -j MARK --set-mark 21
iptables -t mangle -A MYSHAPER-OUT -p udp --sport 5511 -j MARK --set-mark 21

iptables -t mangle -A MYSHAPER-OUT -p udp --dport 5512 -j MARK --set-mark 22
iptables -t mangle -A MYSHAPER-OUT -p udp --sport 5512 -j MARK --set-mark 22

iptables -t mangle -A MYSHAPER-OUT -p udp --dport 5513 -j MARK --set-mark 23
iptables -t mangle -A MYSHAPER-OUT -p udp --sport 5513 -j MARK --set-mark 23

iptables -t mangle -A MYSHAPER-OUT -m mark --mark 0 -j MARK --set-mark 20

(A szűrési feltételeket már kétségbeesésemben szaporítottam így meg.) A parent class biztos hogy jó, ha oda mondjuk 64K-t írok, le is korlátozza annyira a teljes forgalmat, ám ha 100mbit-re állítom, akkor az 5511, 5512, 5513-as portokon nem áll meg 2kbitnél, hanem megeszi az egész elérhető sávszélt. Pedig a ceil miatt nem szabadna neki. Vagy én tudom rosszul?

Hali!
En egy kicsit mas iranyba vinnelek. Nem hiszem hogy ez a legoptimalisabb, de mindenkeppen egyszeru.
En savszelesseg korlatozast a cbqinit -tel csinaltam par eve. Eleg egyszeru volt, bar kicsit zavart, hogy hibas konfig eseten hibajelzes nelkul siman nem mukodott. Talan le is olte az osszes kommunikaciot. Ha azonban egyszer belottem, ment mint a kisangyal.
Itt megtalalod: itten

HTB az eredeti témában felvetett problémára kb. ágyúval verébre. A TBF teljesen jó erre a célra.

Ja és még valami. Hacsak lehet, ne szórakozz az iptables-el. Egyszerű tc filter parancsokkal meg lehet fogni rengeteg dolgot.

Igen, már így is elég sokat tanultam, a kár csak az, hogy a végeredmény elméletben jó, gyakorlatban meg nem. A linkeket egyébként szintén köszönöm. Nem copypasteeztem, hanem megnéztem a példakódot, meg a hozzá való magyarázatot, és megpróbáltam átírni úgy, hogy nekem megfelelően menjen a dolog.

Egyébként egyáltalán nem vagyok informatikus, és a "gyerekkorom" windowssal telt el, a linux az valami misztikus köd volt előttem. Szóval még igencsak tanuló fázisban vagyok :)