Qualité de Service : prioritisation de flux multimédia

De Wiki de Romain RUDIGER
Aller à : navigation, rechercher

INTRODUCTION GENERALE

Ce rapport a pour but de présenter la mise en place d’une méthode permettant de faire de la qualité de service sur un réseau. Pour ceci nous nous sommes intéressés plus particulièrement aux flux multimédia, ce cas étant très visuel, il nous sera possible de présenter cette réalisation lors des portes ouvertes de Polytech’Nantes aux visiteurs.

Le projet se situe dans un contexte de correspondance entre un réseau interne et internet. Notre routeur devra mettre en place cette QoS pour des applications clientes. Nous découvrirons quelques outils pour nous permettre cette QoS, à savoir l’utilisation de Netfilter avec IPTABLE ainsi que TC, un outil nous permettant d’agir sur le contrôle de trafic.

CAHIER DES CHARGES

La conception générale va nous permettre de définir les objectifs du projet mais également la réalisation d’une maquette pour les JPO.

Identification et caractérisation des protocoles

Identification et caractérisation des protocoles à autoriser et ceux prioritaires.

Définition des différents niveaux de priorité sous forme de classes. Affectation de chaque type de paquet dans une classe selon les caractéristiques suivantes :

  • Le type de protocole,
  • Le drapeau (champ flag d’IP),
  • Le type d’application : différenciation des applications interactives (SSH, QUAKE…) des applications de transfert autres (SMTP, FTP, P2P…),
  • La source/destination : on peut limiter l’accès aux ressources internes pour les clients externes, ou trouver un compromis entre l’utilisation de la bande passante par les services offerts aux internautes et celle utilisée par l’interne.


Trois grands types de paquets ressortent de cette analyse :

Les types de flux.

Dans le multimédia, il faut respecter quelques critères pour garantir une certaine qualité, ainsi la voix nécessite délais de moins de 10ms, pour la vidéo c’est de l’ordre de 100ms. Une bande passante maximale globale pour tous les flux permet d’éviter un fort temps de réponse.

Maquette pour la JPO

Dans le cadre de la journée porte ouverte de l’école, une maquette mettant en oeuvre un service de Qualité de service est nécessaire. Cette maquette doit être compréhensible sans aucune expérience dans ce domaine.

En Collaboration avec l’autre groupe (Benoît FARRE et Florian Dupont) nous avons décidé de démontrer l’utilité d’avoir un système de Qualité de Service dans le cas d’une connexion ADSL. Il s’agit de regarder une vidéo en streaming et de télécharger un fichier FTP en même temps.

Plutôt que de longues explications, voici un schéma de ce qui sera mis en place :

Maquette de la présentation.

Les deux serveurs pourraient très bien ne pas être séparés, mais nous souhaitons une visualisation de la bande passante par interface, le routeur devra donc disposer de 3 interfaces. Dans la réalité le routeur fait généralement également office de modem ADSL.

REALISATION DE LA MAQUETTE POUR LA JPO

Trois parties pour illustrer cette réalisation :

  • Serveurs
  • Routeur
  • Client

Les serveurs Vidéo et FTP

Deux serveurs sont utilisés pour visualiser la bande passante par interface mais également pour faciliter la capture de trames.

Serveur Vidéo

Le serveur vidéo doit fournir du contenu en ligne, il est important pour la démonstration que ce contenu soit de bonne qualité.

Une vidéo au format HD (1280x720 @ 24 ips) encodée au format MPEG4 avec une bande sonore Dolby AC3 48000Hz 6 canaux est utilisée. Le logiciel VLC Media Player est utilisé pour la diffusion, le débit de sortie est d’environ 4700 kbit par seconde (585 ko/s).

Emission sur le port 1234 du client en UDP.

Serveur FTP

Le serveur FTP est lui réalisé avec proftpd qui a l’avantage de ne nécessiter aucune configuration. Par défaut, les utilisateurs de la machine ont accès à leur dossier personnel en lecture/écriture sauf l’utilisateur root. Le fichier disponible n’est rien d’autre que la concaténation de la vidéo ce qui donne un fichier d’environ 16 Go.

Le routeur

Le routeur est bien entendu la partie la plus intéressante de ce projet, c’est lui qui met en place un système de qualité de service. Le noyau doit avoir été compilé avec iptables ainsi que tc.

Description de la répartition des interfaces :

  • Eth0 : client,
  • Eth1 : serveur ftp,
  • Eth2 : serveur vidéo.

Aucun commutateur n’est utilisé, les machines sont reliées entre elles directement.

Classification : deux classes seront utilisées, la première contiendra les paquets d’acquittements TCP ainsi que la vidéo (UDP) numéro 20 ; la seconde contiendra les paquets de données FP (TCP) numéro 21.

TC

C’est TC qui permet de créer des classes afin de diriger les paquets dans différentes files d’attente ayant des règles précises.

  • 1 - La classe principale définit le type de file d’attente qui sera utilisée, nous avons choisi une file du type HTB : « seau à jetons classifié » (Hierarchical Token buckets). Ce type de file d’attente permet de limiter la bande passante par classe (voir cours de QOS 4A).
$TC qdisc add dev $CLIENT_IFACE root handle 1: htb default 21
  • 1 : 1 - Le débit maximal sera fixé à 15 000 bit/s ce qui correspond à une bonne connexion internet type « 15 Méga ».
$TC class add dev $CLIENT_IFACE parent 1: classid 1:1 htb rate $MAX_RATE
  • 1 : 20 - Cette classe reçoit le flux vidéo, une bande passante garantie de 14 000 bit/s et une bande passante maximale de 15 000 bit/s.
$TC class add dev $CLIENT_IFACE parent 1:1 classid 1:20 htb rate $CLASS_20 ceil $MAX_RATE
  • 1 : 21 – Cette classe reçoit le flux FTP, il a donc la bande passante restante de 1 000 bit/s ainsi qu’une bande passane maximale de 15 000 bit/s.
$TC class add dev $CLIENT_IFACE parent 1:1 classid 1:21 htb rate $CLASS_21 ceil $MAX_RATE

Il faut également associer chaque feuille à une mark :

$TC filter add dev $CLIENT_IFACE parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
$TC filter add dev $CLIENT_IFACE parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21


Voici une représentation graphique, des classes :

Les différentes classes.

IPTables

Marquage des paquets avec iptables selon le port source/destination : ici 20 pour le FTP et 1234 pour la vidéo.

  • Petits paquets TCP : acquittements TCP…
$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p tcp -m length --length :64 -j MARK --set-mark 20
  • Vidéo
$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p udp --dport 1234 -j MARK --set-mark 20
  • FTP
$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p tcp --sport 20 -j MARK --set-mark 21

Les paquets sont ainsi associés aux différentes files d’attente.

Le client

Le client est simple : VLC pour lire la vidéo en streaming et un client FTP pour télécharger le fichier de 16 Go.

BIBLIOGRAPHIE

Voici une brève bibliographie des documents utilisés dans ce projet.

Pour l‘étude du domaine, nous plaçons notre projet dans un contexte Linux. Nous utiliserons largement la couche du noyau linux version 2.4 appelé Netfilter, soit la couche qui réalise les opérations de pare-feu. Cette couche a comme utilitaire iptables qui est son interface de configuration.

Aussi, nous nous intéresserons à un outil de contrôle de trafic sous Linux, TC, qui est également défini comme un outil de contrôle de qualité de service. C’est cet outil qui va nous permettre la mise en place des classes et des priorités qui y seront associées.

NetFilter et IPTables

Nous mettons en évidence ici les connaissances générales sur Netfilter et iptables, notamment, des tutoriaux permettant une prise en main de cette interface. Netfilter propose plusieurs fonctionnalités pour la mise en place de pare-feu, ici l’objet est surtout la QoS donc nous nous intéresserons surtout aux tables mangle pour altérer les en-têtes des paquets.

Nous apprendrons aussi comment implémenter des règles pour la mise en place des tables.

  • Une connaissance générale sur la couche des opérations de pare-feu de Linux :

www.netfilter.org

  • Notamment l’interface de configuration qui nous intéresse ici :

[1]

  • Et le téléchargement de l’outil :

[www.netfilter.org/downloads.html]

  • Références pour des tutoriaux de prise en main et d’applications liées à la QoS :

http://iptables-tutorial.frozentux.net/iptables-tutorial.html

TC

L’outil de contrôle de trafic de Linux nous permet de réaliser de la QoS facilement. Nous nous intéressons à sa compréhension générale avec quelques exemples pratiques.

Références générales

Pour une référence, nous avons pensé à la solution propriétaire « packeteer » qui est leader dans l’optimisation de flux dans les réseaux étendus. Cette solution permet de définir des règles à appliquer à chaque type de flux applicatif, avec des paramètres tels que leur niveau de priorité ou la bande passante qui leur est affectée (en quantité ou pourcentage).

Le script complet

#! /bin/bash
# Script de configuration d'un routeur avec de la qualité de service
# Ceci est une démonstration pour les portes ouvertes de Polytech'Nantes le 10/03/2008.
# - Streaming vidéo avec VLC et un divx HD : 
#    -Video: MPEG4 Video (H264) 1280x720 (80:43) 23.98fps [Video]
#    -Audio: Dolby AC3 48000Hz 6ch [Audio]
# - FTP avec proftpd : transfert d'un fichier de 16 Go
#
# --------MARS 2008-------------------
# Romain RÜDIGER    Yoann COLAS
# Benoît FARRE      Florian DUPONT
# ------------------------------------

# CONFIGURATION DEBUT >>

IPTABLES=/sbin/iptables
TC=/sbin/tc

SERVEUR_FTP_IFACE=eth1		# interface serveur FTP
SERVEUR_VIDEO_IFACE=eth2	# interface serveur video
CLIENT_IFACE=eth0					# LAN

SERVEUR_FTP_IP=20.0.0.1		# IP interface FTP
SERVEUR_VIDEO_IP=10.0.0.1	# IP interface Video
CLIENT_IP=192.168.0.1			# IP interface client

SERVEUR_FTP_NET=20.0.0.0/24		# Reseau FTP
SERVEUR_VIDEO_NET=10.0.0.0/24	# Reseau Video
CLIENT_NET=192.168.0.0/24			# Reseau LAN

MAX_RATE=15000kbit	#debit total en kbp/s = CLASS_20 + CLASS_21
CLASS_20=14000kbit	#debit garanti classe 20 (video)
CLASS_21=1000kbit		#debit garanti classe 21 (ftp)

# << FIN CONFIGURATION

echo "-> Activation des interfaces"
# Activation des interfaces
ifconfig $SERVEUR_FTP_IFACE up
ifconfig $SERVEUR_VIDEO_IFACE up
ifconfig $CLIENT_IFACE up

echo "-> Configuration des interfaces"
# Configuration des interfaces
ifconfig $SERVEUR_FTP_IFACE $SERVEUR_FTP_IP netmask 255.255.255.0
ifconfig $SERVEUR_VIDEO_IFACE $SERVEUR_VIDEO_IP netmask 255.255.255.0
ifconfig $CLIENT_IFACE $CLIENT_IP netmask 255.255.255.0

echo "-> ip_forward = 1"
# Activation de la redirection des paquets
echo "1" > /proc/sys/net/ipv4/ip_forward

# Debut du script
echo "Initialisation de Netfilter"
for a in `cat /proc/net/ip_tables_names`; do
		$IPTABLES -F -t $a
		$IPTABLES -X -t $a
		if [ $a == nat ]; then
				$IPTABLES -t nat -P PREROUTING ACCEPT
				$IPTABLES -t nat -P POSTROUTING ACCEPT
				$IPTABLES -t nat -P OUTPUT ACCEPT
		elif [ $a == mangle ]; then
				$IPTABLES -t mangle -P PREROUTING ACCEPT
				$IPTABLES -t mangle -P INPUT ACCEPT
				$IPTABLES -t mangle -P FORWARD ACCEPT
				$IPTABLES -t mangle -P OUTPUT ACCEPT
				$IPTABLES -t mangle -P POSTROUTING ACCEPT
		elif [ $a == filter ]; then
				$IPTABLES -t filter -P INPUT ACCEPT
				$IPTABLES -t filter -P FORWARD ACCEPT
				$IPTABLES -t filter -P OUTPUT ACCEPT
		fi
done

echo "Initialisation de TC"
$TC qdisc del dev $CLIENT_IFACE root

echo "Création des classes"
# Root avec envoie des pqauets non marques sur la classe 21
$TC qdisc add dev $CLIENT_IFACE root handle 1: htb default 21

# Limitation de la bande passante pour cette classe et tous ses fils
$TC class add dev $CLIENT_IFACE parent 1: classid 1:1 htb rate $MAX_RATE

# Creation des feuilles avec partage juste de la bande passante
$TC class add dev $CLIENT_IFACE parent 1:1 classid 1:20 htb rate $CLASS_20 ceil $MAX_RATE prio 0
$TC class add dev $CLIENT_IFACE parent 1:1 classid 1:21 htb rate $CLASS_21 ceil $MAX_RATE prio 1

# Attache sfq au classes feuilles.
# On utilise SFQ de facon equitable le debit de remplissage des files d'attentes
$TC qdisc add dev $CLIENT_IFACE parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev $CLIENT_IFACE parent 1:21 handle 21: sfq perturb 10

# Redirige le traffic dans la bonne classe avec fwmark
$TC filter add dev $CLIENT_IFACE parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
$TC filter add dev $CLIENT_IFACE parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21

echo "Création de la règle"
#création de la chaine et association sur les paquets sortant du routage vers le client
$IPTABLES -t mangle -N TRAFFIC-ENTRANT
$IPTABLES -t mangle -I POSTROUTING -o $CLIENT_IFACE -j TRAFFIC-ENTRANT

case $1 in
	"auto") echo "<-- MODE AUTONOME : switch toutes les 15 secondes -->"
		while :
		do
			$0 video
			sleep 15
			$0 ftp
			sleep 15
		done
		;;

	"video")	echo "<-- PRIVILEGIE LA VIDEO  -->"
		# Association traffic <> mark selon le type de flux

		# Petits paquets tcp (ack...) > mark 20
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p tcp -m length --length :64 -j MARK --set-mark 20
		
		# Video port source = 1234 > mark 20
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p udp --dport 1234 -j MARK --set-mark 20
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p udp --sport 1234 -j MARK --set-mark 20
			
		# Transfer ftp arrivant du serveur > mark 21
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p tcp --sport 20 -j MARK --set-mark 21
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p tcp --dport 21 -j MARK --set-mark 21	
		;;

	"ftp")	echo "<-- SANS QOS  -->"
		# Tous les paquets FTP et vidéo sont dans la même classe : pas de QOS mais limitation de la bande passante maximale

		# Petits paquets tcp (ack...) > mark 2
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p tcp -m length --length :64 -j MARK --set-mark 21
		
		# FTP port 20,21 > mark 21
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p tcp --sport 20 -j MARK --set-mark 21
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p tcp --dport 21 -j MARK --set-mark 21
		
		# Transfer video arrivant du serveur > mark 21
		$IPTABLES -t mangle -A TRAFFIC-ENTRANT -p udp --dport 1234 -j MARK --set-mark 21
		;;

	"stop") echo "<-- Plus de QOS, règles iptables sur ACCEPT -->"
		for a in `cat /proc/net/ip_tables_names`; do
				$IPTABLES -F -t $a
				$IPTABLES -X -t $a
				if [ $a == nat ]; then
						$IPTABLES -t nat -P PREROUTING ACCEPT
						$IPTABLES -t nat -P POSTROUTING ACCEPT
						$IPTABLES -t nat -P OUTPUT ACCEPT
				elif [ $a == mangle ]; then
						$IPTABLES -t mangle -P PREROUTING ACCEPT
						$IPTABLES -t mangle -P INPUT ACCEPT
						$IPTABLES -t mangle -P FORWARD ACCEPT
						$IPTABLES -t mangle -P OUTPUT ACCEPT
						$IPTABLES -t mangle -P POSTROUTING ACCEPT
				elif [ $a == filter ]; then
						$IPTABLES -t filter -P INPUT ACCEPT
						$IPTABLES -t filter -P FORWARD ACCEPT
						$IPTABLES -t filter -P OUTPUT ACCEPT
				fi
		done
		exit 0
		;;

	*)	echo 'Paramtres $1 : auto, video, no QOS, auto (video | no QOS)'
		exit 0
		;;
esac
# Redondant avec la classe par defaut mais bon a savoir et au cas ou : 
$IPTABLES -t mangle -A TRAFFIC-ENTRANT -m mark --mark 0 -j MARK --set-mark 21

echo "Fin du script."

L'affiche de la journée porte ouverte

Affiche de la journée porte ouverte.