QoS pro Vasek Stodulka

Vasek Stodulka xvasek na gmail.com
Pondělí Leden 30 14:10:37 CET 2006


On Sat, 28 Jan 2006 17:01:17 GMT, Oqak <node.ch na centrum.cz> wrote:

>  No to ne, mam dobrou linku, zadne shit wifi, latence minimalni (ping 15ms), 
>  akorat je problem ze kdyz se zacpe uplink anebo downlink, tak ping vzroste.
> 
>  Proste resme ucpani na strane LAN a mejme WAN idealni (tj. udavane parametry 
>  od ISP jsou 100%).
> 
>  Pak uz to ma reseni, ne? Jenze Supershaper resi jen UPLINK, dokazal bys to 
>  vysperkovat i o Downlink + moznost pridat IP/port (pro zarizeni, co neumi 
>  TOS)? Pripadne to vydat nekde, kde za to redakce dobre zaplati.

OK, tady je můj pracně ukrývaný super - truper script, se kterým teď
slavnostně vycházím na světlo. Bude to fungovat, pokud splníš podnímku, že
celková rychlost linky v daném směru bude reálně o něco vyšší, než
daný strop. Pokud to nedodržíš, nebude to dělat vůbec nic.

Toto je příklad pouze pro jeden směr a řeší download za předpokladu, že
síťovka _dovnitř_ do LAN je eth0. Pokud chceš oba směry, můžeš si udělat
ještě jeden ten samý script a vyměnit interface. Základním přepokladem je
to, že packet můžeš zdržet jenom ve směru, kterým z routeru odchází, takže
download je pro LAN interface a upload se řeší na WAN, teda na bezdrátu,
pokud dobře chápu situaci.

Je to init script pro Fedoru nebo Debian, testováno na lidech.

#!/bin/sh
#
# chkconfig: - 11 89
# description: Single -- purpose settings of tc to server
# changes 19/08/2004 by Peter 


# Tady se stanuvuje interface, na ktery se to bude aplikovat
DEV=eth0


start () {
    echo -n "Starting QoS tc.init: "

    # Uklid
    tc qdisc del dev $DEV root

    # Vytvorit hlavni disciplinu
    tc qdisc add dev $DEV root handle 1: htb default 2

    # Napred stanovujeme pouze rychlosti a budujeme strom trid, nic dalsiho
    # nas nezajima.

    # Internetovy provoz (linka je 512kbit, strop stanovime na 465)
    tc class add dev $DEV parent 1: classid 1:1 htb rate 465kbit ceil 465kbit

    # Intranetovy traffic (aby jelo rychle vybirani posty z routeru a tak,
    # pokud by to mel byt ciste router, tak neni potreba. Pokud je parent
    # qdisc, tak si tridy v ramci qdiscu nepujcuji pasmo
    tc class add dev $DEV parent 1: classid 1:2 htb rate 10Mbit ceil 10Mbit

    # Ted navesim na tu hlavni internetovou tridu (1:1) ruzne dalsi tridy
    # tak, aby si mezi sebou mohly pujcovat. Trida muze mit podtridy, ale
    # tuto moznost nevyuzijeme a rozdelime jenom tech 465kbit

    # Pro prodejce:
    tc class add dev $DEV parent 1:1 classid 1:10 htb rate 128kbit ceil 465kbit
    # Do Zlina:
    tc class add dev $DEV parent 1:1 classid 1:11 htb rate 160kbit ceil 465kbit
    # Zbytek:
    tc class add dev $DEV parent 1:1 classid 1:12 htb rate 112kbit ceil 465kbit
    # SSH a Terminal Services: 
    tc class add dev $DEV parent 1:1 classid 1:13 htb rate 64kbit ceil 256kbit


    # V teto chvili mame definovany strom pro tridy a prichazi krok 2, kdy
    # si oznacime packety pro jednotlive tridy. To se da delat i pres u32
    # klasifikator, ale ten je hodne omezeny. Daleko vetsi moznosti nam
    # davaji iptables.

    # Jeste jeden hint: V mangle tabulce neplati, ze prvni pravidlo, ktere
    # na packet sedne, je zaroven i poslednim. Vzdy se pouziji vsechna
    # pravidla v chainu.

    # !!! Pozor, vicekrat oznaceny packet si pamatuje posledni cislo !!!

    # Vytvorim si chain
    iptables -t mangle -N internet

    # A ted to cisluju jak na bezicim pasu. Mam 4 tridy, do kterych to
    # chci rozhodit, coz je parametr MARK.

    # Terminal services a ssh, ktere nejde z lokani site
    iptables -t mangle -A internet -s ! 192.168.2.0/24 -p tcp --sport 22 -j MARK --set-mark 4
    iptables -t mangle -A internet -s ! 192.168.2.0/24 -p tcp --sport 3389 -j MARK --set-mark 4

    # Zbytek
    iptables -t mangle -A internet -s ! 192.168.2.0/24 -j MARK --set-mark 3

    # VPN
    iptables -t mangle -A internet -d 192.168.2.0/24 -s 192.168.1.1 -j MARK --set-mark 2
    iptables -t mangle -A internet -s 192.168.20.0/24 -d 192.168.2.88 -j MARK --set-mark 2

    # Prodejci
    iptables -t mangle -A internet -s ! 192.168.2.0/24 -d 192.168.2.101 -j MARK --set-mark 1
    iptables -t mangle -A internet -s ! 192.168.2.0/24 -d 192.168.2.112 -j MARK --set-mark 1
    iptables -t mangle -A internet -s ! 192.168.2.0/24 -d 192.168.2.115 -j MARK --set-mark 1

    # Tady rikam, ze pakety se maji prohnat jeste pres muj skvely chain
    iptables -t mangle -A POSTROUTING -o eth0 -j internet


    # Tak a ted mam na jedne strane strom HTB a na druhe strane krasne
    # oznacene pakety a potrebuju to nejak spojit dohromady. Jeste je tady
    # priorita, ale uz si presne nevzpominam jak funguje.

    tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
    tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 2 fw classid 1:11
    tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 3 fw classid 1:12
    tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 4 fw classid 1:13
    echo Ok.
}




stop () {
    echo -n "Stopping QoS tc: "
    # Smazat vse (nejlepe podle priority):
    tc filter del dev $DEV prio 3
    tc filter del dev $DEV prio 1
    tc qdisc del dev $DEV root
    iptables -t mangle -F
    iptables -t mangle -X internet
    echo Ok.
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        echo "Usage: tc.init {start|stop}"
        RETVAL=1
esac

exit $RETVAL

>  Jinak SPA2100 cenove klesla a jde koupit za 2200,- bez DPH, za router s
>  QoS + spickovou VoIP pro 2 linky super cena, ne?

	To jo. Vždycky se dá vybrat mezi jednoúčelovým zařízením a
počítačem, SPA2100 bude asi tichá a bude málo žrát a telefon bez problémů a
PC zase asi bude mít lepší možnosti nastavení QoS a firewallu a tak. Já
nejsem žádný jenom-linux-a-nic-jiného fanatik, takže si myslím, že se
Sipurou můžeš být spoustu let šťastný a spokojený a ta cena je fakt dobrá.
:) Já zase potřebuju trochu chytřejší router, takže mám RouterBoard a SIP
budu řešit až uvnitř sítě.

PS: Doufám, že to ten script nepozalamuje.

-- 
Vašek Stodůlka
tel.: +420 608 200 860


Další informace o konferenci Linux