# [Réseau - tc] Limiter la bande passante

## BaNaNe

Bonsoir à tous!

J'utilise actuellement le script TorrentFlux sur mon serveur de fichiers pour gérer mes torrents (des trucs légaux, comme notre très cher liveCD gentoo :p). Comme mon FAI ne comptabilise pas l'upload dans son quota (sisi, j'habite dans un petit pays où il y a de bêtes quota sur les connections ADSL...), j'en fais profiter la communauté.

Le problème est que je ne veux pas que ma connection devienne inutilisable tellement les torrents upload des données. TorrentFlux permet de limiter la bande passante en upload par torrents donc, si je limite à 10ko/s et que j'ai 4 torrents en cours, l'upload pourrait monter à 40Ko/s.

Je voudrais pouvoir limiter la bande passante de tout les torrents d'un coup à 10-15Ko/s (ou plus, tant que le surf n'en souffre pas). 

[/code]

J'ai trouvé des info à propos du QoS, traffic shapping et le programme tc.

Le serveur de fichiers qui fait tourner les torrents possède une interface (eth0) et est derrière un routeur tout à fait normal (un machin en plastique grand public)

J'ai écrit le petit script suivant : 

```

#!/bin/bash

# Supprime les files déja crées

tc qdisc del dev eth0 root

# Cree les nouvelles files

tc qdisc add dev eth0 root handle 1: htb default 10

tc class add dev eth0 parent 1: classid 1:1 htb rate 10kbps burst 6k

# port range : 32768 - 33023 (c'est juste?)

tc filter add dev eth0 parent 1: protocol ip u32 match ip sport 0X8000 0xff00 flowid 1:1

```

Donc, il est sensé limiter la BP en upload pour les port 32768 -> 33023, si je ne me suis pas trompé dans la syntaxe nébuleuse... J'ai pas trop compris le truc du burst mais bon.

Toujours est-il que là, j'ai 3 torrents qui uploadent pour un total de ~40Ko/s, ce qui représente plus ou moins la BP totale que j'ai en upload (448kb). Me trompé-je quelque part? Ou je ne m'y prend pas correctement?

Merci d'avance

----------

## razer

Je peux pas t'aider sur la forme des commandes, cela fait trop longtemps que je me suis pas tapé des lignes iptables ou tc manuellement   :Embarassed: 

Par contre, je limite aussi la BP sortante pour le P2P : je le fais avec shorewall, qui est aussi par ailleurs mon FW.

Voici comment je procède :

Mon logiciel P2P (mldonkey en l'occurence) est lancé en tant qu'user particulier

Je limite les paquets montants à partir d'une certaine taille (>500, pour ne pas filtrer les poignées de mains et tests de parité), qui proviennent de cet user (1010)

Au cas ou çà t'intéresse, cela donne une config du genre :

```
# /etc/shorewall/tcrules

#Comments

#le :F signifie que le marquage s'effectue sur la chaine FORWARD, donc utile pour tout le reseau local

#La specification des ports en "!" ne fonctionne pas (??)

#Attention : 

#1      le marquage est realise sur la table mangle, qui n est pas exclusive

#       cad que si un paquet est marque par deux regles, c est la derniere

#       specifie qui compte

#2      Bien respecter le nombre et l ordre des regles

##############################################################################

#MARK   SOURCE          DEST            PROTO   PORT(S)                         CLIENT PORT(S)  UID:GID TEST    LENGTH  TOS

# LE RESTE

2       eth0            !192.168.0.0/16 tcp     -                               -               -       -

2       fw              !192.168.0.0/16 tcp     -                               -               -       -

# SSH HTTP(S) et UDP : Priorite max

3       eth0            !192.168.0.0/16 tcp     22,80,443                       -               -       -       

3       fw              !192.168.0.0/16 tcp     22,80,443                       -               -       -

3       eth0            !192.168.0.0/16 udp     -                               -               -       -

3       fw              !192.168.0.0/16 udp     -                               -               -       -

# FTP FTP-DATA SMTP SFTP NNTP : Priorite moyenne 

4       eth0            !192.168.0.0/16 tcp     20,21,25,115,119                -               -       -

4       fw              !192.168.0.0/16 tcp     20,21,25,115,119                -               -       -

# P2P : Limitation aux paquets superieurs a 500 octets

5       fw              !192.168.0.0/16 tcp     -                               -               1010      -     500:

```

```

# /etc/shorewall/tcclasses

#Comments

#La BP montante Free tourne autour de 100ko/s

#INTERFACE      MARK    RATE            CEIL            PRIORITY    OPTIONS

#                       Minimum         Maximum

wlan0           1       40kbps          100kbps         1       tcp-ack         # Reponses tcp priorite max

wlan0           2       30kbps          100kbps         2                       # Autres services exterieurs

wlan0           3       40kbps          100kbps         1                       # Udp et services ssh http https

wlan0           4       1kbps           120kbps         3                       # Envois smtp, sftp, nntp et ftp

wlan0           5       1kbps           8kbps           4                       # Le P2P - paquets superieurs a 300 octets

wlan0           6       10kbps          2000kbps        5       default         # Traffic local

```

----------

## BaNaNe

Merci pour l'info, je vais jetter un coup d'oeil à shorewall.

Mais comme mon serveur de fichier n'est pas très puissant, j'aimerais ne pas devoir rajouter trop de trucs supplémentaires (je ne connais pas shorewall, il est peut-être extremement léger...).

Si un spécialiste de tc passe dans le coin et vois ce qui ne va pas dans mon script, je suis toujours prenneur  :Wink: 

Merci!

----------

## guilc

Il manque une terminaison sur ton classificateur. Après une classe, il faut mettre un scheduler de paquets (SFQ), sinon la limitation n'est pas faite.

Pour voir comment se font les hiérarchies, étudie en profondeur cette page : http://lartc.org/howto/lartc.qdisc.classful.html il y a tout, mais c'est pas forcément super transparent...

Et TOUT le trafic va passer dans le classifier, donc il te faut aussi une classe limitée au maximum de débit d'upload de ta connexion

le "burst", c'est le paramètre qui indique le volumme de données qui peut passer avant que la limite de débit imposée par le HTB rentre en action (donc dans ton exemple, 6ko de données passeront sans limite de débit)

Il est pas mal aussi d'ajouter le paramètre "prio" qui permet de prioriser le trafic d'une classe par rapport à une autre (en gros, en plus de la limite de débit, donner moins de priorité au trafic P2P, même s'il ne dépasse pas son débit mas : ca permet par exemple si tu as un upload vers un FTP en parallèle, de lui donner le plus possible de BP)

En gros, sur ton script, ça donne ça :

```
#!/bin/bash 

 

# Supprime les files déja crées 

tc qdisc del dev eth0 root 

 

# Cree les nouvelles files 

 

tc qdisc add dev eth0 root handle 1: htb default 2

# Classe limitée

tc class add dev eth0 parent 1: classid 1:1 htb rate 10kbps burst 6k prio 2

tc qdisc add dev eth0 parent 1:1 handle 10: sfq perturb 10

# Classe débit max

tc class add dev eth0 parent 1: classid 1:2 htb rate {DEBIT_MAX_CONNEXION}kbps burst 6k prio 1

tc qdisc add dev eth0 parent 1:2 handle 20: sfq perturb 10

# port range : 32768 - 33023 (c'est juste?) 

tc filter add dev eth0 parent 1: protocol ip u32 match ip sport 0X8000 0xff00 flowid 1:1

```

La, ça devrait être bon (j'ai pas testé)

Si tu veux un autre exemple, voila le script que j'utilise : http://doc.xwing.info/iptables/xwing/tc.sh

----------

