QOS mit Linux Router

brunaxxl

Neuer User
Mitglied seit
18 Okt 2004
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
Hallo an alle,

ich habe ein Problem damit QOS auf meinem Linux Roter einzurichten. Ich hoffe Ihr könnt mir helfen.

Etwas zur Konfiguration:

Internes Netz IP:192.168.1.1 wird über eth0 IP:192.168.1.2 ins Netz geleitet.
Handytone 486 IP:192.168.200.10 hängt als Client an eth2 IP:192.168.200.1.
Download 1 Mbit Upload 128 Kbit.
Auf dem Router selbst laufen http, ftp und mail Server auf die von Außen zugegriffen wird.
VOIP Account bei sipgate.
Alles funktioniert soweit auch super bis auf QOS. Ich wollte einfach nur 2 Klassen einrichten bei denen das Telefonieren immer Vorrang vor allem anderen Traffic hat.

Das was ich vorgearbeitet habe sieht so aus:

# root qdisc anlegen
tc qdisc add dev ppp0 root handle 1:0 htb default 11
# Hauptklasse
tc class add dev ppp0 parent 1:0 classid 1:1 htb rate 125kbit ceil 125kbit
# Klasse für VOIP
tc class add dev ppp0 parent 1:1 classid 1:10 htb rate 80kbit ceil 125kbit prio 0
# Klasse für Rest
tc class add dev ppp0 parent 1:1 classid 1:11 htb rate 45kbit ceil 125kbit prio 1

iptables -t mangle -A FORWARD -i eth2 -o ppp0 -p udp -s 192.168.200.10/32 --sport 1024: -d 0.0.0.0/0 --dport 5004:5007 -j MARK --set-mark 10

tc filter add dev ppp0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev ppp0 parent 1:0 prio 1 protocol ip handle 11 fw flowid 1:11

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Nur leider scheint das nicht zu funktionieren. Wenn jemand Verbesserungsvorschläge hat oder ein vertiges Script hat was für meine Situation passen würde, bitte posten.

Gruß Peter
 
Nach tagelangem Rumexperimentieren und Anrufen, sieht mein Script nun folgendermaßen aus:

Code:
#!/bin/sh

#Alles loeschen
iptables -F -t mangle
tc qdisc del dev ppp0 root    2> /dev/null > /dev/null
tc qdisc del dev ppp0 ingress 2> /dev/null > /dev/null

# root qdisc anlegen
tc qdisc add dev ppp0 root handle 1:0 htb default 12 r2q 1
# Hauptklasse
tc class add dev ppp0 parent 1:0 classid 1:1 htb rate 115kbit ceil 115kbit
# Klasse fuer VoIP
tc class add dev ppp0 parent 1:1 classid 1:10 htb rate 91kbit ceil 115kbit prio 0
# Klasse fuer ACK
tc class add dev ppp0 parent 1:1 classid 1:11 htb rate 12kbit ceil 115kbit prio 1
# Klasse fuer Standard
tc class add dev ppp0 parent 1:1 classid 1:12 htb rate 12kbit ceil 115kbit prio 2

iptables -t mangle -A POSTROUTING -o ppp0 -p udp -s 192.168.200.10/32 -j MARK --set-mark 10
iptables -t mangle -A POSTROUTING -o ppp0 -p tcp -m length --length :64 -j MARK --set-mark 11

tc filter add dev ppp0 parent 1:0 prio 2 protocol ip handle 12 fw flowid 1:12
tc filter add dev ppp0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev ppp0 parent 1:0 prio 1 protocol ip handle 11 fw flowid 1:11

Damit funktioniert bei es Uploads schon mal besser als ohne. Ist gibt aber beim Gegenüber immer noch Aussetzer, so im 1 bis 2 Sekunden Takt. Hat jemand eine Idee, wie man das Ganze noch optimieren kann? Ich habe leider keine mehr. Oder sind 128 Kbit Upload einfach zu klein um damit gleichzeitig zu Telefonieren und mal ne Mail mit Anhang zu versenden?

Wenn es bei jemandem einwandfrei funktioniert, bitte helft mir, bin langsam am Verzweifeln. :(
 
Gibt es den hier niemanden der mir helfen könnte? :cry:
 
hi brunaxxl,

ich hab ein script, was bei mir ganz gut läuft. kann telefonieren, hab gute pings, surfe nebenbei, netradio ist an, der mldonkey macht seine arbeit und email kann ich auch noch verschicken ohne das es zu aussetzern kommt :).
habe noch zusätzlich den l7-filter integriert, somit muss ich mir um ports beim donkey keine gedanken machen, da er bis auf layer7-ebene prüft. feines teil.

du müsstest statt:
iptables -t mangle -o $DEV -A POSTROUTING -m layer7 --l7proto rtp \
-j MARK --set-mark 1

ein:
iptables -t mangle -o $DEV -A POSTROUTING -p tcp --sport $PORT <RTP-PORT> \
-j MARK --set-mark 1

eintragen. weiss jetzt allerdings nicht den port für RTP. das musst du überall da ändern, wo -m layer7 --l7proto steht.

htb wollte bei mir auch nicht richtig, hiermit geht es.

grüße
jj


mein script:
-------------

#!/sbin/runscript
#

# UPLINK 85% of the real Uplink
# DOWNLINK little bit more than half is good
#DOWNLINK=800
UPLINK=163
DEV=ppp0

start() {
ebegin "Starting Quality of Service"
# clean existing down- and uplink qdiscs, hide errors
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null

# clean the mangle table
iptables -t mangle -F POSTROUTING
iptables -t mangle -F OUTPUT


########## uplink #############

# Configure outbound ethernet connection
#ip link set dev $DEV txqlen 30
ip link set dev $DEV mtu 1500

# create queues
# install root HTB, point default traffic to 1:50:
#tc qdisc add dev $DEV root handle 1: htb default 1
tc qdisc add dev $DEV root handle 1: tbf rate ${UPLINK}kbit latency 1ms burst 1540

# shape everything at $UPLINK speed - this prevents huge queues in your
# DSL modem which destroy latency:
# tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit burst 6k
#tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit

tc qdisc add dev $DEV parent 1: handle 10: prio bands 5

tc qdisc add dev $DEV parent 10:1 handle 100: sfq perturb 10
tc qdisc add dev $DEV parent 10:2 handle 200: sfq perturb 10
tc qdisc add dev $DEV parent 10:3 handle 300: sfq perturb 10
tc qdisc add dev $DEV parent 10:4 handle 400: sfq perturb 10
tc qdisc add dev $DEV parent 10:5 handle 500: sfq perturb 10

# filters packets marked by iptables
tc filter add dev $DEV parent 10: protocol ip prio 1 handle 1 fw classid 10:1
tc filter add dev $DEV parent 10: protocol ip prio 2 handle 2 fw classid 10:2
tc filter add dev $DEV parent 10: protocol ip prio 3 handle 3 fw classid 10:3
tc filter add dev $DEV parent 10: protocol ip prio 4 handle 4 fw classid 10:4
tc filter add dev $DEV parent 10: protocol ip prio 5 handle 5 fw classid 10:5

########################################
# CLASS 1:10 / HIGH PRIO TRAFFIC / Voice-over-IP, Ping

# iptables -t mangle -o $DEV -A POSTROUTING -m layer7 --l7proto sip \
# -j MARK --set-mark 1
iptables -t mangle -o $DEV -A POSTROUTING -m layer7 --l7proto rtp \
-j MARK --set-mark 1

iptables -t mangle -o $DEV -A POSTROUTING -p icmp -j MARK --set-mark 1
iptables -t mangle -o $DEV -A POSTROUTING -p icmp -j RETURN


###########################################
# CLASS 1:20 / INTERACTIVE TRAFFIC / TOS Minimum Delay (ssh, NOT scp)

iptables -t mangle -o $DEV -A POSTROUTING -m layer7 --l7proto ssh \
-j MARK --set-mark 2


##########################################
# CLASS 1:30 / ACKS
# ACK: To speed up downloads while an upload is going on, put ACK packets in
# the interactive class:

iptables -t mangle -o $DEV -A POSTROUTING -p tcp \
-m length --length :64 -j MARK --set-mark 3


#############################################
# CLASS 1:40 / DEFAULT CLASS

# iptables -t mangle -o $DEV -A POSTROUTING -m layer7 --l7proto smtp \
# -j MARK --set-mark 4


#############################################
# CLASS 1:50 / LOW PRIO TRAFFIC / PEER-2-PEER

iptables -t mangle -o $DEV -A POSTROUTING -m layer7 --l7proto edonkey \
-j MARK --set-mark 5



########## downlink #############

# slow downloads down to somewhat less than the real speed to prevent
# queuing at our ISP. Tune to see how high you can set it.
# ISPs tend to have *huge* queues to make sure big downloads are fast

# attach ingress policer:
#tc qdisc add dev $DEV handle ffff: ingress

# filter *everything* to it (0.0.0.0/0), drop everything that's
# coming in too fast:

#tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
# 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
eend $?
}

stop() {
ebegin "Stopping Quality of Service"
# clean existing down- and uplink qdiscs, hide errors
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null
#tc qdisc del dev $DEVIMQ root 2> /dev/null > /dev/null
tc qdisc del dev lo root 2> /dev/null > /dev/null
# clean the mangle table
#iptables -t mangle -F PREROUTING
#iptables -t mangle -F OUTPUT
iptables -F -t mangle
eend $?
}

status() {
iptables -vL POSTROUTING -t mangle
#iptables -t mangle -L -v -x
echo "--------------"
tc -s qdisc ls dev $DEV
echo "--------------"
tc -s class ls dev $DEV
}

restart() {
svc_stop
sleep 1
svc_start
}
 
Danke JayJay,

werde es gleich ausprobieren.
 
JayJay: Danke für das Script, werde es auch mal testen. Ist es eigentlich die aktuelle Version?
Bist du dir mit " --l7proto rtp" sicher? In den l7-filter Protokollen auf http://l7-filter.sourceforge.net/protocols finde ich nur sip, aber kein rtp...
 
Ich habe mir auch mal die Mühe gemacht und aus vorhandenen Skripten die (wie ich finde) besten Ansätze zusammengebaut: http://www.robert-peter.de/yats/
Habe dazu auch ein kleines HOWTO geschrieben, da die meisten Skripte die ich fand meistens schlecht dokumentiert waren.
Ich hoffe es hilft dem einen oder anderen sich mit, dem zugegeben nicht einfachen, QoS auseinanderzusetzen...

Noch eine Frage an die QoS Anwender hier: Wie würdet ihr eine prozentuale Aufteilung zwischen den Queues machen? Ich bin mit meiner noch nicht wirklich glücklich...
 
@b0fh:
Hallo und beste Grüße;
ich interessiere mich für das QoS, ober habe so gut wie NULL Ahnung. Wahrscheinlich ging es dir am Anfang ebenso.

Kannst Du mir bitte einen Tipp geben, wie ich Dein obengenanntes script
auf http://www.robert-peter.de/yats/ auf meinen Router mit Fli4l einbinden kann? Es gibt da ein opt QoS, da sind standardmäßige Einstellungen vorgegeben. Nur kann ich damit noch viel weniger anfangen als mit Deinem Script auf der Site.

Vielen Dank schonmal jetzt.

Grüße
Günter
 
ploieel: Kann dir leider nicht helfen, weiß nicht wie unter fli4l sowas eingebunden wird.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.