SipShaper: QoS mit HFSC - bei mir klappt's super!

udosw

Aktives Mitglied
Mitglied seit
20 Mrz 2004
Beiträge
1,114
Punkte für Reaktionen
0
Punkte
36
Sorry, dass ich noch einen Thread zu dem Thema aufmache, aber ich bin richtig froh, dass ich das endlich hinbekommen habe.

Nachdem ich mich tagelang mit nicht wirklich funkionierendem QoS auf meinem Asterisk-Linux-Router rumgequält habe, half mir der Hinweis von traxanos http://www.ip-phone-forum.de/forum/viewtopic.php?p=100866#100866 und der dort angesprochene Artikel im Linux-Magazin auf die Sprünge: Man muss HFSC verwenden, weil VoIP nicht nur zugesicherte Bandbreite sondern auch geringe Verzögerungszeiten braucht.

Ergebnis meiner Versuche ist das folgende Script, welches bei mir den durchschlagenden Erfolg brachte: Während sonst, auch bei Einsatz verschiedene QoS-Scripte bei Up- und/oder Download das Gegenüber bei einer VoIP-Verbindung nur noch Aussetzer und extreme Verzögerungen hatte, geht es hiermit super: Kaum Aussetzer und kaum merkliche Verzögerungen.

Code:
#!/bin/sh
#
# SipShaper v0.01beta
# VoIP Traffic Shaper for 1024/128Kbit/s ADSL Line
#
# Written by Udo Schacht-Wiegand (2005-04-01) 
#
# based on MYSHAPER from Dan Singletary (8/7/02)
# http://www.nslu2-linux.org/wiki/HowTo/EnableTrafficShaping
# and on phone-man's script
# http://www.ip-phone-forum.de/forum/viewtopic.php?p=100371#100371
# and on the Linux Magazine 02/05 article p.28
# 
# Please mail comments and improvements to sipshaper at udo dot comlink dot org


# Set your outgoing interface and upload rate (in kbit/s) here
DEV=ppp0
RATEUP=128

# end of configuration options

######################
# show status and exit
######################

if [ "$1" = "status" ]
then
        echo "[qdisc]"
        tc -s qdisc show dev $DEV

        echo "[class]"
        tc -s class show dev $DEV

        echo "[filter]"
        tc -s filter show dev $DEV

        echo "[iptables]"
        iptables -t mangle -L SIPSHAPER -v -x 2> /dev/null
        exit

fi

######################
# default: start it  #
######################

# Reset everything to a known state (cleared)
tc qdisc del dev $DEV root    2> /dev/null > /dev/null

# Flush and delete tables
iptables -t mangle --delete POSTROUTING -o $DEV -j SIPSHAPER 2> /dev/null > /dev/null
iptables -t mangle --flush        SIPSHAPER 2> /dev/null > /dev/null
iptables -t mangle --delete-chain SIPSHAPER 2> /dev/null > /dev/null

######################
# stop it and exit 
######################

if [ "$1" = "stop" ] 
then 
        echo "Shaping removed on $DEV."
        exit
fi

######################
# set up shaping
######################

# add HFSC root qdisc
tc qdisc add dev $DEV root handle 1: hfsc default 10

# add main rate limit class
tc class add dev $DEV parent 1: classid 1:1 hfsc sc rate ${RATEUP}kbit ul rate ${RATEUP}kbit

# keep it simple: two classes only
tc class add dev ppp0 parent 1:1 classid 1:10 hfsc sc umax 1500b dmax 53ms rate 40kbit ul rate ${RATEUP}kbit
tc class add dev ppp0 parent 1:1 classid 1:11 hfsc sc umax 1500b dmax 30ms rate 80kbit ul rate ${RATEUP}kbit

# add SIPSHAPER chain to the mangle table in iptables 
iptables -t mangle --new-chain SIPSHAPER
iptables -t mangle --insert POSTROUTING -o $DEV -j SIPSHAPER

# Filter for voip packets
tc filter add dev $DEV parent 1: prio 1 protocol ip handle 1 fw flowid 1:11 

iptables -t mangle -A SIPSHAPER -p udp --sport 5060 -j MARK --set-mark 1   # SIP High
iptables -t mangle -A SIPSHAPER -p udp --dport 5060 -j MARK --set-mark 1   # SIP High

iptables -t mangle -A SIPSHAPER -p udp --sport 4569 -j MARK --set-mark 1   # IAX High 
iptables -t mangle -A SIPSHAPER -p udp --dport 4569 -j MARK --set-mark 1   # "" 

iptables -t mangle -A SIPSHAPER -p udp --sport 10000:11000 -j MARK --set-mark 1   # RTP High 
iptables -t mangle -A SIPSHAPER -p udp --dport 10000:11000 -j MARK --set-mark 1   # "" 

# also put ssh in this chain (interactive)
iptables -t mangle -A SIPSHAPER -p tcp --dport ssh -j MARK --set-mark 1    # secure shell
iptables -t mangle -A SIPSHAPER -p tcp --sport ssh -j MARK --set-mark 1    # secure shell

echo SipShaper started on $DEV with ${RATEUP}kbit/s upload rate.
#end

Das Script ist mit nur zwei chains bewusst einfach gehalten, sicher kann man da im Detail noch viel optimieren. Über Rückmeldungen würde ich mich freuen.

Bei mir läuft es auf einem Debian (SID) System mit Kernel-Image 2.6.10. Auf derselben Maschine läuft der Asterisk.

Udo
 
kann ich einen fli4l standartkonfiguration nehmen mit einer karte für dsl und einer für lan wo dann die pcs u. asterisk dranhängen und einfach dein script starten!? müsste das so funktionieren?
 
@udosw

Super Skript, wenn's funktioniert. Ich hatte es noch nicht
ausgiebig testen könen, aber schon eingebaut. :)

Es wäre nett, wenn Du alle ppp0 gegen $DEV austauschen
würdest. Die RTP Ports als Variable nach oben ziehen
und das ganze an voip-info.org posten, damit sich noch
mehr freuen können.

Gruß
britzelfix

PS: natürlich auch zu den Files im lokalen Downloadbereich.
 
stefanmoench schrieb:
kann ich einen fli4l standartkonfiguration nehmen mit einer karte für dsl und einer für lan wo dann die pcs u. asterisk dranhängen und einfach dein script starten!? müsste das so funktionieren?
Ich kenne fli4l nicht so genau, wenn das auf einem 'normalen' Linux läuft müsste es gehen, denn iptables und tc sind ja 'normale' Linux-Befehle. Der Kernel muss natürlich HFSC unterstützen.

Udo
 
Wenn mich nicht alles täucht verwenden erst die neuen Kernel HFSC.
Die Fli4l Version selbst ist glaub ich a) zualt und b) müsste man Sich das Modul erst nachkompelieren.
 
@britzelfix
Danke für den Hinweis. Hier kommt die nächste Version. Man kann jetzt einfach eine Reihe von Ports (oder Port:Ranges) und auch IPs angeben, die komplett bevorzugt werden (z.B. für VoIP-Geräte, die hinter dem Router hängen.

Edit 4.4.05: ACHTUNG: In diesem Script werden nur UDP-Ports berücksichtigt, die Angabe von ssh (22) macht hier also keinen Sinn!

Update kommt wg. Zeitmangel erst Ende der Woche.

Udo
 

Anhänge

  • sipshaper.txt
    3.1 KB · Aufrufe: 246
was benutzt denn du für einen "debian-linux-router"??

ich brauch halt dhcp + pppoe und portforwarding usw., des hätte fli4l dringehabt ohne großen aufwand. aber der kernel scheint wirklich rel. alt zu sein.
 
Ich slebst bin Astaro Fan. Ich werde die Tage versuchen ein Update zu bauen wenn der Kernel von Astaro das zu läßt. Allerdings habe ich hier die Möglichkeit evtl einen eigenen Kernel zu bauen. Die Installation wird dann allerdings etwas schwieriger.
 
@traxanos:

das ist ja dann aber wohl eher eine high-end lösung und nicht für den privatanwender nützlich oder!? weil die ganzen astaro lösungen kosten ja alle > 500¤
 
Nein, es gibt eine kostenlose Privatanwenderversion.
Es ist eine Linuxversion. Allerdings wird ein Rechner als
Router benötigt mit 2 Netzwerkkarten.

Man hat 10 IP-Adresse frei und die Viren & Contentfilter sind abgeschaltet.

Mal schauen. Ist auf jeden Fall ein 1A Tool ;)
 
@udosw

Jo, danke. Wie hast Du denn das Skript getestet?
Ich habe mehrere down- und uploads gestartet,
damit das Netz voll ausgelastet ist, dann während
eines Gesprächs das Script gestartet und gestoppt.
Keine Unterschiede!?!

Oder ist das nur subjektiv? :)

Gruß
britzelfix
 
britzelfix schrieb:
Jo, danke. Wie hast Du denn das Skript getestet?
Ich hatte vor dem Script schon wondershaper und astshape (beide benutzen HTB glaube ich) getestet. Wenn ich während des Gesprächs einen Up- und/oder Download machte, war das Gespräch mehr oder minder stark gestört, jedenfalls war es nicht akzeptabel.

Ich hab dann testweise immer je einen Up- und Download gleichzeitig laufen lassen. Mit meinem Script war das Gespräch dann OK.

Mehrere Up/Downloads wäre noch eine Idee. Außerdem sind zwei gleichzeitige VoIP-Gespräche möglicherweise noch ein Problem, ich hatte aber da noch nicht genügend Gelegenheiten zum Testen.

@stefanmoench:
Einfach ein script, welches verschiedene iptables-Befehle aufruft, gibt ja diverse Anleitungen im Netz. Für DHCP/DNS guck dir mal dnsmasq an. Gibt's auch als Debian-Paket. Und pppoeconf gibt's auch.

Udo
 
Hmm, ich würde das ja auch gerne probieren, aber offenbar unterstützt mein Linux Kernel (oder tc) HFSC nicht... ich benutze Suse Linux 9.1 und habe das iproute2-2.4.7-861 package installiert. Leider finde ich in der Linux SDB absolut keine Infos betreffend HFSC, nicht einmal, ob dies von Suse 9.2 unterstützt würde. Kann mir da eventuell jemand weiterhelfen, ob (und von wo) man hfsc nachrüsten könnte? Vielleicht braucht es ja nur einen Patch in tc - keine Ahnung, ob das im Kernel ist oder nicht. "gunzip -c /proc/config.gz | grep HFSC" liefert allerdings "CONFIG_NET_SCH_HFSC=m", was eigentlich heisst, es wäre im Kernel drin? Aber 'tc' scheint hfsc nicht zu erkennen ("Unknown qdisc "hfsc", hence option "default" is unparsable" und "Error: Qdisc "hfsc" is classless.")


Danke im voraus, klaymen

PS: in meinem Fall habe ich die Linux Box als Router/Firewall zwischen Internet (mit Kabelmodem) und Intranet (wo auch ein Grandstream hängt); dieselbe Box hat auch Asterisk am Laufen, d.h. Asterisk und Traffic Shaping wären auf derselben Maschine (die auch Router ist). Ich habe mit iptables etc leider keine Erfahrung, aber ich frage mich, ob es nciht irgendwie möglich wäre, dass tc die Pakete, welche vom (lokalen) asterisk Prozess verschickt wurde, direkt erkennen könnte statt mit UDP Portnummern, die ja nicht eindeutig sein? Also eine "zuverlässige" Methode, Voip Pakete von anderen Paketen zu unterscheiden.
 
Ich habe das gleiche Problem... übrigens mit SuSE 9.2. Das Modul ist vorhanden und lässt sich auch laden. Nur "tc" meckert mit der besagten Fehlermeldung.
 
"modprobe sch_hfsc" und dann nochmal mit "tc" ;)
 
mmhhh dann weis ich es net ;(
leider.

Ich bin ja nicht der einzige hier im Forum der dir helfen kann ;)
Allerdings könnte ich mir vorstellen das TC zu alt ist. HFSC ist erst
seit der Version 2.4.25 verfügbar. Und so alt ist der Kernel nicht ;)
 
Prima, jetzt klappts mit dem hsfc, danke! :)

Allerdings scheint die tc Syntax verschieden zu sein, mein tc erlaubt nur 'rt','ls' und 'ul', nicht 'sc' (ich weiss noch nciht malm was die Kürzel bedeuten - wenn ichs rausfinde, kann ichs vielleicht selber fixen). konkret:

+ tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 96kbit ul rate 96kbit
HFSC: What is "sc" ?
Usage: ... hfsc [ rt SC ] [ ls SC ] [ ul SC ]

SC := [ [ m1 BPS ] [ d SEC ] m2 BPS

m1 : slope of first segment
d : x-coordinate of intersection
m2 : slope of second segment

Alternative format:

SC := [ [ umax BYTE ] dmax SEC ] rate BPS

umax : maximum unit of work
dmax : maximum delay
rate : rate

Ich denke also, "ul rate 96kbps" ist ok, aber "sc rate 96kbps"? Sollte das "ls rate .." oder "rt rate ..." heissen?

Sorry die wahrscheinlich dumme Frage .-) Klaymen
 
@klaymen
Hast Du nur den "modprobe sch_hfsc" gemacht oder noch etwas anderes?
 
@Jonny: Im Prinzip ja... allerdings habe ich heute Nachmittag, bevor ich das las, noch etwas Anderes versucht, und vielleicht hängt es damit zusammen, dass es bei mir klappte. Ich bin unter http://trash.net/~kaber/hfsc/tc.gz auf ein Executable einer anderen tc Implementatio ngestossen und dachte, ich könnte die ja zumindest mal probieren - ich vermutete halt, tc aktiviere einfach das Kernel Modul nicht. Und in der Tat funktionierte die auch, aber mit obiger Fehlermeldung. Als ich dann die Sache wegen modprobe las, versuchte ich danach wieder das Original-Executable, und das funktionierte dann auch (aber eben mit obiger Fehlermeldung). Natürlich weiss ich nicht, ob das nun wegen dem modprobe klappte, oder weil ich vielleicht vorher mit dem anderen tc Executable etwas getriggered habe. Aber probier das Ding mal aus, vielleicht hilft es bei Dir ja weiter...

[Edit:] Asche über mein Haupt... es lag in der Tat nicht am modprobe, sondern an obigem tc-Executable (ich habe es nicht richtig wieder entfernt, d.h., ich habe aus Versehen nicht das Original-Executable benutzt). Mit anderen Worten: das Executable auf trash.net konnte bei mir hfsc ansprechen, womit klar ist, dass es nicht am Kernel, sondern an tc liegt. Nur eben... leider scheint es eine andere Syntax zu benutzen. Ansonsten (z.B. für qdisc htp) scheint es zu funktionieren. Vielleicht gibt es ja orgendwo noch ein "besseres" tc? Pass auf jeden Fall auf, wenn Du sipshaper mit diesem tc ansprichst - das Interface ist danach "zu", weil ja keine qdisc installiert wurde, der Rest aber durchlief. Man muss dann via Konsole oder ein anderes Interface tc wieder deaktivieren.
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
244,832
Beiträge
2,219,108
Mitglieder
371,534
Neuestes Mitglied
vignajeanniegolabek
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.