Traffic Shaping + VLAN

Fórumok

Sziasztok!

Azt szeretném megcsinálni, hogy egy Ubuntu 8.04 Server gépen legyen traffic shaping, de csak az internet irányába korlátozzon.
Ezt úgy akartam megoldani, hogy létrehozok egy shaper0 device-t aminek az IP cime ugyanaz mint az eth0-nak. (ehhez kell a shaper kernel modul)
Erre a shaper0 eszközre pedig ráengedném a wondershaper-t ami tud up és down irányban is korlátozni. (mivel a shapecfg-al nem lehet külön megadni az up és down korlátot)
A következőt csináltam:

apt-get install shaper shapecfg wondershaper
echo "shaper" >> /etc/modules
modprobe shaper
shapecfg attach shaper0 eth0
shapecfg speed shaper0 100000000
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/shaper0/rp_filter
ifconfig shaper0 192.168.238.128 netmask 255.255.255.0 broadcast 192.168.238.255 up

Ezután beállitottam a route-ot is.
A gond az, hogy nem működik a dolog. Nem lehet se pingelni az index.hu-t se semmit csinálni a shaper0 eszközön keresztül.
Nade sebaj, közben sokat olvasgattam a shaperről, és a szabilinuxon azt írták hogy max 256kB/s-ig működik.
Persze rögtön kipróbáltam: shapecfg speed shaper0 128000 ...de így se megy a dolog.

Rájöttem, hogy tulajdonképpen nekem nem is kell ez a béna shaper kernelmodul :D úgyis elavult. (és a legtöbb ezzel foglalkozó cikk 2005 körüli)
Ha nem tévedek, meg lehetne oldani a dolgot, vlan-ok létrehozásásval is. Úgy szeretném megcsinálni, hogy legyen egy vlan amin a 192.168 irányba menő forgalom halad át, és egy másik ami pedig a default route (szóval minden más azon megy).
A következőt csináltam:

vconfig add eth0 0
vconfig add eth0 1
ifconfig eth0.0 192.168.238.128 netmask 255.255.255.0
ifconfig eth0.1 192.168.238.128 netmask 255.255.255.0

Aztán a route beállítás.
Természetesen nem működik így sem :D Nem megy át semmi forgalom az eth0.0 és eth0.1 eszközökön.

Az lenne a kérdésem, hogy szabad-e az eth0.0 és eth0.1 interfacenek ugyanazt az IP címet adni mint ami a fizikai interface címe?
Szeretném, ha kívülről ez az egész nem látszana, és a router csak az eth0-nak adna DHCP-n IP címet. (amúgy is csak egy kis kommersz router, nem tud vlanokat kezelni meg semmi ilyesmit)
Ami esetleg számíthat még, hogy jelenleg még csak VMWare-en nyomom, nem igazi gépen.

Egyéb ötlet, hogy miért nem működik?

Hozzászólások

imq-t (obsolete), vagy ifb -t nézd meg

Nem tudnátok inkább a vlan kialakításában segíteni? :) Már csomót foglalkoztam ezzel, és nem szeretném egy totál más megoldással újra kezdeni. Másrészt pedig mindenképpen szükségem van valamiféle virtuális interfacere mert szeretném vmstattal mérni a forgalmat külön az internet és külön a LAN irányba.

Imho. ne shaperezz... http://lartc.org/ Itt megvan minden info hozza ami kell es utana iptables-szel akar hostonkent is tudsz forgalmat merni, valamint picit szofisztikaltabban meg tudod oldani ezzel.

Ha mar mindenkepp igy szeretned, akkor shaperd. Van belole csomag.

"Nem tudnátok inkább a vlan kialakításában segíteni?"
A VLAN interfészt már létrehoztad. De azt leírhatnád, hogy ezt pontosan hogy is gondoltad, milyen eszközhöz csatlakozik közvetlenül az eth0 interfész.

"szabad-e az eth0.0 és eth0.1 interfacenek ugyanazt az IP címet adni mint ami a fizikai interface címe?"
Bizonyos esetekben szabad, de jelen esetben nem érdemes. Milyen eszköz lenne ugyanebben a VLAN-ban? A router?

"a router csak az eth0-nak adna DHCP-n IP címet."
És a másik kettő statikusan lenne beállítva?

"egy kis kommersz router, nem tud vlanokat kezelni"
Akkor biztos van egy menedzselhető switched, ha VLAN tagginget szeretnél. Hány belső, külön IP-vel konfigurálható interfésze lehet ennek a routernek?

"Egyéb ötlet, hogy miért nem működik?"
Nem erre való. Ebben a formájában és erre a célra vonatkozóan tévút.

"szeretném vmstattal mérni a forgalmat külön az internet és külön a LAN irányba."
Az iptables vagy net-acct nem lenne jobb ebben az esetben?

Úgy szerettem volna, hogy kívülről ne látszódjon, hogy én vlan-okat hoztam létre az Ubuntun. Ez csak arra kellett volna, hogy traffic shaping és monitoring mehessen a gépen, de akkor jól sejtettem, hogy ez nem megoldható így.

A router nem tud vlanokat kezelni, nincs külön IP-je a portoknak (4 portja van + 1 WAN port)

Igen statikusan állítottam be a vlan IP-ket ugyanarra mint ami a fizikai interface címe.

Akkor megpróbálom a fent említett megoldásokkal, remélem az iptables nem proci igényes nagyon.

Jó. Egy pár kérdés?

Tisztában vagy azzal, hogy 802.1q vlan-ok nem szabványos ethernet csomagokkal kommunikálnak.
Ha igen akkor a switcheidet felkonfoltad úgy, hogy jó legyen. Ezt mondjuk vmware alatt nem tudom, hogy lehet szimulálni.
Tehát ahova a gépet bedugod ott taggesen felhúzod az 1-2 vlan-t. + Az 1. vlan rendszerint admin vlan.
A többit pedig úgy, hogy a megfelelő vlan-ban legyenek persze untaggesen. A szerint, hogy melyik gép mi szerint van osztályozva.

Az imq jó megoldás, de a példa szkript nem elég. Sajátot kell szerkeszteni.

Az lenne a kérdésem, hogy szabad-e az eth0.0 és eth0.1 interfacenek ugyanazt az IP címet adni mint ami a fizikai interface címe?

Ez lehetséges, de nem sok értelme van. Elméletileg néhány switch lekezeli.

Az egész így kívülről nem fog látszani. A routernek nem is kell tudnia, hogy mi folyik a hálózatodon belül. Sőt ha valahogy ki lehet deríteni akkor az egy rossz topologia :)

Na most egy kicsit összekavartál :)
Nem, nem tudtam hogy a 802.1q nem szabványos csomagokkal kommunikál.

Először is: nincs semmiféle switch. Csak egy otthoni kis home router, amibe be lesz dugva ez a gép. A vlanoknak nem is kéne a gépen kívülről látszania, csak arra használnám hogy az Ubuntu Serveren belül legyen valami virtuális interface amin keresztül küldöm az internetes forgalmat (mivel ez lenne a default route) és így tudom mérni (a LAN forgalomtól külön) a és wondershaperrel szabályozni (úgy hogy a LAN sebességet nem befolyásolom).

De mint ahogy az előző hozzászóló írta, a vlanok alapvetően nem erre valók :)

Akkor most ha jól sejtem az eth0.0 vlan interface-en keresztül menő forgalomnak el lesz rontva az IP fejléce. Legalábbis a router nem fogja tudni értelmezni, mert még soha nem is hallott vlanokról :)
Meg lehet azt valahogy oldani, hogy ugyanolyan csomagot küldjön ki a gép mintha nem a vlan interface-en menne keresztül?

"ha jól sejtem az eth0.0 vlan interface-en keresztül menő forgalomnak el lesz rontva az IP fejléce."
Az IP-hez nem nyúl, de az ethernet frame elejéhez igen. Ezt csak olyan eszköz fogja tudni megfelelően kezelni, amelyik rendelkezik ugyanilyen módon konfigurált porttal.

Ha nincs megfelelő switched, és a routernek sincs ilyen ethernet portja, akkor nincs két olyan eszközöd, amelyek között a VLAN élne.

"Meg lehet azt valahogy oldani, hogy ugyanolyan csomagot küldjön ki a gép mintha nem a vlan interface-en menne keresztül?"
Nem. Mivel a VLAN éppen azért van, hogy két hálózatot elválasszon. Nem lehet két natív (untagged) VLAN egy ethernet porton.

A mérésre a legegyszerűbb dolog a tűzfalszabályok legelejére tenni:


iptables -A INPUT -i eth0 -s 192.168.238.0/24
iptables -A INPUT -i eth0 -s ! 192.168.238.0/24
iptables -A INPUT -i eth0
iptables -A OUTPUT -o eth0 -d 192.168.238.0/24
iptables -A OUTPUT -o eth0 -d ! 192.168.238.0/24
iptables -A OUTPUT -o eth0

Listázás:

iptables -nvL INPUT

iptables -nvL OUTPUT

Szerintem te neked csak az alias kellet volna. Az is hasonló csak nem eth1.1 hanem eth1:1. Ja persze itt sincs semmi értelme az azonos ip-k-nek.
Azt nem tudom, hogy lyukadtál ki a 802.1q-nál. Ez azért egy jól képzett rendszermérnőknek sem triviális feladat. :)

Itt egy kis kód amiből talán kitudsz indulni. Ja ez egy nat-olt hálóból való példa. Tehát ha ezt használni akarod akkor jó eséllyel kell egy másik nat is hozzá.

feltöltés korlát
tc qdisc del dev eth1 root 2>/dev/null
tc qdisc add dev eth1 root handle 1 htb default 2 r2q 35
tc class add dev eth1 parent 1: classid 1:2 htb rate 300kbit prio 2 quantum 59000
tc qdisc add dev eth1 parent 1:2 handle 2: htb r2q 50

#belso eleje
tc class add dev eth1 parent 1:2 classid 1:2006 htb rate 128kbit prio 2 quantum 2000
tc qdisc add dev eth1 parent 1:2006 handle 2006: sfq perturb 10
tc filter add dev eth1 parent 1:2 protocol ip prio 15 u32 match ip src pubip flowid 1:2006
tc filter add dev eth1 parent 1: protocol ip prio 5 u32 match ip src pubhalo/24 flowid 1:2
#belso vége

letöltés korlát
tc qdisc del dev eth0 root 2>/dev/null
tc qdisc add dev eth0 root handle 1 htb default 2
tc class add dev eth0 parent 1: classid 1:2 htb rate 3000kbit prio 1 quantum 59000
tc qdisc add dev eth0 parent 1:2 handle 2: htb

#belso eleje
tc class add dev eth0 parent 1:2 classid 1:2006 htb rate 1024kbit prio 2 quantum 2000
tc qdisc add dev eth0 parent 1:2006 handle 2006: sfq perturb 10
tc filter add dev eth0 parent 1:2 protocol ip prio 15 u32 match ip dst belsőgép ipje flowid 1:2006
tc filter add dev eth0 parent 1: protocol ip prio 10 u32 match ip dst belsőgéphálója/30 flowid 1:2
#belso vége

Ó igen... a sima alias eth0:0 interface-el már próbálkoztam :D De egyrészt nem méri a rajta keresztül menő forgalmat, ezért nem működik rajta a vnstat a másik gond meg hogy nem lehet default route-nak beállitani mert hiába adsz meg eth0:0-át, akkor is eth0-hoz fogja rendelni a route-ot.

A vlanokkal tényleg kicsit eltévedtem, ezért is irtam a hup-ra. Mostmár tiszta a dolog.

A shaperd obsolete.

Az ifb jónak tűnik de túlságosan powerful nekem :D és nincs lelki erőm a bekonfigolásához.

Ez a tc amit bemásoltál meg kb kinai nekem. De láttam már ezeket a parancsokat valahol :)

De megvan az új ötlet: (persze lehet hogy ez is hülyeség)

apt-get install uml-utilities bridge-utils
modprobe tun #ez betölti a tun/tap modult
tunctl #ez létrehoz egy tap0 eszközt
ifconfig tap0 192.168.238.128 netmask 255.255.255.0 up
route add default gateway 192.168.238.2 dev tap0

És ezután persze nem megy a ping www.index.hu , de ez azért van mert valahogy össze kéne kötni a tap0 eszközt az eth0-val, hogy minden amit a tap0-ra küldök azt továbbitsa az eth0-ra. Persze nem tudom, hogy a bejövő internetes forgalmat mi alapján továbbitaná az eth0-ról a tap0-ra.
Gondolom ilyesmire való a bridge, amihez megint csak nem értek :)

brctl addbr br0
brctl addif br0 tap0
brctl addif br0 eth0

Ha hozzáadom az eth0-át a bridge-hez akkor teljesen elvesztem a kapcsolatot a géppel. Szóval még további finomitást igényel a dolog. Azt hittem egyszerűbb lesz ez a traffic shaping dolog... igaázból nekem nem is kell shaping, csak egyszerű bandwidth control.

Ja. A bridge. Az megint egy szép kis hálózati anomália. Tandenbaum valahogy úgy írja le, hogy 2 hálózat összekapcsolására való. Ez pl arra jó, hogy van egy wifi-s hálód meg egy ethernet hálód. A kettő között létrehozol egy hidat az mindkét oldalról átlátható lesz. Legtöbbször wifi ap-k ben használják.
Erről annyit kell tudni, hogy ha egy eszközt beleraksz a bridge-be akkor az már csak annak egy része (portja) lesz. Viszont ha utol akarod érni akkor csak annyit kell tenned, hogy a br0-nak adsz egy ip címet. Attól kezdve az összes portja erre fog hallgatni.

Abban viszont igazad van, hogy a shaperd csak fizikailag létező eszközöket hajlandó kezelni. Semmi mást. Alias-okat főleg nem.

Viszont ha ip cím alapján akarsz bármit is csinálni akkor a cbq, htb lesz a te barátod. Igaz azokat nem könnyű kezelni. Amit írtam abba csak bele kell írni a megfelelő ip címeket és kész legalább is remélem. Egyébként nem csoda, hogy ismerős a legtöbb sor a htb demó cuccból van kiollózva.

Habár nem követtem a szálat, ez esetleg hasznos lehet: ISP-fW, egy jó kis leírás hozzá: itt. Tud traffic shapinget, egész kezelhetően.

Megoldottam a dolgot a trickle nevű progival egyszerűen és könnyen :) Ezzel nem interface-en korlátozok hanem az adott programoknak adom meg a sávszélességet amit használhatnak.