Priorisation de flux

Bonjour à tous, J’ai un petit soucis avec de la QOS/ priorisation de flux… après maintes recherches j’ai commencer a réaliser des test via un petit script bash (voir ci-dessous). Je pense avoir suivi les differentes explications que j’ai pu trouver sur internet malgré le peu de documentation par rapport a tc class… malheureusement je ne constate pas de priorisation significative. Voici le script que je tente d’élaborer :

[code]#!/bin/bash

DEV=“eth0”

qosstart () {

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A POSTROUTING -p tcp --sport 80 -j MARK --set-mark 1

iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 2
iptables -t mangle -A POSTROUTING -p tcp --sport 443 -j MARK --set-mark 2

Création de la file d’attente principale add handle ffff: before ingress

tc qdisc add dev eth0 root handle 100: cbq bandwidth 100Mbit avpkt 1000 mpu 64
tc qdisc add dev eth1 root handle 100: cbq bandwidth 100Mbit avpkt 1000 mpu 64

tc qdisc add dev eth0 ingress
tc qdisc add dev eth1 ingress
#tc qdisc add dev $DEV handle ffff: ingress

Classe pour priorité haute

tc class add dev eth0 parent 100:0 classid 100:1 cbq bandwidth 100Mbit rate 64Kbit allot 1514 prio 8 maxburst 2 avpkt 200 bounded
tc class add dev eth1 parent 100:0 classid 100:1 cbq bandwidth 100Mbit rate 64Kbit allot 1514 prio 8 maxburst 2 avpkt 200 bounded

Classe pour priorité faible

tc class add dev eth0 parent 100:0 classid 100:2 cbq bandwidth 100Mbit rate 64Kbit allot 1514 prio 1 maxburst 40 avpkt 200 bounded
tc class add dev eth1 parent 100:0 classid 100:2 cbq bandwidth 100Mbit rate 64Kbit allot 1514 prio 1 maxburst 40 avpkt 200 bounded

#Installer les filtres
tc filter add dev eth0 parent 100: protocol ip handle 1 fw flowid 100:1 # HTTP
tc filter add dev eth0 parent 100: protocol ip handle 2 fw flowid 100:2 # HTTPS

tc filter add dev eth1 parent 100: protocol ip handle 1 fw flowid 100:1
tc filter add dev eth1 parent 100: protocol ip handle 2 fw flowid 100:2

}

qosstop (){
tc qdisc del dev eth0 ingress
tc qdisc del dev eth1 ingress
tc qdisc del dev eth0 root
tc qdisc del dev eth1 root
iptables -t mangle -F
}

case “$1” in
start )
qosstart ;
;;

	stop )
    qosstop ;
    ;;
    
	restart )
    qosstop ;
	qosstart ;
 ;;
  
  *)

echo “Usage : /etc/ init .d/qos ( start | stop | restart )” ;

esac
[/code]

J’utilise ce script sur ma passerelle/firewall qui est en tete de mon réseau.
Si vous avez des éclairsissements sur certains points par rapport à iptables/mangle ou a tc, je suis plus que preneur.

Merci d’avance de votre aide.

Bye

tu veux mettre la prioriter sur une interface ?

il ne me semble pas que cela soie possible (j’ai pas vérifier) mai par contre tu peux donner la prioriter .

je filtre par port et par taille des paquet ,je rencontre un bug aux niveau local (samba rame et j’ai la fleme de chercher)

voila le truc que j’ai fait il y a longtemp si sa peux t’aider note: j’ai fait sa en débutant :
le mtu je te conseil de le modifier aux niveau de l’interface avec ifconfig sa marche mieux :slightly_smiling:
(j’avais garder le premier script)

#!/bin/sh
#alègement de la syntaxe (c'est trop long)
syntaxeshort="iptables -t mangle -A MONLIMITEUR-OUT -p "
function quosnew {
CALLCLASSEMERE="50kbit" #bp global sur eth*
CALLSOUSCLASSE1="50kbit" #bp taill des  paquet
CALLSOUSCLASSE2="35kbit" #bp spring min dispo 35 et max 36
CALLSOUSCLASSE3="5kbit" #bp mumble min 10 dispo 
CALLSOUSCLASSE31="10kbit" #pb mumble max 15
CALLSOUSCLASSE4="100mbit" #bp lan samba


	affectemark ()
	# affecte nom sens port protocole categorie
	# sens = s ou d, protocole = udp ou tcp categorie = 0->?
	#
	{
		echo [$1 : $5]
		# shell s	curis
		if [ $1 == "springOFF" ] ;then
			$syntaxeshort $4 --$2port $3 -j ULOG --ulog-prefix="SpringQos"
		fi
		if [ $1 == "mumbleOFF" ] ;then
			$syntaxeshort $4 --$2port $3 -j ULOG --ulog-prefix="Mumble"
		fi
		$syntaxeshort $4 --$2port $3 -j MARK --set-mark 2$5
		$syntaxeshort $4 --$2port $3 -j RETURN
	}
	affecthandle () 
	{

		tc qdisc add dev $1 parent $2:$3 handle $4: sfq perturb $5
	}
	affectprio ()
	{
		tc filter add dev $1 parent 1:0 prio 0 protocol ip handle $2 fw flowid $3:$4
	}

ip link set dev $eth qlen 40

# ajout de la strat�gie HTB
# les noms des queues sont de 20 � 26, je les conserve
#
tc qdisc add dev $eth root handle 1: htb default 28 #racine

tc class add dev $eth parent 1: classid 1:1 htb rate $CALLCLASSEMERE

# ajout des classes filles:
# - chaque classe dispose AU MOINS de son quota de bande passante. Aucune
#   classe n'est donc étouffée par les autres. Chaque classe peut également
#   consommer toute la bande passante si aucune autre classe ne l'emploie.
# poids différents pour les classes
# C'est l'intéret des classes filles si j'ai bien compris, les classes méres
# ne partage pas leur part de bande passante

#ceil * est le délait avant la reprise d'un transfere après avoir epuiser le seau de jeton
#la durée est l'equivalen aux nombre de jeton nombre de jeton  
# ratup donne le debit avec un seau plein si vide ceil defini le temp du drop puis le
#ratup est a nouveau plein
tc class add dev $eth parent 1:1 classid 1:20 htb rate $CALLSOUSCLASSE1 ceil $CALLSOUSCLASSE1 prio 0
# Les autres classes
tc class add dev $eth parent 1:1 classid 1:21 htb rate $CALLSOUSCLASSE1 ceil $CALLSOUSCLASSE1 prio 0
# telnet, ssh,X
tc class add dev $eth parent 1:1 classid 1:22 htb rate $CALLSOUSCLASSE1 ceil $CALLSOUSCLASSE1 prio 1
# ports bas, messagerie AOL, MSN
tc class add dev $eth parent 1:1 classid 1:23 htb rate $CALLSOUSCLASSE1 ceil $CALLSOUSCLASSE1 prio 2
# WWW
tc class add dev $eth parent 1:1 classid 1:24 htb rate $CALLSOUSCLASSE1 ceil $CALLSOUSCLASSE1 prio 3
# mumble
tc class add dev $eth parent 1:1 classid 1:25 htb rate $CALLSOUSCLASSE3 ceil $CALLSOUSCLASSE31 prio 4
#lan
tc class add dev $eth parent 1:1 classid 1:26 htb rate $CALLSOUSCLASSE4 ceil $CALLSOUSCLASSE4 prio 5
#http 21
tc class add dev $eth parent 1:1 classid 1:27 htb rate $CALLSOUSCLASSE1 ceil $CALLSOUSCLASSE1 prio 6
#spring

tc class add dev $eth parent 1:1 classid 1:28 htb rate $CALLSOUSCLASSE2 ceil $CALLSOUSCLASSE2 prio 7
# ajout de la stratégie aux classes filles
# - SFQ offre un traitement sensiblement équitable de chaque classe.

#bouclage possible possible de 9 table
maxtable="8" # max 9 , pour en avoir plus il faut crée une 2 eme boucle(ou modifier celle-ci
boucle="true"
while $boucle
do
	I=$(($I+1))
	affecthandle "$eth" 1 2$I 2$I 2$I
# répartition du trafic en classe via fwmark
# - le trafic est r�parti en classes de priorit� suivant l'indicateur
#   fwmark des paquets (ceux-ci sont positionn�s avec iptables un peu plus
#   loin). La classe de priorit� par d�faut a �t� mise � 1:26 de telle sorte
#   que les paquets qui ne sont pas marqu�s se retrouvent dans la classe de
#   priorit� la plus faible.

	affectprio "$eth" 2$I 1 2$I
	if [ $I == $maxtable ] ;then
		boucle="false"
	fi 
done

#
# ajout de MONLIMITEUR-OUT � la table de modification des paquets d'iptables
# - ceci d�clare la table employ�e pour filtrer et classer les paquets
iptables -t mangle -N MONLIMITEUR-OUT
iptables -t mangle -I POSTROUTING -o $eth -j MONLIMITEUR-OUT
# ajout de fwmark pour classer les diff�rents types de trafic
# - fwmark est positionn� de 20 � 25 suivant la classe. 20 correspond � la
#   priorit� la plus forte.
#special ne passe pas dans la fonction (la ca son rare)
$syntaxeshort icmp -j MARK --set-mark 24
#passage en paramettre a la fonction 
# function commentaire por de destination (s ou d ) protocole prioriter de 0 a 8 (28)
affectemark "mumble" d 64738 udp 4
affectemark "mumble" d 64738 tcp 4
affectemark "DNS" d 53 udp 0
affectemark "spring" d 8452:8460 tcp 7
affectemark "spring" d 8452:8460 udp 7
affectemark "spring" d 8469 tcp 7
affectemark "spring" d 8469 udp 7
affectemark "spring" d 9999 tcp 7
affectemark "spring" d 9999 udp 7
affectemark "Http" d 80:82 udp 3
affectemark "Http2" d 80:82 tcp 3
affectemark "ftp" d 21 udp 6
affectemark "ftp" d 21 tcp 6
#affecte "exemple plage port" d 6112:6119 tcp 1


$syntaxeshort tcp -m length --length 0:32 -j MARK --set-mark 20
$syntaxeshort tcp -m length --length 0:32 -j RETURN
$syntaxeshort udp -m length --length 0:32 -j MARK --set-mark 20
$syntaxeshort udp -m length --length 0:32 -j RETURN
$syntaxeshort tcp -m length --length 33:60 -j MARK --set-mark 21
$syntaxeshort tcp -m length --length 33:60 -j RETURN
$syntaxeshort udp -m length --length 33:50 -j MARK --set-mark 21
$syntaxeshort udp -m length --length 33:50 -j RETURN
$syntaxeshort tcp -m length --length 51:100 -j MARK --set-mark 25
$syntaxeshort tcp -m length --length 51:100 -j RETURN
$syntaxeshort udp -m length --length 51:100 -j MARK --set-mark 25
$syntaxeshort udp -m length --length 51:100 -j RETURN
$syntaxeshort tcp -m length --length 101:1200 -j MARK --set-mark 24
$syntaxeshort tcp -m length --length 101:1200 -j RETURN
$syntaxeshort udp -m length --length 101:1200 -j MARK --set-mark 24
$syntaxeshort udp -m length --length 101:1200 -j RETURN
$syntaxeshort tcp -m length --length 1200:1501 -j MARK --set-mark 22
$syntaxeshort tcp -m length --length 1200:1501 -j RETURN
$syntaxeshort udp -m length --length 1200:1501 -j MARK --set-mark 22
$syntaxeshort udp -m length --length 1200:1501 -j RETURN
$syntaxeshort udp -m iprange --src-range $pcip_reseaux --dst-range $pcip_me -j MARK --set-mark 26
$syntaxeshort udp -m iprange --src-range $pcip_reseaux --dst-range $pcip_me -j RETURN
$syntaxeshort udp -m iprange --dst-range $pcip_reseaux --src-range $pcip_me -j MARK --set-mark 26
$syntaxeshort udp -m iprange --dst-range $pcip_reseaux --src-range $pcip_me -j RETURN
$syntaxeshort tcp -m iprange --src-range $pcip_reseaux --dst-range $pcip_me -j MARK --set-mark 26
$syntaxeshort tcp -m iprange --src-range $pcip_reseaux --dst-range $pcip_me -j RETURN
$syntaxeshort tcp -m iprange --dst-range $pcip_reseaux --src-range $pcip_me -j MARK --set-mark 26
$syntaxeshort tcp -m iprange --dst-range $pcip_reseaux --src-range $pcip_me -j RETURN
# les paquets udp sont des paquets de jeu
#syntaxeshort udp -j MARK --set-mark 21
# Petits paquets (des ACK probablement)
#echo [petits paquets: 1]
#syntaxeshort tcp -m length --length :64 -j MARK --set-mark 21
#syntaxeshort tcp -m length --length 65:128 	-j MARK --set-mark 22

# on marque les paquets restants  29 (faible priorité)
iptables -t mangle -A MONLIMITEUR-OUT -m mark --mark 0 -j MARK --set-mark 29





}

function quos {
#bp max 50kbit en up
RATEUP1="15kbit" #mumble
RATEUP2="500kbit" #taill des paquet
RATEUP3="100mbit" #http ftp 
RATEUP4="30kbit" #spring 
RATUOLAN="100mbit" #lan samba
	affectemark ()
	# affecte nom sens port protocole categorie
	# sens = s ou d, protocole = udp ou tcp categorie = 0->?
	#
	{
		#echo [$1 : $5]
		# shell s	curis
		if [ $1 == "springOFF" ] ;then
			$syntaxeshort $4 --$2port $3 -j ULOG --ulog-prefix="SpringQos"
		fi
		$syntaxeshort $4 --$2port $3 -j MARK --set-mark 2$5
		$syntaxeshort $4 --$2port $3 -j RETURN
	}
	affecthandle () 
	{

		tc qdisc add dev $1 parent $2:$3 handle $4: sfq perturb $5
	}
	affectprio ()
	{
		tc filter add dev $1 parent 1:0 prio 0 protocol ip handle $2 fw flowid $3:$4
	}

ip link set dev $eth qlen 40

# ajout de la strat�gie HTB
# les noms des queues sont de 20 � 26, je les conserve
#
tc qdisc add dev $eth root handle 1: htb default 28

# 4 classes meres differentes
tc class add dev $eth parent 1: classid 1:1 htb rate $RATEUP1
tc class add dev $eth parent 1: classid 1:2 htb rate $RATEUP2
tc class add dev $eth parent 1: classid 1:3 htb rate $RATUOLAN
tc class add dev $eth parent 1: classid 1:4 htb rate $RATEUP3
tc class add dev $eth parent 1: classid 1:5 htb rate $RATEUP4
# ajout des classes filles:
# - chaque classe dispose AU MOINS de son quota de bande passante. Aucune
#   classe n'est donc étouffée par les autres. Chaque classe peut également
#   consommer toute la bande passante si aucune autre classe ne l'emploie.
# poids différents pour les classes
# C'est l'intéret des classes filles si j'ai bien compris, les classes méres
# ne partage pas leur part de bande passante
#
# Le serveur et les pings
#ceil * est le délait avant la reprise d'un transfere après avoir epuiser le seau de jeton
#la durée est l'equivalen aux nombre de jeton nombre de jeton  
# ratup donne le debit avec un seau plein si vide ceil defini le temp du drop puis le
#ratup est a nouveau plein
tc class add dev $eth parent 1:1 classid 1:20 htb rate $RATEUP1 ceil $RATEUP1 prio 0
# Les autres classes
tc class add dev $eth parent 1:2 classid 1:21 htb rate $RATEUP2 ceil $RATEUP2 prio 0
# telnet, ssh,X
tc class add dev $eth parent 1:2 classid 1:22 htb rate $RATEUP2 ceil $RATEUP2 prio 1
# ports bas, messagerie AOL, MSN
tc class add dev $eth parent 1:2 classid 1:23 htb rate $RATEUP2 ceil $RATEUP2 prio 2
# WWW
tc class add dev $eth parent 1:2 classid 1:24 htb rate $RATEUP2 ceil $RATEUP2 prio 3
# Edonkey (� l'origine)
tc class add dev $eth parent 1:2 classid 1:25 htb rate $RATEUP2 ceil $RATEUP2 prio 4
#lan
tc class add dev $eth parent 1:3 classid 1:26 htb rate $RATUOLAN ceil $RATUOLAN prio 5
#http 21
tc class add dev $eth parent 1:4 classid 1:27 htb rate $RATEUP3 ceil $RATEUP3 prio 5
#spring
tc class add dev $eth parent 1:5 classid 1:28 htb rate $RATEUP4 ceil $RATEUP4 prio 6
# ajout de la stratégie aux classes filles
# - SFQ offre un traitement sensiblement équitable de chaque classe.

#bouclage possible possible de 9 table
maxtable="8" # max 9 , pour en avoir plus il faut crée une 2 eme boucle(ou modifier celle-ci
boucle="true"
while $boucle
do
	I=$(($I+1))
	affecthandle "$eth" 1 2$I 2$I 2$I
# répartition du trafic en classe via fwmark
# - le trafic est r�parti en classes de priorit� suivant l'indicateur
#   fwmark des paquets (ceux-ci sont positionn�s avec iptables un peu plus
#   loin). La classe de priorit� par d�faut a �t� mise � 1:26 de telle sorte
#   que les paquets qui ne sont pas marqu�s se retrouvent dans la classe de
#   priorit� la plus faible.

	affectprio "$eth" 2$I 1 2$I
	if [ $I == $maxtable ] ;then
		boucle="false"
	fi 
done

#
# ajout de MONLIMITEUR-OUT � la table de modification des paquets d'iptables
# - ceci d�clare la table employ�e pour filtrer et classer les paquets
iptables -t mangle -N MONLIMITEUR-OUT
iptables -t mangle -I POSTROUTING -o $eth -j MONLIMITEUR-OUT
# ajout de fwmark pour classer les diff�rents types de trafic
# - fwmark est positionn� de 20 � 25 suivant la classe. 20 correspond � la
#   priorit� la plus forte.
#special ne passe pas dans la fonction (la ca son rare)
$syntaxeshort icmp -j MARK --set-mark 24
#passage en paramettre a la fonction 
# function commentaire por de destination (s ou d ) protocole prioriter de 0 a 8 (28)
affectemark "mumble" d 64738 udp 5
affectemark "DNS" d 53 udp 0
affectemark "spring" d 8452:8460 tcp 8
affectemark "spring" d 8452:8460 udp 8
affectemark "spring" d 8469 tcp 8
affectemark "spring" d 8469 udp 8
affectemark "spring" d 9999 tcp 8
affectemark "spring" d 9999 udp 8
affectemark "Http" d 80:82 udp 7
affectemark "Http2" d 80:82 tcp 7
affectemark "ftp" d 21 udp 7
affectemark "ftp" d 21 tcp 7
#affecte "exemple plage port" d 6112:6119 tcp 1
$syntaxeshort tcp -m length --length 0:32 -j MARK --set-mark 20
$syntaxeshort tcp -m length --length 0:32 -j RETURN
$syntaxeshort udp -m length --length 0:32 -j MARK --set-mark 20
$syntaxeshort udp -m length --length 0:32 -j RETURN
$syntaxeshort tcp -m length --length 33:60 -j MARK --set-mark 21
$syntaxeshort tcp -m length --length 33:60 -j RETURN
$syntaxeshort udp -m length --length 33:50 -j MARK --set-mark 21
$syntaxeshort udp -m length --length 33:50 -j RETURN
$syntaxeshort tcp -m length --length 51:100 -j MARK --set-mark 25
$syntaxeshort tcp -m length --length 51:100 -j RETURN
$syntaxeshort udp -m length --length 51:100 -j MARK --set-mark 25
$syntaxeshort udp -m length --length 51:100 -j RETURN
$syntaxeshort tcp -m length --length 101:1200 -j MARK --set-mark 24
$syntaxeshort tcp -m length --length 101:1200 -j RETURN
$syntaxeshort udp -m length --length 101:1200 -j MARK --set-mark 24
$syntaxeshort udp -m length --length 101:1200 -j RETURN
$syntaxeshort tcp -m length --length 1200:1501 -j MARK --set-mark 22
$syntaxeshort tcp -m length --length 1200:1501 -j RETURN
$syntaxeshort udp -m length --length 1200:1501 -j MARK --set-mark 22
$syntaxeshort udp -m length --length 1200:1501 -j RETURN
$syntaxeshort udp -m iprange --src-range $pcip_reseaux --dst-range $pcip_me -j MARK --set-mark 26
$syntaxeshort udp -m iprange --src-range $pcip_reseaux --dst-range $pcip_me -j RETURN
$syntaxeshort udp -m iprange --dst-range $pcip_reseaux --src-range $pcip_me -j MARK --set-mark 26
$syntaxeshort udp -m iprange --dst-range $pcip_reseaux --src-range $pcip_me -j RETURN
$syntaxeshort tcp -m iprange --src-range $pcip_reseaux --dst-range $pcip_me -j MARK --set-mark 26
$syntaxeshort tcp -m iprange --src-range $pcip_reseaux --dst-range $pcip_me -j RETURN
$syntaxeshort tcp -m iprange --dst-range $pcip_reseaux --src-range $pcip_me -j MARK --set-mark 26
$syntaxeshort tcp -m iprange --dst-range $pcip_reseaux --src-range $pcip_me -j RETURN
# les paquets udp sont des paquets de jeu
#$syntaxeshort udp -j MARK --set-mark 21
# Petits paquets (des ACK probablement)
#echo [petits paquets: 1]
#$syntaxeshort tcp -m length --length :64 -j MARK --set-mark 21
#$syntaxeshort tcp -m length --length 65:128 	-j MARK --set-mark 22

# on marque les paquets restants  29 (faible priorité)
iptables -t mangle -A MONLIMITEUR-OUT -m mark --mark 0 -j MARK --set-mark 29

}

quos
#quosnew
echo "fin pour quos"

Bonjour, Merci pour ta réponse panthère,

Ton script est vraiment très intéressant, j’ai essayé de m’en inspirer.
J’ai essayé d’appliquer un script de ce genre sur ma passerelle debian.

Par contre, une question se pose maintenant, comment réalisez-vous les tests de priorisation ?
J’ai tenté de faire des captures avec wireshark, en mettant un téléchargement en http et un en ftp par exemple, et je ne vois pas de priorité significative, avez-vous des outils plus adéquats ?

Merci d’avance

Tu as un script http://boisson.homeip.net/limiteur et là http://boisson.homeip.net/limiteur2tranches relativement simple que j’ai utilisé en son temps avec profit pour une ligne courante. Ce script a subi avec succès le test de mes enfants voulant jouer à Counter Strike alors que le site était quasi saturé. Tu as des fils consacrés au QoS sur le forum.