Sie sind nicht angemeldet.

[Tipps & Tricks] Qos mit iptables & tc

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

27.12.2007, 19:55

Qos mit iptables & tc

So, nachdem mich maggu gebeten hat, hab ich ein Tut zu Qos hier geschrieben. ;)

Was brauchen wir:
iptables "net-firewall/iptables"
tc "sys-apps/iproute2"

bei bedarf
l7-filter "net-misc/l7-filter"

Zum kernel:

Iptables muss auf jeden fall das "mark" target unterstützt. Dieses braucht man um die Pakete die die Firewall passieren zu makieren und verschiedenen Prioritäten (voip=prio1, torrent=prio4 zb) zuzuordnen.

Mit

Quellcode

1
iptables -m mark -h

siehst man bei iptables das mark target zur verfügung hat. Wenn nicht unter

Quellcode

1
Networking-->Networking options-->Network packet filtering framework (Netfilter) -->Core Netfilter Configuration 

"MARK target support" auswählen. Am besten als Modul.
Für eine gute Firewall braucht man natürlich wesentlich mehr, jedoch ist für QoS dieses "mark" besonders wichtig.

Als nächstes braucht man die qos Module. Diese gehören nicht zu iptables. QoS wird mittles dem befehl "tc" durchgeführt, welches in dem Paket "sys-apps/iproute2" enthalten ist.

Die Module, sind im kernel unter (kernel 2.6.22)

Quellcode

1
Networking-->Networking options-->QoS and/or fair queueing
zu finden.
Hier kann man mehrere Module auswählen. Jedes Modul funktioniert etwas anders.
Ich benutze für mein Tut das "Hierarchical Fair Service Curve (HFSC)" Modul, welches auch sehr gut für VoIP sein soll. Leider kann ich dies nicht beurteilen, da ich kein VoIP habe.
Trotzdem muss man auch noch andere Modul auswählen da man auch zb SFQ braucht. Am besten einfach alle als Modul auswählen.

Desweiteren gibt es noch die "net-misc/l7-filter" Filter.
Mit diesem iptables "addon" werden Protokolle wie zb torrent, emule,kazza oder auch Spiele wie WoW,CS und jede menge anderer erkannt, welches wesentlich einfacher macht diese zu markieren und zu priorisieren.

Installieren geht folgendermaßen.

Quellcode

1
emerge iptables emerge l7-filter

im kernel unter

Quellcode

1
Networking-->Networking options-->Network packet filtering framework (Netfilter) -->Core Netfilter Configuration 

das neue "layer 7 match support" auswählen (ich habs als modul)
kernel neu komplimieren - installieren - neu booten.
und nochmals

Quellcode

1
emerge iptables

durchführen.
Mit

Quellcode

1
iptables -m layer7 -h

kann man wieder überprüfen ob es funktioniert.


Nun zum Script:

Als erstes defenieren wir einiges.

Quellcode

1
2
3
TC="/sbin/tc" 
IPTABLES="/sbin/iptables"
ECHO="/bin/echo"

Damit die Befehle gefunden werden.

Quellcode

1
2
3
INET=eth1
INTERN=eth0
DMZ=eth2

Damit die Interfaces gefunden werden.

Quellcode

1
2
3
4
5
6
7
8
9
UPRATE="320kbit"
P1ULMAX="320kbit"
P1ULMIN="290kbit"
P2ULMAX="290kbit"
P2ULMIN="120kbit"
P3ULMAX="220kbit"
P3ULMIN="80kbit"
P2PMAX="100kbit"
P2PMIN="56kbit"

Hier werden die uploadraten definiert. Wie man sieht habe ich eine max "UPRATE" von 320kbit.
Danach kommen noch 4 Prioritäten, wo jeweils eine max uploadrate und eine min uploadrate definiert wird (P1ULMAX & P1ULMIN). "P2PMAX" und "P2PMIN" ist zb die uploadrate für p2pverkehr. Soll heißen das man max mit 100kbit uploaden kann, jedoch, sollte andere uploadverkehr sein, sind nur 56kbit zugesichert.
Das alles kann man natürlich seinen Bedürfnissen anpassen. Zb könnte man auch noch mehr Prioritäten als 4 machen, oder auch weniger. Die "UPRATE" muss man natürlich denn eigenen upraten anpassen.

Quellcode

1
2
3
4
PRIO1="1"
PRIO2="2"
PRIO3="3"
PRIO4="4"

Für die Markierungen.

Quellcode

1
POP3="110,995"

POP3 Port's definieren.



Nun fangen wir mit dem markieren an.

Quellcode

1
$IPTABLES -t mangle -A POSTROUTING -o $INET -j MARK --set-mark $PRIO3

Alles was nicht irgendwo anders eingeteilt wird bekommt PRIO3.

PRIO1:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
$IPTABLES -t mangle -A POSTROUTING -o $INET -p icmp -j MARK --set-mark $PRIO1
# ssh
$IPTABLES -t mangle -A POSTROUTING -o $INET -p tcp --dport 22 -j MARK --set-mark $PRIO1
# ICQ
$IPTABLES -t mangle -A POSTROUTING -o $INET -p tcp --dport 5190 -j MARK --set-mark $PRIO1
# Rsync
$IPTABLES -t mangle -A POSTROUTING -o $INET -p tcp --dport 873 -j MARK --set-mark $PRIO1
# irc
$IPTABLES -t mangle -A POSTROUTING -o $INET -m layer7 --l7proto irc -j MARK --set-mark $PRIO1
# World of Warcraft
$IPTABLES -t mangle -A POSTROUTING -o $INET -m layer7 --l7proto worldofwarcraft -j MARK --set-mark $PRIO1
# Teamspeak
$IPTABLES -t mangle -A POSTROUTING -o $INET -m layer7 --l7proto teamspeak -j MARK --set-mark $PRIO1

Hier sieht man schon das ich hier denn layer7 filter für Protokolle wie zb Teamspeak, WoW und irc benutze. Sie alle erhalten PRIO1

PRIO2:

Quellcode

1
2
3
4
for MPC in $MEE
do
$IPTABLES -t mangle -A POSTROUTING -s $MPC -o $INET -j MARK --set-mark $PRIO2
done

;) Hier bekommen gewisse PCs PRIO2, meistens meine ;)

PRIO3:

Quellcode

1
2
3
4
5
6
7
8
# http/s/dns
$IPTABLES -t mangle -A POSTROUTING -o $INET -p tcp -m multiport --dport 80,443 -j MARK --set-mark $PRIO3
$IPTABLES -t mangle -A POSTROUTING -o $INET -p tcp --dport 53 -j MARK --set-mark $PRIO3
$IPTABLES -t mangle -A POSTROUTING -o $INET -p udp --dport 53 -j MARK --set-mark $PRIO3
# POP3
$IPTABLES -t mangle -A POSTROUTING -o $INET -p tcp -m multiport --dport $POP3 -j MARK --set-mark $PRIO3
# SMTP
$IPTABLES -t mangle -A POSTROUTING -o $INET -p tcp --dport 25 -j MARK --set-mark $PRIO3

Für http/s, dns, pop3,smtp gbits PRIO3

PRIO4:

Quellcode

1
2
3
4
5
6
$IPTABLES -t mangle -A POSTROUTING -o $INET -m layer7 --l7proto bittorrent -j MARK --set-mark $PRIO4
$IPTABLES -t mangle -A POSTROUTING -o $INTERN -m layer7 --l7proto bittorrent -j MARK --set-mark $PRIO4
$IPTABLES -t mangle -A POSTROUTING -o $INET -m layer7 --l7proto fasttrack -j MARK --set-mark $PRIO4
$IPTABLES -t mangle -A POSTROUTING -o $INTERN -m layer7 --l7proto fasttrack -j MARK --set-mark $PRIO4
$IPTABLES -t mangle -A POSTROUTING -o $INET -m layer7 --l7proto edonkey -j MARK --set-mark $PRIO4
$IPTABLES -t mangle -A POSTROUTING -o $INTERN -m layer7 --l7proto edonkey -j MARK --set-mark $PRIO4

Hier kommen die ganzen P2P Protokolle, wieder mit dem layer7 target. Für p2p ist ohnehin das layer7 Target wichtig, da man hier immer andere ports hat.
Oder man kann auch sagen das sämtlicher Verkehr unter PRIO4 kommt, nur gewisse Ports bekommen andere PRIOs. Somit wäre auch der P2P Verkehr sicher unter PRIO4.
Das alles kann man natürlich noch beliebig ausbauen. ;)




Nun zum QoS

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#alte Konfiguration verwerfen
$TC qdisc del dev $INET root

### Root qdisc anlegen
$TC qdisc add dev $INET root handle 1: hfsc default 40

### Hauptklasse anlegen
$TC class add dev $INET parent 1: classid 1:1 hfsc sc rate $UPRATE ul rate $UPRATE

### Unterklassen anlegen
# Unterklasse 1. Interaktive Protokolle wie ssh oder nicht tcp
$TC class add dev $INET parent 1:1 classid 1:10 hfsc sc umax 1488b dmax 60ms rate $P1ULMIN ul rate $P1ULMAX
# Unterklasse 2. Meine Pc's *hehe*
$TC class add dev $INET parent 1:1 classid 1:20 hfsc sc rate $P2ULMIN ul rate $P2ULMAX
# Unterklasse 3. Sonstiger Verkehr (nicht P2P)
$TC class add dev $INET parent 1:1 classid 1:30 hfsc sc rate $P3ULMIN ul rate $P3ULMAX
# Unterklasse 4.  P2P 
$TC class add dev $INET parent 1:1 classid 1:40 hfsc sc rate $P2PMIN ul rate $P2PMAX

### Verteilung der markierten Pakete auf die Unterklassen
$TC filter add dev $INET parent 1: protocol ip prio 0 handle $PRIO1 fw flowid 1:10
$TC filter add dev $INET parent 1: protocol ip prio 1 handle $PRIO2 fw flowid 1:20
$TC filter add dev $INET parent 1: protocol ip prio 2 handle $PRIO3 fw flowid 1:30
$TC filter add dev $INET parent 1: protocol ip prio 3 handle $PRIO4 fw flowid 1:40

### Warteschlangen
$TC qdisc add dev $INET parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $INET parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev $INET parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev $INET parent 1:40 handle 40: sfq perturb 10


Naja, ein bisschen beschrieben hab ich es eh schon *g*
Aber am besten man liest sich hierfür diese PDF Datei duch. Hier werden alle filter super erklärt: http://www.lug-salem.de/download/TC_desc.pdf

Hier noch weiter gute trafficshaping lösungen: http://de.gentoo-wiki.com/QoS
http://gentoo-wiki.com/HOWTO_Packet_Shaping
hier mittels HTB statt hfsc:
http://www.michaelrack.de/services/download/linux-qos/qos.html


Hab das ganze ein wenig überarbeitet. Sollte etwas Fehlen oder ich etwas falsch geschrieben haben, bitte melden, dann ändere ich es.
To mess up a Linux box, you need to work at it; to mess up your Windows box, you just need to work on it.