Re: adsl, debian, et BW

Top Page

Reply to this message
Author: Jérôme KIEFFER
Date:  
To: GUILDE
Subject: Re: adsl, debian, et BW
Salut Iso,

c'est bien TC qu'il faut utiliser, mais je sais pas trop si il y a des
masters dans le coin.

Je me souviens d'une conversation dans Crans.Info sur le sujet qui était
tres enrichissante, j'en ai gardé une copie (elle est pas dans BOCI), Sam
(krempp) est sans doute celui qui s'y connait le mieux. Cherche les info à
la source. Les Taketises utilisent aussi ca. Djoume saura t'aiguiller.

Sinon en gros : il faut utiliser HTB comme systeme de mise en queue, mais
un iptables `pas debian' est necessaire, ainsi qu'un TC patché.
j'ai ses scripts qui tournent sur Islay, tu peux les prendre, d'ailleur tu
as un compte sur Islay pour te servir (login = hornus visiblement)



-- 
Jérôme         __              __
              / _)            (_ \
     _.----._/ /   Dinosaurus   \ \_.----._
    /         /                  \         \
 __/ (  | (  |    Psykorigidus    |  ) |  ) \__
/__.-'|_|--|_|                    |_|--|_|`-.__\



PS : Je pars en vacances une semaine, peut être pourra on organiser une
Assemblée Générale courant mai, à moins que vous préfereriez lors la
prochaine bouffe (debut juin).

Ce sera l'occasion de
-redéfinir le bureau
-faire le point sur le web nouveau
-discuter des projets.
J'aimerais que chaque groupe prépare quelque chose pour l'install party
d'octobre. C'est le moment de se répartir le travail et de le laisser
murrir dans un coin. Le support à utiliser est libre mais je pense que le
mieux serait de l'adapter au public, et comme l'install party d'octobre
est à destination des étudiants, la conf est pas forcément ce qu'il y a de
mieux (ca ressemble a un cours), faut reflechir a faire cela autrement et
comment gerer la place pour que les divers groupes ne soit pas les uns sur
les autres.


On pourrait aussi organiser un déplacement au RMLL si certains sont
interessés (ou d'autres manifestations).

PPS : pour ceux qui veulent, le script de QoS (peut être deja posté ici
même)
#! /bin/sh
#    TC commands  SamuelK, 08/07/2000
#                 JeromeK, 09/2002
# Note : nécecite un tc et un iptables patché ainsi qu'un kernel 2.4.20
#
# note : X:Y : queue:class (X:0 pour une queue de base.)
#          X:   ==  X:0 est une queue handle.
# abbrevs : cl=class, qd=qdisc, fi=filter
# kBps == ko/s, pas bit !!
# 0xc = 01100, 0xd = 01101 
# donc c0 + 3d + 2 =ff (c+3=f et d+2=f)


#cf QOS howto: http://qos.ittc.ukans.edu/howto/,
# Adv-Routing Howto: http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO.html
# http://www-rp.lip6.fr/~lochin/qos/rapport.htm

# HTB : http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm
# IMQ : http://luxik.cdi.cz/~patrick/imq/#usage

DEV="ppp0"

upRate=16kbps
upWeb=4kbps
upDef=13kbps
MaxBurst=30k
MaxPing=1kbps
Ceil="ceil $upRate"

TC=/sbin/tc
IPT=/usr/local/sbin/iptables
msg=echo

clear () {
# clear iptables marks on mangle/output chain :
for chain in OUTPUT FORWARD; do
    $IPT -t mangle -F $chain
done


# delete root classes and queues to start form scratch :
for DEV in eth0 ppp0 ; do
$TC fi del dev $DEV root 2>/dev/null >&2
$TC cl del dev $DEV root 2>/dev/null >&2
$TC qd del dev $DEV root 2>/dev/null >&2
done;
echo traffic control cleared
}

start () {

echo Now make the new tc rules :
# alias -g "#"=true

echo -n " -> Initializing queue"
$TC qdisc add dev $DEV root handle 1: htb default 77
echo -n "."
$TC cl add dev $DEV parent 1: classid 1:1 htb burst $MaxBurst rate $upRate
echo -n "."
# 1:11 : classe P2P. prend ce qui reste..
# 1:77 default class, prio 3.
# 1:18 : web. prio 1, but limited, with huge burst allowed.
#    so when downloading by http, it will get overlimit and loose priority
# 1:25 : ping, ICMP, limité en débit à 1ko/s mais prio 0
# [ rappel : prio N passe avant prio N+1 ]
# [ rappel2: une classe enprunte au plus (ceil-rate), même si plus est dispo  ]


$TC class add dev $DEV parent 1:1 classid 1:11 htb rate 0.1kbps $Ceil prio 5
echo -n "."
$TC class add dev $DEV parent 1:1 classid 1:18 htb rate $upWeb  $Ceil prio 1 \
     burst $MaxBurst
echo -n "."
$TC class add dev $DEV parent 1:1 classid 1:25 htb rate $MaxPing  prio 0
echo -n "."
$TC class add dev $DEV parent 1:1 classid 1:77 htb rate $upDef $Ceil prio 3
echo "done"


$msg -n " -> Adding filters "

$TC filter add dev $DEV protocol ip prio 1 parent 1: handle 1 fw classid 1:11
echo -n "."
$TC filter add dev $DEV protocol ip prio 2 parent 1: handle 8 fw classid 1:18
echo -n "."
$TC filter add dev $DEV protocol ip prio 3 parent 1: handle 5 fw classid 1:25
echo -n "."
$TC filter add dev $DEV protocol ip prio 4 parent 1: handle 7 fw classid 1:77

echo "done"

$msg -n " -> And now iptables chains "

#IPT -t mangle -A OUTPUT -o ppp0 -m owner --pid-owner 18887    -j MARK --set-mark 1
#FTP anonyme  étiquetés "1" cad P2P (priorité 5, faible) (1:11)
$IPT -t mangle -A OUTPUT -o ppp0 -m owner --uid-owner 104 -j MARK --set-mark 1
echo -n "."
#paquets eDonkey sont étiquetés "1" cad P2P (priorité 5, faible) (1:11)
$IPT -t mangle -A OUTPUT -o ppp0 -m owner --uid-owner 1007 -j MARK --set-mark 1
echo -n "."
#pareil pour le rsync depuis islay : utilisé par debian-mirror
$IPT -t mangle -A OUTPUT -p tcp --dport 873 -j MARK --set-mark 1



# marks :  1<-> P2P (class 1:11)  8<-> WWW (class 1:18)
for chain in OUTPUT FORWARD; do 
#    $IPT -t mangle -A $chain -p tcp --dport 4661:4662 -j MARK --set-mark 1
#    $IPT -t mangle -A $chain -p tcp --sport 4661:4662 -j MARK --set-mark 1
    $IPT -t mangle -A $chain -p tcp --dport 80 --sport 1024: \
            -m state --state ESTABLISHED -j MARK --set-mark 8
    echo -n "."
#ssh (port 22) <-> 8 (class 1:18) prio 1
        $IPT -t mangle -A $chain -p tcp --dport 22 -j MARK --set-mark 8
    $IPT -t mangle -A $chain -p tcp --sport 22 -j MARK --set-mark 8
    echo -n "."        
#ping ( ICMP ) <-> 5 (class 1:25) prio 0
    $IPT -t mangle -A $chain -p icmp -j MARK --set-mark 5
    echo -n "."
done


# pour Vortex : tout ce qui sort du routeur est marqué P2P
#$IPT -t mangle -A OUTPUT -j MARK --set-mark 1

echo "done."
}

status () {
# 'tc -s -d <truc>' donne les details en plus, pour tout truc..
for DEV in eth0 ppp0; do
echo -e "\nINTERFACE $DEV"
echo -e "Queues on $DEV :"
$TC -s -d qd ls dev $DEV
echo -e "\nClasses on $DEV :"
$TC -s -d class ls dev $DEV
echo -e "\nFilters on $DEV :"
$TC fi ls dev $DEV
done
}


case "$1" in
    start)
        clear;start
        ;;
    stop)
    echo `who am i` "Stopped traffic rules" | logger -t tc.sh -p kern.warn
    clear
        ;;
    restart|force-reload)
        clear; start
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: /etc/init.d/tc.sh {start|status|stop|restart}"
    echo displaying rules as a default :
    status
        exit 1
        ;;
esac
exit 0