Bejövő forgalom dinamikus szabályozása

 ( blasius1 | 2011. május 23., hétfő - 12:41 )

Sziasztok!

Szembe kerültem egy olyan problémával, miszerint dinamikusan kéne korlátozni egy hálózaton (praktikusan a központi tűzfalon) a forgalmat, főleg a bejövő ágat.
A probléma igazából annyiból áll, hogy ha a webes letöltések kitömnék a hálózatot, akkor is maradjon bizonyos százaléknyi sávszél a levelezésnek, webszervernek, adatbázisnak, stb, ugyanakkor, ha ezeken nincs terhelés, mehet az egész a "nyúzereknek".

Rengeteg megoldást találtam, és épp ez a bajom, mert nem tudom, melyik lenne az optimális az esetemben. Ebben szeretném kérni a tapasztaltabbak segítségét, amit előre is köszönök!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Szia,

Ami befelé jön a csövön, azt más küldi neked, érdemben szabályozni nem tudod. Lehet bohóckodni a tcp window-val, a kimenő kérések korlátozásával, stb., de nem tudod garantálni. A legjobb megoldás erre a 2 netkapcsolat, 1 a netnek, 1 meg minden másnak.

Igen, erre rájöttem én is, épp ezért tettem fel a kérdést. Valóban ez a legjobb megoldás, de ez esetemben nem kivitelezhető sajnos.
Az iptables --limit opciója nagyon fapados, és egyáltalán nem dinamikus, de ha nincs más szükség esetén meglépem.

Sávszélesség-szabályozásnál érdemes első körben a Linux natív megoldásával megpróbálkozni (tc, azaz traffic control):

http://lartc.org/

A bejövő forgalmon is képes a sávszélességet szabályozni egy ún. IMQ (intermediate queueing) device segítségével. Otthon egy ilyen megoldást használok egy Linksys WRT54GS routeren. Én úgy konfiguráltam, hogy egy adott port forgalma (egy P2P kliens által generált csomagok) mindig a lehető legkisebb prioritást kapja, így az egyéb, fontosabb szolgáltatások (web, mail, skype) mindig zökkenőmentesen működnek.

A prioritás szabályozása mellett konkrét sávszélesség-limiteket is be lehet állítani vele pl. a HTB algoritmussal:

http://lartc.org/howto/lartc.qdisc.classful.html#AEN1072

Nem könnyű elsőre megérteni, hogyan is működik, de ha tudsz konkrét adatokat mondani (honnan, milyen forgalom, mekkora sávszélességet használhat, mekkora a maximális sávszélesség befelé), akkor esetleg segíthetek egy alapkonfig összeállításában.

Köszönöm, ez ígéretes így elsőre. A tc-vel sok dolgom még nem volt, de eddig úgy tudtam, hogy az elsősorban a kimenő forgalom szabályozására való, épp a kettővel ezelőtti hozzászólásban említett okok miatt, de lehet, hogy tévedek.

Adott tehát egy oda-vissza 6 megabites vonal. Ezt szeretném úgy korlátozni, hogy a webes letöltések maximum a 4 megabitet használjanak, ha a levelezés, webszerver vagy adatbázis-forgalom is zajlik a vonalon. (Ezeket lehet azonos prioritásúnak venni esetemben.) Ha viszont semelyik sem folyik, akkor nyugodtan használhatja a teljes rendelkezésre álló sávszélességet.
Befelé irányuló forgalomra van pár tc példám, de nem tudom, hogy mit kell csinálni egy kifelé menő forgalom esetén.

Te mindig a kimenő oldalt szabályozd, mert a többiért a feladó a felelős. Ha átgondolod a le- és feltöltés is egy-egy kimenő irány neked, csak megfelelő nézőpont kell.
A netről bejövő úgy lesz kimenő, hogy a korlátozó szervered belső, ügyfelek felé eső lábán megy ki a forgalom. A netes feltöltés irány meg a gw-en a szolgáltató felé kimenő csomagokat jelenti.
Így 1-1 szabályrendszerrel mindkét interface-re szépen lehet a forgalmat korlátozni.

Való igaz, köszönöm! :D

A squidról hallottál-e "nyúzer"...

Igen, az lesz a következő forduló, ha ezekkel a módszerekkel nem sikerül valamiért.

lartc.org-on van nagyon jó leírás, hogy protokollok között hogyan lehet prioritizálni.
(szembe tudod állítani a http forgalmat az egyéb forgalommal dstport packetmark alapján)

Ha több pénzed van, mint időd (avagy munkahelyi dolog) javaslom a Mikrotik-ben queue opciót,
kb 8-10 000Ft-ból és 10percből meg tudod oldani a problémát.

Köszönöm, jó ötlet, de még csak az elején tartok a lartc.org-nak, nagyon hasznos, de nagyon tömény olvasmány.

Elnézést, hogy csak most válaszolok, nem volt időm mostanában ezzel foglalkozni. Remélem, még aktuális a téma.

Az alábbi kód egy egyszerű prioritizálás nélküli traffic shaping-et valósít meg. A forgalom osztályozásánál a default portokat állítottam be, és mivel azt nem mondtad, hogy milyen DB-szervert használsz, ezért a két legnépszerűbbet vettem alapul (MySQL/PostgreSQL). Ha más DBMS-t futtatsz, csak írd be a --dports és a --sports paraméterhez a megfelelő portokat.

Az egyszerűség kedvéért abból indultam ki, hogy a gateway-en 1 WAN és 1 LAN interfész van beállítva.

#!/bin/sh
### A netes interfesz neve
WANIF=eth0
### A LAN interfesz neve
LANIF=eth1
### Maximalis savszelesseg fel/le (kbps) - itt a vonal savszelessegenel nehany szazalekkal kevesebbet kell megadni
UPLOADBW=5500
DOWNLOADBW=5500

iptables -t mangle -F

### Megjeloljuk a csomagokat, hogy ez alapjan osztalyozni lehessen a forgalmakat
# HTTP/HTTPS kimeno forgalom (internetes szerverek fele/felol)
iptables -A FORWARD -m multiport -t mangle -i $LANIF -o $WANIF -p tcp --dports 80,443 -j MARK --set-mark 2
iptables -A FORWARD -m multiport -t mangle -i $WANIF -o $LANIF -p tcp --sports 80,443 -j MARK --set-mark 2
# HTTP/HTTPS/SMTP/IMAP/POP3/MySQL/PostgreSQL bejovo forgalom (belso szerverek fele/felol)
iptables -A FORWARD -m multiport -t mangle -i $WANIF -o $LANIF -p tcp --dports 80,443,25,110,143,3306,5432 -j MARK --set-mark 3
iptables -A FORWARD -m multiport -t mangle -i $LANIF -o $WANIF -p tcp --sports 80,443,25,110,143,3306,5432 -j MARK --set-mark 3

### LAN->WAN forgalom szabalyozasa
tc qdisc del dev $WANIF root
tc qdisc add dev $WANIF root handle 1: htb default 99
tc class add dev $WANIF parent 1: classid 1:1 htb rate ${UPLOADBW}kbit burst 15k
tc class add dev $WANIF parent 1:1 classid 1:2 htb rate 4000kbit ceil ${UPLOADBW}kbit burst 15k
tc class add dev $WANIF parent 1:1 classid 1:3 htb rate 1000kbit ceil ${UPLOADBW}kbit burst 15k
tc class add dev $WANIF parent 1:1 classid 1:99 htb rate 500kbit ceil ${UPLOADBW}kbit burst 15k
tc qdisc add dev $WANIF parent 1:2 handle 2: sfq perturb 10
tc qdisc add dev $WANIF parent 1:3 handle 3: sfq perturb 10
tc qdisc add dev $WANIF parent 1:99 handle 99: sfq perturb 10

### WAN->LAN forgalom szabalyozasa
tc qdisc del dev $LANIF root
tc qdisc add dev $LANIF root handle 1: htb default 99
tc class add dev $LANIF parent 1: classid 1:1 htb rate ${DOWNLOADBW}kbit burst 15k
tc class add dev $LANIF parent 1:1 classid 1:2 htb rate 4000kbit ceil ${DOWNLOADBW}kbit burst 15k
tc class add dev $LANIF parent 1:1 classid 1:3 htb rate 1000kbit ceil ${DOWNLOADBW}kbit burst 15k
tc class add dev $LANIF parent 1:1 classid 1:99 htb rate 500kbit ceil ${DOWNLOADBW}kbit burst 15k
tc qdisc add dev $LANIF parent 1:2 handle 2: sfq perturb 10
tc qdisc add dev $LANIF parent 1:3 handle 3: sfq perturb 10
tc qdisc add dev $LANIF parent 1:99 handle 99: sfq perturb 10

subs
--
Imperare sibi maximum imperium est.