Tc
Tartalomjegyzék[elrejtés] |
1 tc
A hálózatunkba beérkező forgalmat nem tudjuk sajnos igazán jól formázni, mert nincs hatásunk rá. Kb. olyan mit a papíralapú levelezés, a postásnak nem mondhatjuk meg, hogy naponta csak 5 levelet tegyen a levélszekrényünkbe, mert különben gond lesz. Viszont az olyan forgalmat, aminek forrása az általunk felügyelt hálózatban van, azt már könnyen szabályozhatjuk. Erre jó a tc.
1.1 A traffic control architektúrája
1.1.1 Terminológia
Queueing Discipline (qdisc)
- Egy eszköz feldolgozási sorának algoritmusa
root qdisc
- Ez a qdisc kapcsolódik az eszközhöz, az a fa struktúra gyökere.
Classless qdisc
- Osztályozásmentes viselkedés, a queue-ba kerülő csomagokat nem szórja szét osztályokba, csak újraütemezi, várakoztatja vagy eldobja. Semmit nem lehet rajta konfigurálni, egyszerűen csak van és lehet használni.
Classful qdisc
- Osztályokra bontható qdisc. Az osztályokból egy fastruktúra építhető fel. Az ilyen qdisc-eknek már sok (rengeteg) paraméterét lehet beállítani.
- pfifo_fast
- Token Bucket Filter (TBF)
- Stochastic Fairness Queueing (SFQ)
- PRIO
- Class Based Queueing (CBQ)
- Hierarchical Token Bucket (HTB)
Class (osztály)
- Egy qdisc-nek több osztálya is lehet, egy osztálynak lehet több gyermek osztálya. Minden osztályhoz tartozik egy qdisc.
Classifier (osztályozó)
- Ez dönti el, hogy melyik csomag melyik osztályba kerül tovább.
Filter (szűrő)
- Az osztályozás a szűrőkkel pontosítható, ha egy csomag paraméterei megfelelnek egy feltételnek, akkor az osztályozó aképp fog eljárni vele.
Scheduling (ütemezés)
- A csomagok ütemezését szolgálja a qdisc-eken keresztül az osztályozó segítségével.
Shaping (formázás)
- Az határozza meg, hogy egy csomag mikor kerülhet ki a médiumra, hogy az adott paramétereket (sávszélesség, burstösség) teljesítse a csomagfolyam.
Policing (rendelkezés)
- Meghatárzza, hogy mi történjen a csomaggal. Késleltetést szenvedjen, eldobásra kerüljön (a Linux csak eldobni tudja, mivel nincs bemeneti sor).
Work-Conserving
- Ez olyan qdisc, ha van kiköldendő csomag, akkor azt kiküldi.
non-Work-Conserving
- Ez olyan qdisc, hogy ha van kiküldendő csomag, akkor azt csak akkor küldi ki, ha belefér a paraméterek álatal meghatározott forgalmi mintába (pl. nem lesz túl burstös)
1.1.2 A tc a kernelben
Userspace programs ^ | +---------------+-----------------------------------------+ | Y | | -------> IP Stack | | | | | | | Y | | | Y | | ^ | | | | / ----------> Forwarding -> | | ^ / | | | |/ Y | | | | | | ^ Y /-qdisc1-\ | | | Egress /--qdisc2--\ | --->->Ingress Classifier ---qdisc3---- | -> | Qdisc \__qdisc4__/ | | \-qdiscN_/ | | | +---------------------------------------------------------+
- Az egész nagy doboz a kernel
- Ha a gépnek szól egy csomag akkor az felfele megy, ha nem, akkor jobbra
1.1.3 A hierarchia
Minden interfacenek van egy kimeneti root qdisc-je, az alapértelmezésben pfifo_fast. Minden qdisc-hez és class-hez tartozik egy handle (kezelő), amivel a későbbi parancsoknál lehet hivatkozni az adott qdisc-re. Egy interfésznek a kimeneti qdisc-en kívűl lehet bemeneti qdisc-je is.
A handle-ök nevei 2 számból állnak <major>:<minor>. az osztályoknak a szülőivel azonos major azonosítóval kell rendelkezniük. A minor azonosítónak pedig egyedinek kell lennie az adott qdiscben és és annak osztályaiban.
1.1.4 A fa szerkezet
1: root qdisc | 1:1 child class / | \ / | \ / | \ / | \ 1:10 1:11 1:12 child classes | | | | 11: | leaf class | | 10: 12: qdisc / \ / \ 10:1 10:2 12:1 12:2 leaf classes
1.2 CBQ
A legrégebbi és talán a legkomplexebb qdisc és persze a legelterjedtebb is.
Ha nekiesünk, mint tót az annyának, akkor érdekes eredményt kaphatunk. Pl ha egy 10 Mbites forgalmat akarunk 1 Mbitre korlátozni, akkor a cbq-val könnyen azt is elérhetjük, hogy az idő 10%-ben teli a sávszélesség és 90%-ban meg üres, pedig nekünk nem ez kellene. Érdemes végig mazsolázni a paramétereket, hogy jól be tudjuk állítani.
Alapesetben kiszámolja, hogy mekkora legyen az atlagos idő, amikor nem ad (avgidle), hogy a sávszélesség a kivánt legyen, erre exponenciálisan súlyozott mozgó átlagot használ. Ebból tudja, hogy mikor kell adnia ami a csövön befér és meddig nem kell adnia. Egy túlterhelt linknek lehet akár negatív avgidle értéke is, akkor egyszerűen nem ad csomagot amig ismét el nem éri a kívánt értéket. Viszont egy alacsony kihasználtságú linken óriási burst-ök is kialakulhatnak.
1.2.1 CBQ paraméterek
avpkt
- Átlagos csomag hossz (byte-ban). Ez szükséseges a minidle kisámításához, ami a maxburstből van származtatva, de azt csomag ban mérik.
bandwidth
- Az eszköz fizikai sávszélessége. Ez a az idle time kiszámításához szükséges.
cell
- Ennyi idő alatt rakunk ki a vonalra egy csomagot. Ez adja a granularitást. Csomagméret alapján nőhet. Általában 8 az értéke, de 2 többszörösének kell lennie.
maxburst
- A maxidle kiszámításához használják. Ha a maxidle és az avgidle közel azonos, akkor gyakran burst-ösödhet, mielött lekapcsolja az adást. Érdemes magasabbra állítani, így toreránsabb lesz a burst-ökhöz. A maxidle csak ezen a paraméteren keresztül állítható.
minburst
- Mivel a CBQ túlterhelésnél hajlamos az eldugulásra, az lenne a jó, ha kiszámolnánk, hogy menny az idle time aztán küldenénk egy csomagot, majd pihennénk egy idle time-ni időt. De sajnos ez a kernel ütemezője miatt sem olyan egyszerű, hiszen neéhz kevesebb mint 10 ms-nél rövidebre ütemezni egy eseményt. Így mégis csak jobb, ha először sokat adunk és utána csak minburst-nyi csomagokat rakunk ki egyszerre, aztán megint pihenünk egy kicsit. A nagyobb minburst érték jobb forgalomformázáshoz vezet nagyobb időre vetítve, de ms-os felbontásnál nagyobb burst-öket okoz.
minidle
- Ha az avgidle kisebb mint 0, akkor addig nem rakunk csomagot a vonalra, amig az avgidle nem lesz elég nagy egy csomag küldésére. Hogy megelőzzük a hirtelen burst-öket a link lekacsolása miatt, az avgidle-t visszaállítjuk a minidle-re, ha túl alacsonyra csökkenne. A megadott értéket negatív számként kell értelmezni, mikroszekundumban.
mpu
- Minimum Packet Size. Szükséges az idle time pontosabb kiszámításához. Az ethernet, ha üres csomagot küldünk, akkor is kitömi 64byte-osra, mert különben nem lehetne érzékelni az üttközést.
rate
- milyen időközönként hagyhatja el csomag az adott qdisc-et.
A CBQ prioritásokat is képes figyelembe venni. Az magasabb prioritásúakkal kezdni, és megy körbe. Nénány paraméter a súlyozott round rubin (WRR) processhez, ami a prioritásokat kérdezgeti le.
allot
- Egyszerre ennyi adatot küldhet egy osztály. (Plusz infó a wight paraméternél.
prio
- A CBQ is tud úgy vislekedni, mint a PRIO, előszőr a nagyobb prioritással rendelkező csomagokat küldi ki, majd utána a többit prioritási sorrenben. Addig nem küld ki alacsonyabb prioritású csomagot, amig van magasabb prioritású.
whight
- A súlyozásban segíti a WRR-t. Minden osztály esélyt kap egy-egy körben. Ha van egy osztály, aminek jóval nagyobb a forgalma, akkor ez segíthet abban, hogy több adatot tudjon kiküldeni egy kör alatt, mint a többiek. A sőlytényezőket normalizálja, csak az arány a lényeg. A normalizált súlyt ezután megszorozza az allot paraméterrel ebből megkapja, hogy egy körben mennyi adatot küldhet ki az adott osztály.
Egy CBQ-n belül ugyan azon a major számon kell osztozniuk.
Pár paraméter a sávszélesség megosztáshoz és kölcsönkéréshez.
isolated/sharing
- Az isolated a hozzá rendelt sávszélt nem osztja meg a testvér osztályaival. A sharing igen.
bounded/borrow
- A bounded nem kér kölcsön, a borrow igen.
Viszont egy osztályon belüli gyermek osztályok már kérhetnek kölcsön egymástól.
Példa
1: root qdisc | 1:1 child class / \ / \ 1:3 1:4 leaf classes | | 30: 40: qdiscs (sfq) (sfq)
Van egy 100mbit-es NIC-ünk, a webservernek 5mbit sávot adunk, az smtp-nek pedig 3 mbit-et
# tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit \ avpkt 1000 cell 8 # tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit \ rate 6Mbit weight 0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 \ avpkt 1000 bounded
Ezzel a két folyamhoz összesen 6 mbit sávot rendelünk.
# tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit \ rate 5Mbit weight 0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 \ avpkt 1000 # tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit \ rate 3Mbit weight 0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 \ avpkt 1000
Itt pedig a fenti külön-külön sávot rendeljük a két folamhoz.
# tc qdisc add dev eth0 parent 1:3 handle 30: sfq # tc qdisc add dev eth0 parent 1:4 handle 40: sfq
Ezzel meghatározzuk a qdisc algoritmusát.
# tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip \ sport 80 0xffff flowid 1:3 # tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip \ sport 25 0xffff flowid 1:4
Itt pedig azt határozzuk meg, hogy melyik folyamot melyik kezeljen.
A pfifo_fast a TOS bitek alapján osztályozza a csomagokat. Erre a CBQ-ban is van lehetőség. Erre a split és a defmap paraméterek szolgálnak. A split azt mondja meg, hogy melyik qdisc-ben alkalmazzuk ezt az osztályozást is, a defmap pedig, hogy mely TOS biteknek szükséges beállítva lenni, hogy a szabály érvényeslüljön a csomagra.
Példa a split és defmap-re:
TOS bitek értelmezése:
0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ | | | | | PRECEDENCE | TOS | MBZ | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+
Binary Decimcal Meaning ----------------------------------------- 1000 8 Minimize delay (md) 0100 4 Maximize throughput (mt) 0010 2 Maximize reliability (mr) 0001 1 Minimize monetary cost (mmc) 0000 0 Normal Service
TC_PRIO.. Num Corresponds to TOS ------------------------------------------------- BESTEFFORT 0 Maximize Reliablity FILLER 1 Minimize Cost BULK 2 Maximize Throughput (0x8) INTERACTIVE_BULK 4 INTERACTIVE 6 Minimize Delay (0x10) CONTROL 7
Jobbról vannak számozva a bitek.
A példában 2 részre oszjuk az átmenő adatokat. Az egyik egy interaktív folyam, a másik pedig egy ömlesztett adatfolyam.
# tc class add dev eth1 parent 1:1 classid 1:2 cbq bandwidth 10Mbit \ rate 1Mbit allot 1514 cell 8 weight 100Kbit prio 3 maxburst 20 \ avpkt 1000 split 1:0 defmap c0 # tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 10Mbit \ rate 8Mbit allot 1514 cell 8 weight 800Kbit prio 7 maxburst 20 \ avpkt 1000 split 1:0 defmap 3f
A parancsok hatására következő képpen oszlanak szét a folyamok a TOS bitek alapján
priority send to 0 1:3 1 1:3 2 1:3 3 1:3 4 1:3 5 1:3 6 1:2 7 1:2
1.2.2 Jelzés elhelyezése a csomagokon
Ha egy csomag az eth0-án, de mi csak az eth1-en kimenetkor akarjuk piszkálni a packeteket, akkor a például a következőt kell csinálnunk.
# tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1 # iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6
Az iptables-szel elhelyezünk egy jelzést, még a route-olás előtt.
1.3 Mi kell mindehez
A kernelben a következő részeket kell kijelölni ehhez:
-> Networking -> Networking support -> Networking options -> QoS and/or fair queueing
Ezen menüpont alatt a használni kívánt algoritmusokat kell kijelölni fordításra.
1.4 Egy rövid példascript
#!/bin/sh INET_IF="ppp0" INET_IP="1.2.3.4" INTRA_IF="eth1" INTRA_IP="10.1.0.1" INET='! 10.0.0.0/8' INTRA="10.0.0.0/8" LOCALNET="10.0.0.0/8" SERVERS="10.0.0.0/16" FIREWALLS="10.1.0.0/16" OFFICE="10.3.0.0/16" NETCAFE="10.4.0.0/16" TERMS="10.5.0.0/16" OFFICE2="10.6.0.0/16" HOSTED_SERVERS="2.3.4.0/28" ALLOT="1500" AVPKT="1000" WEIGHT="10000" UP_DEV="ppp0" UP_IF_BANDWIDTH="100" UP_IF_BANDWIDTH_UNIT="Mbit" UP_LINK_BANDWIDTH="150" UP_LINK_BANDWIDTH_UNIT="kbit" DOWN_DEV="eth1" DOWN_IF_BANDWIDTH="100" DOWN_IF_BANDWIDTH_UNIT="Mbit" DOWN_LINK_BANDWIDTH="1000" DOWN_LINK_BANDWIDTH_UNIT="kbit" # Clean up qdiscs tc qdisc del dev $UP_DEV root tc qdisc del dev $DOWN_DEV root # Clean up ip tables iptables -t mangle -D INPUT -j classify 2>/dev/null iptables -t mangle -D OUTPUT -j classify 2>/dev/null iptables -t mangle -D FORWARD -j classify 2>/dev/null iptables -t mangle -D PREROUTING -j classify 2>/dev/null iptables -t mangle -D POSTROUTING -j classify 2>/dev/null iptables -t mangle -F classify 2>/dev/null iptables -t mangle -X classify 2>/dev/null ############################################################################### # "Upload" and "Download" CBQ classes # # Create root CBQ qdisc tc qdisc add dev $UP_DEV root handle 1: cbq avpkt $AVPKT \ bandwidth ${UP_IF_BANDWIDTH}${UP_IF_BANDWIDTH_UNIT} tc qdisc add dev $DOWN_DEV root handle 1: cbq avpkt $AVPKT \ bandwidth ${DOWN_IF_BANDWIDTH}${DOWN_IF_BANDWIDTH_UNIT} # Shape everything at UP_LINK_BANDWIDTH speed on the UP_DEV # This prevents huge queues the ADSL modem, which destroy latency tc class add dev $UP_DEV parent 1: classid 1:1 cbq allot $ALLOT \ rate ${UP_LINK_BANDWIDTH}${UP_LINK_BANDWIDTH_UNIT} prio 5 bounded isolated tc class add dev $DOWN_DEV parent 1: classid 1:1 cbq allot $ALLOT \ rate ${DOWN_IF_BANDWIDTH}${DOWN_IF_BANDWIDTH_UNIT} prio 5 bounded isolated # SSH Interactive tc class add dev $UP_DEV parent 1:1 classid 1:101 cbq allot $ALLOT \ rate $[7*$UP_LINK_BANDWIDTH/10]$UP_LINK_BANDWIDTH_UNIT prio 1 bounded sharing weight tc class add dev $DOWN_DEV parent 1:1 classid 1:101 cbq allot $ALLOT \ rate $[7*$DOWN_LINK_BANDWIDTH/10]$DOWN_LINK_BANDWIDTH_UNIT prio 1 bounded sharing weight # SERVERS<->OFFICE tc class add dev $UP_DEV parent 1:1 classid 1:102 cbq allot $ALLOT \ rate $[4*$UP_LINK_BANDWIDTH/10]$UP_LINK_BANDWIDTH_UNIT prio 2 bounded sharing weight tc class add dev $DOWN_DEV parent 1:1 classid 1:102 cbq allot $ALLOT \ rate $[4*$DOWN_LINK_BANDWIDTH/10]$DOWN_LINK_BANDWIDTH_UNIT prio 2 bounded sharing weight # SSH Bulk (SCP) tc class add dev $UP_DEV parent 1:1 classid 1:103 cbq allot $ALLOT \ rate $[4*$UP_LINK_BANDWIDTH/10]$UP_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight tc class add dev $DOWN_DEV parent 1:1 classid 1:103 cbq allot $ALLOT \ rate $[4*$DOWN_LINK_BANDWIDTH/10]$DOWN_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight # INET<->FW2 tc class add dev $UP_DEV parent 1:1 classid 1:104 cbq allot $ALLOT \ rate $[4*$UP_LINK_BANDWIDTH/10]$UP_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight tc class add dev $DOWN_DEV parent 1:1 classid 1:104 cbq allot $ALLOT \ rate $[4*$DOWN_LINK_BANDWIDTH/10]$DOWN_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight # INET<->OFFICE tc class add dev $UP_DEV parent 1:1 classid 1:105 cbq allot $ALLOT \ rate $[$UP_LINK_BANDWIDTH/10]$UP_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight tc class add dev $DOWN_DEV parent 1:1 classid 1:105 cbq allot $ALLOT \ rate $[$DOWN_LINK_BANDWIDTH/10]$DOWN_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight # INET<->NETCAFE tc class add dev $UP_DEV parent 1:1 classid 1:106 cbq allot $ALLOT \ rate $[$UP_LINK_BANDWIDTH/10]$UP_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight tc class add dev $DOWN_DEV parent 1:1 classid 1:106 cbq allot $ALLOT \ rate $[$DOWN_LINK_BANDWIDTH/10]$DOWN_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight # INET<->TERMS tc class add dev $UP_DEV parent 1:1 classid 1:107 cbq allot $ALLOT \ rate $[$UP_LINK_BANDWIDTH/10]$UP_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight tc class add dev $DOWN_DEV parent 1:1 classid 1:107 cbq allot $ALLOT \ rate $[$DOWN_LINK_BANDWIDTH/10]$DOWN_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight # INET<->OFFICE2 tc class add dev $UP_DEV parent 1:1 classid 1:108 cbq allot $ALLOT \ rate $[$UP_LINK_BANDWIDTH/10]$UP_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight tc class add dev $DOWN_DEV parent 1:1 classid 1:108 cbq allot $ALLOT \ rate $[$DOWN_LINK_BANDWIDTH/10]$DOWN_LINK_BANDWIDTH_UNIT prio 3 borrow sharing weight # OTHER tc class add dev $UP_DEV parent 1:1 classid 1:109 cbq allot $ALLOT \ rate ${UP_IF_BANDWIDTH}${UP_IF_BANDWIDTH_UNIT} prio 4 bounded isolated weigh tc class add dev $DOWN_DEV parent 1:1 classid 1:109 cbq allot $ALLOT \ rate ${DOWN_IF_BANDWIDTH}${DOWN_IF_BANDWIDTH_UNIT} prio 4 bounded isolated weigh tc qdisc add dev $UP_DEV parent 1:101 handle 101: sfq tc qdisc add dev $DOWN_DEV parent 1:101 handle 101: sfq tc qdisc add dev $UP_DEV parent 1:102 handle 102: sfq tc qdisc add dev $DOWN_DEV parent 1:102 handle 102: sfq tc qdisc add dev $UP_DEV parent 1:103 handle 103: sfq tc qdisc add dev $DOWN_DEV parent 1:103 handle 103: sfq tc qdisc add dev $UP_DEV parent 1:104 handle 104: sfq tc qdisc add dev $DOWN_DEV parent 1:104 handle 104: sfq tc qdisc add dev $UP_DEV parent 1:105 handle 105: sfq tc qdisc add dev $DOWN_DEV parent 1:105 handle 105: sfq tc qdisc add dev $UP_DEV parent 1:106 handle 106: sfq tc qdisc add dev $DOWN_DEV parent 1:106 handle 106: sfq tc qdisc add dev $UP_DEV parent 1:107 handle 107: sfq tc qdisc add dev $DOWN_DEV parent 1:107 handle 107: sfq tc qdisc add dev $UP_DEV parent 1:108 handle 108: sfq tc qdisc add dev $DOWN_DEV parent 1:108 handle 108: sfq
tc qdisc add dev $UP_DEV parent 1:109 handle 109: sfq tc qdisc add dev $DOWN_DEV parent 1:109 handle 109: sfq ############################################################################### # Create flow filters # tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 1 fw classid 1:101 tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 2 fw classid 1:102 tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 3 fw classid 1:103 tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 4 fw classid 1:104 tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 5 fw classid 1:105 tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 6 fw classid 1:106 tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 7 fw classid 1:107 tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 8 fw classid 1:108 tc filter add dev $UP_DEV protocol ip parent 1:0 prio 1 handle 9 fw classid 1:109 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 1 fw classid 1:101 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 2 fw classid 1:102 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 3 fw classid 1:103 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 4 fw classid 1:104 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 5 fw classid 1:105 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 6 fw classid 1:106 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 7 fw classid 1:107 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 8 fw classid 1:108 tc filter add dev $DOWN_DEV protocol ip parent 1:0 prio 1 handle 9 fw classid 1:109 ############################################################################### # Classify packets into flows # # Create classifier table iptables -t mangle -N classify iptables -t mangle -I POSTROUTING -j classify iptables -t mangle -I PREROUTING -j classify iptables -t mangle -I FORWARD -j classify iptables -t mangle -I OUTPUT -j classify iptables -t mangle -I INPUT -j classify # Do not classify traffic generated by ourselves to the local networks iptables -t mangle -A classify -s fw.firewalls -d $OFFICE -j RETURN iptables -t mangle -A classify -s fw.firewalls -d $NETCAFE -j RETURN iptables -t mangle -A classify -s fw.firewalls -d $TERMS -j RETURN iptables -t mangle -A classify -s fw.firewalls -d $OFFICE2 -j RETURN iptables -t mangle -A classify -s fw.foo.bar -d $OFFICE -j RETURN iptables -t mangle -A classify -s fw.foo.bar -d $NETCAFE -j RETURN iptables -t mangle -A classify -s fw.foo.bar -d $TERMS -j RETURN iptables -t mangle -A classify -s fw.foo.bar -d $OFFICE2 -j RETURN # SSH Interactive and ORACLE iptables -t mangle -A classify -p tcp --dport 22 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --dport 22 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -p tcp --sport 22 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --sport 22 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -p tcp --dport 1521 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --dport 1521 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -p tcp --sport 1521 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --sport 1521 --match tos --tos 0x10 -j RETURN
iptables -t mangle -A classify -p tcp --dport 1522 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --dport 1522 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -p tcp --sport 1522 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --sport 1522 --match tos --tos 0x10 -j RETURN
iptables -t mangle -A classify -p tcp --dport 1523 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --dport 1523 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -p tcp --sport 1523 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --sport 1523 --match tos --tos 0x10 -j RETURN # VNC Interactive iptables -t mangle -A classify -p tcp --sport 5901 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --sport 5901 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -p tcp --dport 5901 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --dport 5901 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -p tcp --sport 5902 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --sport 5902 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -p tcp --dport 5902 --match tos --tos 0x10 -j MARK --set-mark 1 iptables -t mangle -A classify -p tcp --dport 5902 --match tos --tos 0x10 -j RETURN iptables -t mangle -A classify -d $HOSTED_SERVERS -p tcp --dport 2222:2227 -j MARK --set-mark 1 iptables -t mangle -A classify -d $HOSTED_SERVERS -p tcp --dport 2222:2227 -j RETURN iptables -t mangle -A classify -s $HOSTED_SERVERS -p tcp --sport 2222:2227 -j MARK --set-mark 1 iptables -t mangle -A classify -s $HOSTED_SERVERS -p tcp --sport 2222:2227 -j RETURN #SERVERS<->OFFICE iptables -t mangle -A classify -d server.foo.bar -p udp --dport 500 -j MARK --set-mark 2 iptables -t mangle -A classify -d server.foo.bar -p udp --dport 500 -j RETURN iptables -t mangle -A classify -s server.foo.bar -p udp --dport 500 -j MARK --set-mark 2 iptables -t mangle -A classify -s server.foo.bar -p udp --dport 500 -j RETURN iptables -t mangle -A classify -d server.foo.bar -p ah -j MARK --set-mark 2 iptables -t mangle -A classify -d server.foo.bar -p ah -j RETURN iptables -t mangle -A classify -s server.foo.bar -p ah -j MARK --set-mark 2 iptables -t mangle -A classify -s server.foo.bar -p ah -j RETURN iptables -t mangle -A classify -d $HOSTED_SERVERS -p tcp --sport 873 -j MARK --set-mark 6 iptables -t mangle -A classify -d $HOSTED_SERVERS -p tcp --sport 873 -j RETURN iptables -t mangle -A classify -s $HOSTED_SERVERS -p tcp --dport 873 -j MARK --set-mark 6 iptables -t mangle -A classify -s $HOSTED_SERVERS -p tcp --dport 873 -j RETURN iptables -t mangle -A classify -s $SERVERS -d $OFFICE -j MARK --set-mark 2 iptables -t mangle -A classify -s $SERVERS -d $OFFICE -j RETURN iptables -t mangle -A classify -d $SERVERS -s $OFFICE -j MARK --set-mark 2 iptables -t mangle -A classify -d $SERVERS -s $OFFICE -j RETURN # SSH Bulk (SCP) iptables -t mangle -A classify -p tcp --dport 22 -j MARK --set-mark 3 iptables -t mangle -A classify -p tcp --dport 22 -j RETURN iptables -t mangle -A classify -p tcp --sport 22 -j MARK --set-mark 3 iptables -t mangle -A classify -p tcp --sport 22 -j RETURN # INET<->FW2 iptables -t mangle -A classify -s $INET -d fw2.firewalls -j MARK --set-mark 4 iptables -t mangle -A classify -s $INET -d fw2.firewalls -j RETURN iptables -t mangle -A classify -d $INET -s fw2.firewalls -j MARK --set-mark 4 iptables -t mangle -A classify -d $INET -s fw2.firewalls -j RETURN # INET<->OFFICE iptables -t mangle -A classify -s $INET -d $OFFICE -j MARK --set-mark 5 iptables -t mangle -A classify -s $INET -d $OFFICE -j RETURN iptables -t mangle -A classify -d $INET -s $OFFICE -j MARK --set-mark 5 iptables -t mangle -A classify -d $INET -s $OFFICE -j RETURN # INET<->NETCAFE iptables -t mangle -A classify -s $INET -d $NETCAFE -j MARK --set-mark 6 iptables -t mangle -A classify -s $INET -d $NETCAFE -j RETURN iptables -t mangle -A classify -d $INET -s $NETCAFE -j MARK --set-mark 6 iptables -t mangle -A classify -d $INET -s $NETCAFE -j RETURN # INET<->TERMS iptables -t mangle -A classify -s $INET -d $TERMS -j MARK --set-mark 7 iptables -t mangle -A classify -s $INET -d $TERMS -j RETURN iptables -t mangle -A classify -d $INET -s $TERMS -j MARK --set-mark 7 iptables -t mangle -A classify -d $INET -s $TERMS -j RETURN # INET<->OFFICE2 iptables -t mangle -A classify -s $INET -d $OFFICE2 -j MARK --set-mark 8 iptables -t mangle -A classify -s $INET -d $OFFICE2 -j RETURN iptables -t mangle -A classify -d $INET -s $OFFICE2 -j MARK --set-mark 8 iptables -t mangle -A classify -d $INET -s $OFFICE2 -j RETURN # OTHER iptables -t mangle -A classify -j MARK --set-mark 9 # Log unclassified packets here?! iptables -t mangle -A classify -j RETURN