.titleBar { margin-bottom: 5px!important; }

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

Dieses Thema im Forum "Linux Software-Router" wurde erstellt von udosw, 1 Apr. 2005.

  1. udosw

    udosw Aktives Mitglied

    Registriert seit:
    20 März 2004
    Beiträge:
    1,114
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Hannover
    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
     
  2. stefanmoench

    stefanmoench Guest

    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?
     
  3. britzelfix

    britzelfix Gesperrt

    Registriert seit:
    28 Mai 2004
    Beiträge:
    1,099
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Braunschweig
    @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.
     
  4. udosw

    udosw Aktives Mitglied

    Registriert seit:
    20 März 2004
    Beiträge:
    1,114
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Hannover
    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
     
  5. traxanos

    traxanos Mitglied

    Registriert seit:
    15 Juli 2004
    Beiträge:
    486
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  6. udosw

    udosw Aktives Mitglied

    Registriert seit:
    20 März 2004
    Beiträge:
    1,114
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Hannover
    @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:

  7. stefanmoench

    stefanmoench Guest

    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.
     
  8. traxanos

    traxanos Mitglied

    Registriert seit:
    15 Juli 2004
    Beiträge:
    486
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  9. stefanmoench

    stefanmoench Guest

    @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¤
     
  10. traxanos

    traxanos Mitglied

    Registriert seit:
    15 Juli 2004
    Beiträge:
    486
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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 ;)
     
  11. britzelfix

    britzelfix Gesperrt

    Registriert seit:
    28 Mai 2004
    Beiträge:
    1,099
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Braunschweig
    @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
     
  12. udosw

    udosw Aktives Mitglied

    Registriert seit:
    20 März 2004
    Beiträge:
    1,114
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Hannover
    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
     
  13. klaymen

    klaymen Neuer User

    Registriert seit:
    9 Sep. 2004
    Beiträge:
    57
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  14. Jonny

    Jonny Neuer User

    Registriert seit:
    30 Dez. 2004
    Beiträge:
    189
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  15. traxanos

    traxanos Mitglied

    Registriert seit:
    15 Juli 2004
    Beiträge:
    486
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    "modprobe sch_hfsc" und dann nochmal mit "tc" ;)
     
  16. Jonny

    Jonny Neuer User

    Registriert seit:
    30 Dez. 2004
    Beiträge:
    189
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Schon längst versucht.
     
  17. traxanos

    traxanos Mitglied

    Registriert seit:
    15 Juli 2004
    Beiträge:
    486
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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 ;)
     
  18. klaymen

    klaymen Neuer User

    Registriert seit:
    9 Sep. 2004
    Beiträge:
    57
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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:

    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
     
  19. Jonny

    Jonny Neuer User

    Registriert seit:
    30 Dez. 2004
    Beiträge:
    189
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    @klaymen
    Hast Du nur den "modprobe sch_hfsc" gemacht oder noch etwas anderes?
     
  20. klaymen

    klaymen Neuer User

    Registriert seit:
    9 Sep. 2004
    Beiträge:
    57
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    @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.