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

QOS mit Linux Router

Dieses Thema im Forum "Linux Software-Router" wurde erstellt von brunaxxl, 18 Okt. 2004.

  1. brunaxxl

    brunaxxl Neuer User

    Registriert seit:
    18 Okt. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    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:

    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
     
  2. brunaxxl

    brunaxxl Neuer User

    Registriert seit:
    18 Okt. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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. :(
     
  3. brunaxxl

    brunaxxl Neuer User

    Registriert seit:
    18 Okt. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Gibt es den hier niemanden der mir helfen könnte? :cry:
     
  4. JayJay

    JayJay Neuer User

    Registriert seit:
    25 Juni 2004
    Beiträge:
    9
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
    }
     
  5. brunaxxl

    brunaxxl Neuer User

    Registriert seit:
    18 Okt. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Danke JayJay,

    werde es gleich ausprobieren.
     
  6. b0fh

    b0fh Neuer User

    Registriert seit:
    25 März 2005
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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...
     
  7. JayJay

    JayJay Neuer User

    Registriert seit:
    25 Juni 2004
    Beiträge:
    9
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
  8. b0fh

    b0fh Neuer User

    Registriert seit:
    25 März 2005
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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...
     
  9. b0fh

    b0fh Neuer User

    Registriert seit:
    25 März 2005
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hm, irgendwie funktionieren weder das sip noch dein rtp pattern bei mir (die Pakete werden nicht als solche erkannt und wandern in die default Klasse). Nutze sipgate mit kphone.
     
  10. ploieel

    ploieel Aktives Mitglied

    Registriert seit:
    13 März 2005
    Beiträge:
    1,727
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    Vogtland
    @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
     
  11. b0fh

    b0fh Neuer User

    Registriert seit:
    25 März 2005
    Beiträge:
    5
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    ploieel: Kann dir leider nicht helfen, weiß nicht wie unter fli4l sowas eingebunden wird.