Académique Documents
Professionnel Documents
Culture Documents
François-Xavier GUIDET
Ethernet : les raisons du succès
Toutes les stations sont égales vis-à-vis du réseau : il n'y a pas d'équipement maître de
contrôle du réseau.
La méthode d'accès employée est distribuée entre tous les équipements connectés.
Le mode de transmission est de type bidirectionnel alterné : les signaux transitent dans
les deux sens, mais pas
Ces principes ont montré qu'il était plus facile de concevoir les réseaux et les équipements
correspondants avec Ethernet qu'avec d'autres technologies aux définitions plus complètes. De
nombreuses technologies réseaux «mieux définies» au départ comme Token Ring (IEEE
802.5) par exemple, se sont avérées très peu évolutives au fil du temps.
Ces principes ont été formalisés au début des années soixante-dix. Aujourd'hui, seul le mode
de transmission bidirectionnel alterné est de moins en moins employé. Le déploiement de la
commutation de niveau 2 étant généralisé, les transmissions se font sur des paires cuivre ou
fibre optique dédiées à chaque sens de communication. On parle alors de mode full duplex.
Ethernet était à l'origine un standard développé par les laboratoires Xerox au tout
début des années 1970. Ce standard a d'abord évolué jusqu'à la version Ethernet II
aussi appelée DIX ou encore v2.0 avec l'association regroupant Digital Equipment
Corporation, Intel et Xerox. Par la suite, Ethernet a été inclu dans les travaux sur la
modélisation OSI au début des années 1980. Depuis cette époque, la technologie
Ethernet est totalement indépendante des constructeurs ; c'est un des facteurs
importants de sa popularité.
Les éléments de la couche physique (couche 1 OSI) sont définis par les normes IEEE des
sous-comités 802.3 et la méthode d'accès CSMA/CD correspond à partie MAC de la couche
liaison (couche 2 OSI).
Même si les évolutions des débits ont entraîné l'abandon de supports bon marché (câbles
coaxiaux lors du passage de 10 à 100Mbps), la mise en oeuvre est restée simple. Les
infrastructures existantes progressent vers les technologies multimédias sans
réinvestissements lourds.
C'est une des grandes leçons de l'histoire des réseaux de télécommunications sur les trente
dernières années. Toutes les technologies de transmission qui on cherché à qualifier les flux
réseau au plus près du matériel n'ont pas su évoluer simplement. L'exemple de la technologie
ATM est caractéristique. Faire évoluer les équipements actifs ATM pour adapter les débits est
excessivement plus coûteux qu'avec des équipements Ethernet.
Au début des années 1970 : Le premier réseau local Ethernet expérimental a été développé au
centre de recherche Xerox de Palo Alto (PARC) pour interconnecter des ordinateurs et des
imprimantes laser à un débit de 2.94Mbps. En juillet 1976, les deux concepteurs de ce
réseau Bob Metcalfe et David Boggs publièrent le document de référence Ethernet:
5
Distributed Packet Switching for Local Computer Network .
En Septembre 1980 : Le premier standard Ethernet est publié. Les sociétés Intel et Digital
Equipment Corporation (DEC) ont rejoint Xerox pour produire un standard utilisable par
tous. On a baptisé ce standard DIX standard. Il correspond à la version 10Base5 ou
Ethernet «épais». Voir Section 4.1.1, « Ethernet standard ». Les premières cartes Ethernet
sont apparues avec la version 2.0 du standard DIX en Novembre 1982 : le standard
Ethernet II.
En 1983 : La première norme Ethernet est publiée par l' Institute of Electrical and Electronic
6 7
Engineers (IEEE) ; plus précisemment par le sous-comité IEEE 802.3 . C'est à cette
époque qu'est apparue la double signification d'un champ dans le format de la trame
Ethernet : le champ Type/Longueur. Cette différence entre normalisation et standard n'a
jamais eu d'effet sur l'exploitation des réseaux locaux Ethernet. Voir Section 9, « Format
de trame ».
En 1985, l'IEEE publia la norme IEEE 802.3a correspondant à l'Ethernet «fin». En 1987,
l'utilisation des fibres optiques devint effective avec la norme IEEE 802.3d.
En 1990 : La première norme utilisant les câbles de paires torsadées cuivre sur une topologie
étoile est publiée : IEEE 802.3i. C'est à partir de cette étape que les autres technologies de
réseaux locaux ont décliné rapidement.
En 1993, la norme IEEE 802.3j est venue étendre l'application de la topologie étoile sur
fibres optiques.
En 1995 : Nouvelle étape majeure dans l'évolution d'Ethernet : le passage à 100Mbps avec
l'introduction de la norme IEEE 802.3u. Cette version d'Ethernet est connue sous le nom
FastEthernet.
En 1998 : Les débits ont à nouveau été multipliés par 10 avec la sortie du Gigabit Ethernet.
La norme correspondante est l'IEEE 802.3z.
Cette première définition a été complétée en 1999 avec la norme IEEE 802.3ab qui définit
l'utilisation du Gbps sur les câbles en paires torsadées UTP de catégorie 5.
En 2002 : Une fois de plus, les débits ont été multipliés par 10 pour atteindre les 10Gbps avec
la publication de la norme IEEE 802.3ae. Cette catégorie de débit marque l'avènement de
l'exploitation d'Ethernet sur les dorsales des réseaux étendus.
De même qu'avec le Gigabit Ethernet, une définition d'Ethernet 10Gbps sur paires
torsadées cuivre devrait voir le jour prochainement. La norme devrait être publiée avec
8
l'appelation IEEE 802.3an .
9
L' Institute of Electrical and Electronic Engineers a mis à disposition en ligne les normes du
10
comité 802 : Get IEEE 802 .
A l'intérieur de chaque famille, il existe de nombreuses déclinaisons. Les plus utilisées sont
décrites ci-après.
Du point de vue conception, les câblages en paires torsadées cuivre sont habituellement
utilisés pour la «desserte» des postes de travail à des débits allant de 10Mbps à 1Gbps.
Ensuite, les câblages en fibres optiques sont utilisés pour les dorsales réseau.
Bien que cela ne corresponde à aucune normalisation, on rencontre de plus en plus souvent un
découpage en 3 couches lors de la conception des réseaux locaux Ethernet : accès, distribution
et coeur. Ce découpage a surtout pour but de faciliter le classement des équipements dans les
catalogues constructeurs.
Cette vue met en évidence les éléments introduits pour faire évoluer les débits.
Les acronymes :
Il existe de nombreux suppléments à la norme IEEE 802.3 initialement publiée qui décrivent
les différents supports utilisables.
La topologie utilisant des câbles coaxiaux est toujours de type BUS. Cette topologie était
avantageuse lorsque le nombre et la disposition des stations changeaient. Aujourd'hui, les
câbles coaxiaux sont systématiquement abandonnés au profit des câbles en paires torsadées
cuivre ou des fibres optiques. Le coût de la connectique des câbles coaxiaux est devenu
supérieur à celui de la connectique RJ45 utilisée avec les paires torsadées.
Ethernet standard
Le câble standard a été défini à l'origine pour des connexions avec transceivers à piquage
(vampire) puis étendu à la connectique de type N-BNC.
IEEE 802.3 a
Définit les caractéristiques des répéteurs 10Base2 ainsi que les liaisons inter-répéteurs en fibre
optique FOIRL (Fiber Optic Inter Repeater Link).
Il peut aussi intervenir sur la propagation des collisions (Jamming) ou interrompre une
émission trop longue.
IEEE 802.3 i
Introduite en 1990, cette définition constitue une évolution majeure d'Ethernet. C'est la
première à adopter une topologie étoile analogue à celle des installations téléphoniques.
Depuis, cette topologie étoile domine très largement dans les installations réseau.
Exemple de topologie étoile 10BaseT et 10BaseFL
Tableau 3. 10BaseT
IEEE 802.3 j
Cette définition a très largement été utilisée pour l'implantation des dorsales réseau de
campus.
Tableau 4. 10Base-F
10BASE-FL : Redéfinition de FOIRL avec des capacités plus intéressantes telles que
la possibilité de concevoir une topologie étoile avec des répéteurs multi-ports.
100BaseT
La signalisation 100Base-X sur les câbles et fibres reprend celle développée pour la
technologie FDDI (Fiber Distributed Data Interface).
Tableau 5. 100BaseT
100BaseF
Tableau 6. 100BaseFX
Gigabit Ethernet
Comme les câbles en paires torsadées de catégorie 5 sont certifiés pour des fréquences allant
jusqu'à 100MHz (cf TIA/EIA-568-A), le passage à 1000Mbps pose des difficultés nouvelles
par rapport aux évolutions précédentes. La couche physique a été entièrement revue. La
nouvelle définition est une « fusion » de deux technologies : l'Ethernet IEEE802.3 et le Fiber
Channel ANSI X3/T11.
Cette fusion reprend le format de trame Ethernet 802.3 et la méthode d'accès CSMA/CD full-
duplex pour conserver la compatibilité avec les couches supérieures du réseau et elle bénéficie
du débit élevé de l'interface physique Fiber Channel.
Tableau 7. 1000Base-LX
Appellation 1000BaseLX
Support laser grandes ondes sur fibre optique multimodes et monomode destiné aux
artères de campus.
Longueur
3Km
maximum
Tableau 8. 1000Base-SX
Appellation 1000BaseSX
laser ondes courtes sur fibre optique multimodes destiné aux artères intra-
Support
muros.
Longueur
500m
maximum
Tableau 9. 1000Base-CX
Appellation 1000BaseCX
Support câble en paires torsadées blindées 150 Ohms destiné aux connexions entre
serveurs dans le même local.
Longueur
25m
maximum
Cette définition est très importante. C'est elle qui permet d'utiliser le Gigabit Ethernet dans la
majorité des installations actuelles.
Ceci dit, les installations existantes auront certainement besoin d'une « requalification » avant
d'être équipées en 1000BaseT. Cette technologie utilise les câbles FTP de catégorie 5 au
maximum de leur certification. De nouvelles catégories de câbles sont en cours de
spécification : 5enhanced à 100MHz, 6 à 200MHz et 7 à 600MHz.
Il est recommandé de limiter au maximum les brassages intermédiaires dans les armoires de
câblage.
Appellation 1000BaseT
Support câble en paires torsadées non blindées de catégorie 5.
Longueur
100m
maximum
Gigabit Ethernet
IEEE 802.3ae
Définition 10Gbps
Avec les évolutions des débits d'Ethernet, la grande majorité des infrastructures actuelles sont
« mixtes ». Il est donc nécessaire que les équipements réseau (cartes, commutateurs, etc.)
12
soient capables de reconnaître et d'utiliser la bande passante disponible sur le câble.
Auto-négociation
La fonction d'auto-négociation est optionnelle. Elle est apparue avec l'extension FastEthernet
et ne concerne que les câbles en paires torsadées et les fibres optiques.
La fonction de négociation utilise les signaux de contrôle d'état du lien physique en respectant
la compatibilité entre tous les équipements indépendemment de leur génération et des options
qu'ils supportent.
1 100BaseTX Full-Duplex,
2 100BaseT4,
3 100BaseTX,
4 10BaseT Full-Duplex,
5 10BaseT.
Exemple de conception
12
Document de référence sur l'auto négociation Ethernet : An Introduction to Auto-
Negotiation [http://www.scyld.com/expert/NWay.html].
L'exemple qui suit est une synthèse sur l'utilisation de la technologie Ethernet. Il ne prend pas
en compte certaines autres normes telles que les VLANs IEEE 802.1Q qui autoriseraient
d'autres modes de conception.
Format de trame
Les 2 types de trames reconnuesLa signification de chacun des champs de trame est donnée
ci-après.
Le préambule
Même si la norme IEEE 802.3 a spécifié un champ spécifique en fin de préambule : SOF
(Start of Frame) avec 2 bits à 1, il n'y a aucune différence avec le standard Ethernet v2.0 pour
lequel les 2 derniers bits du préambule sont aussi à
1.
Les adresses MAC identifient le ou les destinataire(s) de la trame puis l'émetteur. Elles sont
constituées de 6 octets :
Les 3 premiers octets font référence au constructeur de l'interface. Ils sont uniques et sont
attribués par l'IEEE.
Les 3 octets suivants donnent le numéro d'interface chez ce constructeur.
L'adresse source est toujours celle d'une interface unique (unicast). La destination peut être
une adresse unique, de groupe (multicast) ou de diffusion générale (broadcast = FF-FF-FF-
FF-FF-FF). Dans une adresse de groupe, le premier bit transmis est à 1. Si les autres bits ne
changent pas, l'adresse de groupe correspond à toutes les cartes d'un même constructeur.
Ce champ de 2 octets a été défini dans le standard Ethernet II pour indiquer le type de
protocole de niveau 3 employé pour transporter le message.
Avec la normalisation IEEE 802.3 ce champ a été redéfini pour contenir la longueur en octets
du champ des données.
Ethernet II
Avec ce format, la couche 2 est complète. Les données sont directement transmises au niveau
réseau identifié par le champ type. Aucune « séquence de bourrage » ou padding n'est prévue
bien que le nombre minimum de données attendues soit de 46 octets.
IEEE 802.3
Le champ de données contient l'entête de la sous-couche LLC en plus des données. Au niveau
MAC ce champ est vu comme une suite de 46 à 1500 octets que l'on n'interprète pas.
Si le nombre de données n'atteint pas 46 octets, le champ est complété par padding.
Le champ de contrôle
Le FCS : Frame Check Sequence est un champ de 4 octets qui permet de valider l'intégrité de
la trame à 1 bit près. Il utilise un CRC (Cyclic Redundancy Check) qui englobe tous les
champs de la trame. Ainsi, la station réceptrice peut décider si la trame est correcte et doit être
transmise à la couche supérieure : LLC (Logical Link Control IEEE 802.2) ou réseau. Voir
Section 11.2, « Sous-couche LLC : IEEE 802.2 »
Le temps inter-trame
Le temps inter-trame est appelé indifféremment Inter Frame Space ou Inter Frame Gap.
Une machine ne peut émettre toutes les trames qu'elle a à transmettre les unes à la suite des
autres. Le délai inter-trame normalisé est de 96 bits soit 9,6 microsecondes à 10Mbps.
Attention, cette définition a été revue pour le Gigabit-Ethernet. Voir Section 6.3, « Extension
CSMA/CD ». Il correspond au temps minimum de retour au repos du média et permet aux
autres stations de prendre la main.
Trames erronées
A la suite d'incidents tels qu'une collision, le débranchement brutal d'une machine, la perte du
bouchon d'adaptation d'impédance ou le mauvais fonctionnement d'une partie du matériel, des
trames non cohérentes peuvent apparaître. Certains de ces défauts sont répertoriés avec un
vocabulaire particulier.
Runt
Ce terme désigne les trames trop courtes (moins de 64 octets). Ce type de trame est le plus
souvent le résultat d'une collision.
Jabber
Il s'agit d'une trame trop longue (plus de 1518 octets). On distingue 2 types de causes :
S'il y a superposition de 2 trames sans détection de collision, on peut considérer que les
couches 1 et 2 d'une interface du réseau ne fonctionnent plus correctement.
La trame n'a plus de structure et est émise par un composant qui reste beaucoup trop
longtemps en émission.
Ce type de défaut est très pénalisant pour le réseau et entraîne une dégradation rapide des
performances.
Misaligned frame
Une trame désalignée est une trame dont le nombre de bits n'est pas divisble par 8. Dans la
pratique, ce type de trame possède presque toujours un CRC faux.
Bad FCS
Il s'agit d'une trame complète dont un bit n'a pas été reçu tel qu'il avait été transmis ou d'une
trame tronquée résultant d'une collision.
Les collisions
Important
Un réseau peut être considéré comme sain tant que le taux de collision est inférieur
à 1 pour 1000 trames.
Illustration d'une collision
La méthode CSMA/CD est dérivée d'un système de transmission radio appelé Aloha. Son
principe est de laisser chacun libre de gérer ses émissions en fonction de ses besoins et de la
disponibilité du média.
En l'absence d'information à transmettre, la station écoute (ou reçoit) les paquets qui circulent
sur le câble dans un sens ou dans l'autre. Quand la station a besoin d'émettre un ou plusieurs
paquets, elle agit indépendamment des autres. Elle sait juste que lorsqu'elle perçoit une trame,
une autre machine doit être en émission.
Chaque machine ayant à tout instant la possibilité de débuter une transmission de manière
autonome, la méthode d'accès est distribuée : elle est dite à accès multiple (Multiple Acess:
MA). La machine observe le média en cherchant à détecter une porteuse (Carrier Sense: CS).
Si aucune trame n'est en transit, elle ne trouve pas de porteuse.
Elle envoie ses paquets sur le support physique et reste à l'écoute du résultat de son émission
pendant quelque temps, pour vérifier qu'aucune autre machine n'a suivi le même
comportement qu'elle au même instant.
La méthode d'accès étant à détection de collision (Collision Detect: CD), lors de son émission
une machine peut déceler un problème de contention, et s'arrêter avec l'intention de renvoyer
son paquet ultérieurement quand elle aura de nouveau la parole. De façon à minimiser le
risque de rencontrer une deuxième collision avec la même machine, chacune attend pendant
un délai aléatoire avant de tenter une nouvelle émission.
Cependant, de manière à ne pas saturer un réseau qui s'avérerait déjà très chargé, la machine
n'essaiera pas indéfiniment de retransmettre un paquet. Si à chaque tentative elle se trouve en
conflit avec une autre ; après un certain nombre d'essais infructueux, le paquet est éliminé. On
évite ainsi l'effondrement du réseau. Les couches supérieures sont averties que la transmission
du message a échoué.
Méthode d'accès
Le sous-comité IEEE 802.2 a standardisé une couche de niveau LLC qui possède plusieurs
types d'opérations offrant des services de différentes qualités.
Le premier type d'opération est un service minimum, sans connexion (pas de liaison logique)
ni acquittement (pas de retour d'information sur le déroulement de l'acheminement). Le type 1
permet des communications en point à point (un émetteur un récepteur) ou en diffusion (un
émetteur plusieurs récepteurs).
Le type d'opération 2 est un service sur connexion (liaison logique entre SAP) avec
acquittement, vérification de l'ordre des trames, détection et correction d'erreur, détection des
doubles, contrôle de flux. L'identificateur correspondant au couple SSAP/DSAP (Source
Service Access Point / Destination Service Access Point) est unique. Ce type d'opération ne
permet que des communications en point à point.
Dans tous les cas, quel que soit le type d'opération, les données du niveau LLC sont
présentées sous la forme d'un LPDU (LLC Protocol Data Unit), tel que représenté ci-dessous.
Les valeurs des LSAP (points d'accès LLC) sont représentées sur un octet. Elles sont relatives
au protocole de niveau supérieur (06 pour TCP/IP). Une trame LLC est encapsulée dans la
trame de niveau inférieur (MAC). Le LPDU correspond donc au champ de données de la
trame MAC.
En guise de conclusion
Cette synthèse sur la technologie Ethernet est nécessairement incomplète et certains aspects
ont été volontairement occultés. En voici deux exemples significatifs :
Avant de pouvoir configurer une interface, il faut que le pilote de périphérique correspondant
ait été chargé. Comme une interface réseau est un dispositif matériel, c'est au niveau du noyau
Linux que l'opération doit s'effectuer. Soit le pilote d'interface a été inclu dans la partie
monolithique du noyau soit il est chargeable sous forme de module. C'est cette dernière
solution qui est le plus souvent retenue. Un module peut être chargé ou déchargé à volonté
sans avoir à redémarrer la machine.
Voici deux exemples caractéristiques : une première machine avec un contrôleur RNIS/ISDN
et un contrôleur Ethernet puis une seconde machine avec un contrôleur Ethernet différent.
# lspci -v
# lspci -v
00:09.0 Ethernet controller: Intel Corp. 82557/8/9 [Ethernet
Pro 100] (rev 09)Subsystem: Intel Corp. EtherExpress
PRO/100+ MiniPCIFlags: medium devsel, IRQ 11Memory at
41280000 (32-bit, non-prefetchable) [size=4K]I/O ports at
3440 [size=64]Memory at 41200000 (32-bit, non-
prefetchable) [size=128K]Expansion ROM at <unassigned>
[disabled] [size=1M]Capabilities: [dc] Power Management
version 2
Comme précisé plus haut, les périphériques réseau utilisent des composants matériel. Il est
donc logique de se réferrer à la documentation du noyau Linux pour identifier le logiciel
correspondant au contrôleur utilisé. Le répertoire
/usr/src/linux/Documentation/networking contient de nombreux fichiers de
documentation sur les différents contrôleurs supportés par le noyau Linux.
En suivant les 2 exemples ci-dessus, on peut repérer les fichiers qui traitent des contrôleurs :
vortex.txt et e100.txt.
En consultant ces 2 fichiers, on identifie facilement le nom du module logiciel à charger pour
utiliser le périphérique
réseau. Dans le cas de la carte 3Com 3c900B-Combo, il s'agit du module 3c59x. Dans le cas
du contrôleur intégré Intel EtherExpress PRO/100+ MiniPCI, il s'agit du module e100.
Avertissement
Pour tester les manipulations ci-dessous à partir d'une configuration déjà établie, il
faut :
désactiver la configuration de l'interface : /etc/init.d/networking stop,
retrouver le pilote de l'interface dans la liste des modules : lsmod,
décharger le module pilote de cette même interface : rmmod <module_carte>,
Attention ! lors du (re)chargement du module pilote de l'interface, les scripts de
configuration de l'interface sont automatiquement relancés. Le système effectue une opération
identique à la commande : /etc/init.d/networking start.
Enfin, si le pilote de carte est chargé dans la partie monolithique du noyau, toute
manipulation de module est impossible.
# ifconfig -a
# ifconfig -a
En plus du chargement du module, l'interface doit être configurée à l'aide des scripts
utilisé lors de l'initialisation du système.
Configuration de l'interface
Pour configurer une interface réseau, il faut utiliser les commandes de base disponibles sur
n'importe quel système Unix. Voici une présentation succinte des commandes classiques de
configuration et de test d'une connexion réseau : ifconfig, ping, arp et host.
Commande ifconfig
Pour toute information sur le format des adresses IP utilisées ci-après, se référer à l'article
5
Adressage IP .
ifconfig sert à fixer les paramètres d'une interface ; eth0 dans notre exemple.
Etat de l'interface
$ /sbin/ifconfig -a
Configurer l'interface
Pour obtenir la syntaxe de toutes les options disponibles, il faut utiliser la commande man
ifconfig
Avec la distribution Debian GNU/Linux les paramètres de configuration des interfaces réseau
sont stockés dans le répertoire /etc/network. Le fichier interfaces de ce répertoire
rassemble la configuration des interfaces réseau.
Voici l'exemple d'une interface ethernet configurée à l'aide du protocole DHCP :
# The loopback
interfaceauto loiface
lo inet loopback
# The first network card -this entry was created during the
Debian installation# (network, broadcast and gateway are
optional)auto eth0iface eth0 inet dhcp
Pour une configuration statique de l'interface, il faut utiliser les pages de manuels : man
interfaces. Voici un exemple :
auto eth0
Le protocole Internet Control Message Protocol ou ICMP est décrit dans le document RFC
7
792 . Comme le protocole IP de la couche réseau fonctionne en mode non connecté, il ne
fournit aucun service de contrôle lors de la transmission des paquets sur le réseau. Le rôle du
protocole ICMP est de notifier l'émetteur lorsqu'il y a eu un problème.
La commande ping utilise principalement deux types de messages du protocole ICMP pour
informer l'utilisateur sur les conditions de transmissions :
• L'hôte distant est-il actif ou inactif.
7
http://www.faqs.org/rfcs/rfc792.html
Pour valider le bon fonctionnement d'une communication sur un réseau IP, on suit une
séquence précise de tests :
1 adresse IP de l'interface de boucle locale : lo,
2 adresse IP de l'interface du poste de travail : eth0 ou ppp0,
3 adresse IP du destinataire de la passerelle par défaut,
4 adresse IP extérieure au réseau local.
Il s'agit ici de contrôler que les processus pairs à l'intérieur du même système sont capables de
dialoguer entre eux. On teste ensuite le fonctionnement de l'interface seule :
Il s'agit ici de contrôler que l'interface réseau est bien configurée et active.Une fois ces deux
étapes franchies, on peut tester les communications avec les autres systèmes.
Exemple de succès :
Pour obtenir la syntaxe de toutes les options disponibles, il faut accéder aux pages de manuels
Unix :
via la console avec la commande man ping.
Cette commande est aussi très utile pour savoir si la résolution des noms d'hôtes fonctionne
correctement. Dans ce cas on fait appel à un service Internet appelé Domain Name Service
(>DNS). Cet appel au service >DNS nécessite un minimum de configuration.
En cas d'echec sur la résolution des noms, il faut contrôler la validité des informations dans
les deux fichiers suivants :
• /etc/resolv.conf
La commande arp utilise le protocole du même nom : Address Resolution Protocol décrit
8
dans le document RFC 826 .
Elle sert à localiser un hôte du réseau local en faisant la correspondance entre l'adresse IP et
l'adresse MAC de cet hôte.
Entre deux hôtes d'un même réseau, il n'existe pas de service de «détermination du chemin à
suivre» (c'est le travail des routeurs entre réseaux différents). La tâche du protocole ARP est
donc indispensable pour la communication entre les hôtes d'un réseau local.
Dans l'exemple suivant, on visualise la table des adresses MAC connues avec la commande
arp.
$ arp
Adresse TypeMap AdresseMat Indicateurs Iface
router ether 00:60:3E:10:48:20 C eth0
dns ether 00:A0:24:A0:A4:11 C eth0
Le résultat de la localisation apparaît lorsque l'on visualise à nouveau la table des adresses
MAC.
$arp
Adresse TypeMap AdresseMat Indicateurs Iface
router ether 00:60:3E:10:48:20 C eth0
dns ether 00:A0:24:A0:A4:11 C eth0
server ether 00:60:97:91:60:0A C eth0
La table des adresses MAC est maintenue dynamiquement en fonction du trafic reçu par les
interfaces. Les entrées valides sont contrôlées toutes les 30 secondes sans qu'il y ait émission
de trafic. Ensuite, les entrées passent phase de «gel» (stale) pendant 60 secondes avant d'être
effacées.
Pour obtenir la syntaxe de toutes les options disponibles, il faut accéder aux pages de manuels
Unix :
via la console avec la commande man arp.
Pour obtenir la syntaxe de toutes les options disponibles, il faut accéder aux pages de manuels
8
Unix : http://www.faqs.org/rfcs/rfc826.html
via la console avec la commande man host.
Le routage est un sujet à part entière auquel il faut consacrer beaucoup de temps pour avoir
une bonne compréhension des échanges entre plusieurs réseaux. L'objectif de cette section est
limité à l'observation des routes connues de l'interface de l'hôte et à la détection de pannes.
La commande route, tout comme ifconfig sert à la fois à connaître l'état de la table de routage
de l'hôte et à configurer de nouvelles routes au besoin.
Cette commande n'a rien à voir avec le routage dynamique qui fonctionne sur un routeur. Elle
ne sert qu'à poser des routes statiques entre interfaces.
# route -n
Kernel IP routing table
Flags
Use
Destination Gateway Genmask
Metric
Iface
Ref
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
Indicateurs d'état :
U : Up ; l'interface est active.
H : Host ; désigne un hôte.
Commande traceroute
traceroute renvoie les informations sur la route suivie pour atteindre un hôte. Le résultat
obtenu donne la liste des routeurs traversés.
# traceroute www.nic.fr
Commande tcptraceroute
L'utilisation de la commande traceroute est de plus en plus limitée par les divers systèmes de
filtrage réseau et pour contrer les outils automatisés de relevé de topologie réseau à distance.
Pour autant, la fonction traceroute est très utile pour qualifier la validité d'une
communication. Il existe une autre commande : tcptraceroute permettant de fixer les
numéros des ports source et destination.
Sur tous les systèmes, un certain nombre de paramètres sont actifs par défaut sur les interfaces
réseau. Avec le noyau Linux, ces paramètres sont placés dans le système de fichiers virtuel
/proc.
Dans le noyau Linux, la granularité du paramètrage de la pile de protocoles TCP/IP est très
fine. Aussi le nombre de paramètres est important. Il suffit de visualiser le résultat des
commandes ls /proc/sys/net/ipv4/ ou sysctl -A |grep net pour le
constater.
Voici un petit script appelé show_proc.sh qui permet de visualiser les paramètres par
protocole ou catégorie et leurs valeurs :
#!/bin/bash
Dans le cas des réglages ICMP on obtient le résultat suivant avec un noyau de distribution
standard :
# ./bin/show_proc.sh
icmp/proc/sys/net/ipv4/netfilter/ip_conntrack_icmp_timeout =
30/proc/sys/net/ipv4/icmp_ratemask =
6168/proc/sys/net/ipv4/icmp_ratelimit =
1000/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses =
0/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts =
0/proc/sys/net/ipv4/icmp_echo_ignore_all = 0
Pour changer les valeurs par défaut attribuées dans le noyau, il existe au moins trois solutions
:
• La première solution consiste à affecter les valeurs individuellement. Prenons l'exemple
célèbre de la fonction de routage des paquets IP du noyau:
# ./bin/show_proc.sh
icmp_ignore_bogus_error_responses/proc/sys/net/ipv4/icmp_ignor
e_bogus_error_responses = 1
Ethereal supporte les descriptions des champs spécifiques de plus de 580 protocoles. Voir le
menu Help->Supported Protocols.
En mode super-utilisateur Partant d'une connexion avec un compte utilisateur normal, celui-ci
est propriétaire exclusif de son écran (display). Il doit donc autoriser le super utilisateur à
accéder à son écran à l'aide de la commande xhost, passer en connexion super-utilisateur
avec la commande su puis exécuter l'application Ethereal.
$ xhost +local:$ suPassword:# ethereal &
En mode utilisateur avec sudo L'application sudo permet de déléguer les droits du super-
utilisateur avec une granularité très fine. L'optique de l'analyse réseau étant un cas particulier
de l'administration système, on se limitera à la présentation du fichier de configuration de
l'application : /etc/sudoers.
# sudoers file.## This file MUST be edited with the 'visudo'
command as root.## See the man page for details on how to
write a sudoers file.#
# Host alias specification
C'est à la dernière ligne que se situe la partie intéressante. L'utilisateur normal etu dispose,
sur n'importe quel hôte géré par ce système (ALL), d'un accès super-utilisateur aux
applications Ethereal et tcptraceroute sans avoir à saisir son mot de passe. Pour lancer
l'application, il faut préciser l'appel à l'application sudo de la façon suivante :
Interface utilisateur
7
Capture d'écran Ethereal -vue complète
Barre des icônes Cette barre regroupe tous les raccourcis sur les manipulations d'une capture.
Barre de filtrage Cette barre sert à saisir l'expression de filtrage à postériori d'une capture pour
isoler tout ou partie d'un échange réseau.
Fenêtre d'affichage de la pile des protocoles décodés pour la trame sélectionnée Avant toute
opération de développement des champs d'un ou plusieurs protocoles, cette fenêtre donne
la liste la pile de protocoles décodés allant du niveau physique (en haut) jusqu'au niveau le
plus haut reconnu (en bas). Le protocole de niveau le plus haut reconnu apparaît est celui
qui apparaît dans la colonne protocole de la Fenêtre contenant la liste des trames
capturées.
La première ligne ou niveau Frame correspond à une pseudo couche physique. Comme il n'est
pas possible de réaliser la capture directement à partir des composants électroniques qui
pilotent l'interface réseau sans perturber le fonctionnement du système, l'opération a lieu au
niveau liaison à l'aide de la bibliothèque libpcap.
A ce niveau, les informations disponibles sont : la quantité de bits capturés et la date
de capture.
La deuxième ligne correspond au niveau liaison. On y détaille le type et les champs de
la trame et les adresses physiques.
Pour le développement de chacun des champs de la trame, il faut cliquer sur le triangle
situé à gauche au niveau de chaque couche.
Fenêtre d'affichage brut de la trame sélectionnée Cette fenêtre affiche tous les octets de la
trame en hexadécimal.
Capture d'une série de trame
Après avoir lancé le logiciel Ethereal, suivre la séquence suivante pour capturer une série de
60 trames :
Sélectionner Capture puis Start.
La ligne Capture Filter, permet de préciser un filtrage à priori. La syntaxe de ce filtrage est
identique à celle de la commande tcpdump. La documentation est disponible à partir des
pages de manuels de cette command : man tcpdump. Voici 3 exemples :
ip : en spécifiant le protocole réseau à analyser, on évite la capture des trames des autres
protocoles de niveau réseau (IPX) et des protocoles de niveau liaison (STP, CDP, etc.).
host 192.168.0.1 : en spécifiant l'adresse IP d'un hôte, on ne retient que le trafic émis
et reçu par cette adresse.
host 192.168.0.1 and host 10.0.0.1 : en spécifiant les adresses IP de 2 hôtes,
on ne retient que le trafic entre ces 2 adresses.
D'une façon plus générale, on peut combiner plusieurs critères avec les opérateurs logiques
and et|ou or.
le type : host, net et port.
la direction : src et dst.
le protocole : ether, fddi, tr, ip, ip6, arp, rarp, decnet, tcp et udp.
La rubrique Stop Capture permet de fixer plusieurs critères d'arrêt en fonction du nombre de
trames et|ou du volume de données capturées.
8
Paramètres de capture -vue complète
Filtrage de l'affichage après capture
Le filtrage à postériori est certainement l'étape la plus importante dans l'analyse réseau. C'est
cette opération qui permet d'isoler l'information pertinente. La granularité de la syntaxe de
filtrage disponible avec Ethereal est très importante. Il est possible de retenir un champ
unique parmi les 580 protocoles supportés. Voici quelques exemples de filtrage allant du plus
général au plus détaillé.
Après avoir réalisé une capture, il est possible d'isoler une connexion TCP en repérant son
établissement (le début) et sa libération (la fin). En cliquant sur le bouton droit de la souris
après avoir sélectionné n'importe quelle trame appartenant à la connexion à isoler, il faut
valider l'option Follow TCP Stream.
9
Isoler une connexion TCP -vue complète
A la suite de cette opération, Ethereal ouvre une nouvelle fenêtre contenant les
données vues de la couche transport.
10
Données vues de la couche transport -vue complète
Syntaxe du filtrage à postériori
Comme indiqué ci avant, la granularité de la syntaxe de filtrage est très importante. Elle peut
donc s'avérer très complexe à manipuler. Ethereal offre plusieurs solutions pour rendre
l'apprentissage de cette syntaxe interactif.
Tout d'abord, l'opération précédente de filtrage simplifié n'était qu'un cas particulier de saisie
interactive de filtre de capture. En sélectionnant l'option Follow TCP Stream, on a «saisi» un
filtre avec la syntaxe suivante :
(ip.addr eq 192.168.1.9 and ip.addr eq 80.247.225.35) \ and
(tcp.port eq 32783 and tcp.port eq 80)
Cette expression est extraite de la Barre de filtrage. Elle doit tenir sur une ligne unique
quelque soit sa longueur.
ip.addr : sélection d'une adresse IP.
eq 192.168.1.9 : valeur particulière d'adresse IP. L'opérateur eq correspond à un test
d'égalité. Il est aussi possible d'utiliser la syntaxe du langage C pour les tests :
== : égalité,
!= : différence,
>= : supérieur ou égal,
<= : inférieur ou égal.
Les opérateurs logiques tels que and et|ou or associés aux parenthèses servent à composer
des expressions de
sélection précises.
tcp.port : sélection d'un numéro de port du protocole TCP de la couche transport.
eq 32783 : valeur particulière de port TCP. La syntaxe de test est identique pour tous les
champs des différents
protocoles reconnus.
La construction interactive des filtres d'affichage peut se faire à l'aide de la souris. Voici 2
exemples «simplistes» :
Option TCP MSS Admettons que l'on veuille repérer toutes les trames capturées dans
lesquelles l'option MSS (Maximum Segment Size) apparaît. On développe alors l'en-tête
TCP d'un paquet correspondant à une demande de connexion pour faire apparaître cette
option. En cliquant sur le bouton droit de la souris on accède au menu Prepare a Filter.
11
Préparation d'un filtre d'affichage à la souris -vue complète L'expression préparée apparaît
dans la champ de la Barre de filtrage :
tcp.options.mss_val == 1460
Supposons maintenant que l'on veuille afficher toutes les trames ayant cette option
indépendemment de sa valeur. Il suffit alors de supprimer le test :
tcp.options.mss_val
On observe ensuite le résultat sur l'affichage des trames capturées. La syntaxe du filtre est :
ip.flags.df == 0
La documentation sur l'ensemble des champs des protocoles reconnus utilisables dans les
13
expressions de filtres d'affichage est disponible à l'adresse : Display Filter Reference .
Sur http://www.ethereal.com/docs/dfref/
iproute2
Pourquoi iproute2 ?
La plupart des distributions Linux et des UNIX utilisent couramment les vénérables
commandes arp, ifconfig et route. Bien que ces outils fonctionnent, ils montrent quelques
comportements inattendus avec les noyaux Linux des séries 2.2 et plus. Par exemple, les
tunnels GRE font partie intégrante du routage de nos jours, mais ils nécessitent des outils
complètement différents.
Avec iproute2, les tunnels font partie intégrante des outils.
Les noyaux Linux des séries 2.2 et plus ont un sous-système réseau complètement réécrit. Ce
nouveau codage de la partie réseau apporte à Linux des performances et des fonctionnalités
qui n'ont pratiquement pas d'équivalent parmi les autres systèmes d'exploitation. En fait, le
nouveau logiciel de filtrage, routage et de classification possède plus de fonctionnalités que
les logiciels fournis sur beaucoup de routeurs dédiés, de pare-feu et de produits de mise en
forme (shaping) du trafic.
Dans les systèmes d'exploitation existants, au fur et à mesure que de nouveaux concepts
réseau apparaissaient, les développeurs sont parvenus à les greffer sur les structures
existantes. Ce travail constant d'empilage de couches a conduit à des codes réseau aux
comportements étranges, un peu comme les langues humaines. Dans le passé, Linux émulait
le mode de fonctionnement de SunOS, ce qui n'était pas l'idéal.
La nouvelle structure d'iproute2 a permis de formuler clairement des fonctionnalités
impossibles à implémenter dans le sous-système réseau précédent.
Prérequis
Vous devez être sûr que vous avez installé les outils utilisateur (NdT : userland tools, par
opposition à la partie « noyau » d'iproute2). Le paquet concerné s'appelle iproute sur RedHat
et Debian. Autrement, il peut être trouvé à ftp://ftp.inr.ac.ru/ip-
routing/iproute2-2.2.4-now-ss??????.tar.gz.
1
Vous pouvez aussi essayer iproute2-current.tar.gz pour la dernière version.
Certains éléments d'iproute vous imposent l'activation de certaines options du noyau. Il devra
également être noté que toutes les versions de RedHat jusqu'à la version 6.2 incluse n'ont pas
les fonctionnalités du contrôle de trafic activées dans le noyau fourni par défaut.
RedHat 7.2 contient tous les éléments par défaut.
Soyez également sûr que vous avez le support netlink, même si vous devez choisir de
compiler votre propre noyau ; iproute2 en a besoin.
Cela peut vous paraître surprenant, mais iproute2 est déjà configuré ! Les
commandes courantes ifconfig et route utilisent déjà les appels système avancés
d'iproute2, mais essentiellement avec les options par défaut (c'est-à-dire
ennuyeuses).
L'outil ip est central, et nous allons lui demander de nous montrer les interfaces.
La sortie peut varier, mais voici ce qui est affiché pour mon routeur NAT (NdT : traduction
d'adresse) chez moi. J'expliquerai seulement une partie de la sortie, dans la mesure où tout
n'est pas directement pertinent.
La première interface que nous voyons est l'interface loopback. Bien que votre ordinateur
puisse fonctionner sans, je vous le déconseille. La taille de MTU (unité maximum de
transmission) est de 3924 octets, et loopback n'est pas supposé être mis en file d'attente, ce
qui prend tout son sens dans la mesure où cette interface est le fruit de l'imagination de votre
noyau.
Je vais passer sur l'interface dummy pour l'instant, et il se peut qu'elle ne soit pas présente sur
votre ordinateur. Il y a ensuite mes deux interfaces physiques, l'une du côté de mon modem
câble, l'autre servant mon segment ethernet à la maison. De plus, nous voyons une interface
ppp0.
Notons l'absence d'adresses IP. Iproute déconnecte les concepts de « liens » et « d'adresses IP
». Avec l'IP aliasing, le concept de l'adresse IP canonique est devenu, de toute façon, sans
signification.
ip nous montre bien, cependant, l'adresse MAC, l'identifiant matériel de nos interfaces
ethernet.
Cela contient plus d'informations : ip montre toutes nos adresses, et à quelles cartes elles
appartiennent. inet signifie Internet (IPv4). Il y a beaucoup d'autres familles d'adresses,
mais elles ne nous concernent pas pour le moment.
Examinons l'interface eth0 de plus près. Il est dit qu'elle est reliée à l'adresse internet
10.0.0.1/8. Qu'est-ce que cela signifie ? Le /8 désigne le nombre de bits réservés à
l'adresse réseau. Il y a 32 bits, donc il reste 24 bits pour désigner une partie de notre réseau.
Les 8 premiers bits de 10.0.0.1 correspondent à 10.0.0.0, notre adresse réseau, et
notre masque de sous-réseau est 255.0.0.0.
Les autres bits repèrent des machines directement connectées à cette interface. Donc,
10.250.3.13 est directement disponible sur eth0, comme l'est 10.0.0.1 dans notre
exemple.
Avec ppp0, le même concept existe, bien que les nombres soient différents. Son adresse est
212.64.94.251, sans masque de sous-réseau. Cela signifie que vous avez une liaison
point à point et que toutes les adresses, à l'exception de 212.64.94.251, sont distantes. Il
y a cependant plus d'informations. En effet, on nous dit que de l'autre côté du lien, il n'y a
encore qu'une seule adresse, 212.64.94.1. Le /32 nous précise qu'il n'y a pas de « bits
réseau ».
Il est absolument vital que vous compreniez ces concepts. Référez-vous à la documentation
mentionnée au début de ce HOWTO si vous avez des doutes.
Vous pouvez aussi noter qdisc, qui désigne la gestion de la mise en file d'attente (Queueing
Discipline). Cela deviendra vital plus tard.
Nous savons maintenant comment trouver les adresses 10.x.y.z, et nous sommes capables
d'atteindre 212.64.94.1. Cela n'est cependant pas suffisant, et nous avons besoin
d'instructions pour atteindre le monde. L'Internet est disponible via notre connexion PPP, et il
se trouve que 212.64.94.1 est prêt à propager nos paquets à travers le monde, et à nous
renvoyer le résultat.
Cela se comprend de soi-même. Les 4 premières lignes donnent explicitement ce qui était
sous-entendu par ip address show, la dernière ligne nous indiquant que le reste du
monde peut être trouvé via 212.64.94.1, notre passerelle par défaut. Nous pouvons voir
que c'est une passerelle à cause du mot « via », qui nous indique que nous avons besoin
d'envoyer les paquets vers 212.64.94.1, et que c'est elle qui se chargera de tout.
ARP
ARP est le Protocole de Résolution d'Adresse (Address Resolution Protocol). Il est décrit dans
2
le RFC 826 . ARP est utilisé par une machine d'un réseau local pour retrouver l'adresse
matérielle (la localisation) d'une autre machine sur le même réseau. Les machines sur Internet
sont généralement connues par leur nom auquel correspond une adresse IP. C'est ainsi qu'une
machine sur le réseau foo.com est capable de communiquer avec une autre machine qui est
sur le réseau bar.net. Une adresse IP, cependant, ne peut pas vous indiquer la localisation
physique de la machine. C'est ici que le protocole ARP entre en jeu.
Prenons un exemple très simple. Supposons que j'aie un réseau composé de plusieurs
machines, dont la machine foo d'adresse IP 10.0.0.1 et la machine bar qui a l'adresse
IP 10.0.0.2. Maintenant, foo veut envoyer un ping vers bar pour voir s'il est actif,
mais foo n'a aucune indication sur la localisation de bar. Donc, si foo décide d'envoyer
un ping vers bar, il a besoin d'envoyer une requête ARP. Cette requête ARP est une façon
pour foo de crier sur le réseau « Bar (10.0.0.2) ! Où es-tu ? ». Par conséquent, toutes les
machines sur le réseau entendront foo crier, mais seul bar (10.0.0.2) répondra. Bar
enverra une réponse ARP directement à foo ; ce qui revient à dire : « Foo
(10.0.0.1) ! je suis ici, à l'adresse 00:60:94:E:08:12 ». Après cette simple transaction utilisée
pour localiser son ami sur le réseau, foo est capable de communiquer avec bar jusqu'à ce
qu'il (le cache ARP de foo) oublie où bar est situé (typiquement au bout de 15 minutes sur
Unix).
Maintenant, voyons comment cela fonctionne. Vous pouvez consulter votre cache (table)
ARP (neighbor) comme ceci :
Si vous avez un routeur important, il se peut que vous vouliez satisfaire les besoins de
différentes personnes, qui peuvent être traitées différemment. Les bases de données des
politiques de routage vous aident à faire cela, en gérant plusieurs ensembles de tables de
routage.
Si vous voulez utiliser cette fonctionnalité, assurez-vous que le noyau est compilé avec les
options IP : Advanced router et IP : policy routing.
Quand le noyau doit prendre une décision de routage, il recherche quelle table consulter. Par
défaut, il y a trois tables. L'ancien outil route modifie les tables principale (main) et locale
(local), comme le fait l'outil ip (par défaut).
Les règles par défaut :
Ceci liste la priorité de toutes les règles. Nous voyons que toutes les règles sont appliquées à
tous les paquets (from all). Nous avons vu la table main précédemment, sa sortie s'effectuant
avec ip route ls, mais les tables local et default sont nouvelles.
Si nous voulons faire des choses fantaisistes, nous pouvons créer des règles qui pointent vers
des tables différentes et qui nous permettent de redéfinir les règles de routage du système.
Pour savoir exactement ce que fait le noyau en présence d'un assortiment de règles plus
complet, référez-vous à la documentation ip-cref d'Alexey [NdT : dans le paquetage iproute2
de votre distribution].
Prenons encore une fois un exemple réel. J'ai 2 modems câble, connectés à un routeur Linux
NAT (masquerading). Les personnes habitant avec moi me paient pour avoir accès à Internet.
Supposons qu'un de mes co-locataires consulte seulement hotmail et veuille payer moins.
C'est d'accord pour moi, mais il utilisera le modem le plus lent.
Le modem câble « rapide » est connu sous 212.64.94.251 et est en liaison PPP avec
212.64.94.1. Le modem câble « lent » est connu sous diverses adresses IP :
212.64.78.148 dans notre exemple avec un lien vers 195.96.98.253.
La table locale :
Il y a beaucoup de choses évidentes, mais aussi des choses qui ont besoin d'être précisées
quelque peu, ce que nous allons faire. La table de routage par défaut est vide.
Regardons la table principale (main):
Maintenant, nous générons une nouvelle règle que nous appellerons John, pour notre
hypothétique co-locataire. Bien que nous puissions travailler avec des nombres IP purs, il est
plus facile d'ajouter notre table dans le fichier
/etc/iproute2/rt_tables.
Maintenant, tout ce qu'il reste à faire est de générer la table John, et de vider le cache des
routes :
Et voilà qui est fait. Il ne reste plus, comme exercice laissé au lecteur, qu'à implémenter cela
dans ip-up.
La première est de savoir comment router les réponses aux paquets entrants par un fournisseur
particulier, disons le Fournisseur 1, vers ce même fournisseur.
Commençons par définir quelques symboles. $IF1 sera le nom de la première interface (if1
sur la figure au-dessus) et $IF2 le nom de la deuxième interface. $IP1 sera alors l'adresse IP
associée à $IF1 et $IP2 sera l'adresse IP associée à $IF2. $P1 sera l'adresse IP de la passerelle
du fournisseur d'accès 1 et $P2 sera l'adresse IP de la passerelle du fournisseur d'accès 2.
Enfin, $P1_NET sera l'adresse réseau à l'intérieur duquel se situe $P1 et $P2_NET sera
l'adresse réseau à l'intérieur duquel se situe $P2.
Deux tables de routage supplémentaires sont créées, par exemple T1 et T2. Celles-ci sont
ajoutées dans /etc/iproute2/rt_tables. La configuration du routage dans ces tables
s'effectue de la façon suivante :
Rien de vraiment spectaculaire. Une route est simplement positionnée vers la passerelle et une
route par défaut via
cette passerelle est mise en place, comme nous le ferions dans le cas d'un seul fournisseur
d'accès. Ici, les routes sont placées dans des tables séparées, une par fournisseur d'accès. Il est
à noter que la route vers le réseau suffit, dans la mesure où elle indique comment trouver
n'importe quel hôte dans ce réseau, ce qui inclut la passerelle.
La table de routage principale est maintenant configurée. C'est une bonne idée de router les
éléments à destination d'un voisin direct à travers l'interface connectée à ce voisin. Notez les
arguments "src" qui assurent que la bonne adresse IP source sera choisie.
ip route add $P1_NET dev $IF1 src $IP1ip route add $P2_NET dev
$IF2 src $IP2
Vous configurez ensuite les règles de routage. Celles-ci définissent la table qui sera vraiment
choisie pour le routage.Il faut s'assurer que le routage s'effectue à travers une interface donnée
si vous avez l'adresse source correspondante :
ip rule add from $IP1 table T1ip rule add from $IP2 table T2
Cet ensemble de commandes vous assure que toutes les réponses au trafic entrant sur une
interface particulière seront envoyées par cette interface.
Avertissement
Notes d'un lecteur : si $P0_NET est le réseau local et $IF0 est son interface, alors
les entrées suivantes sont désirables :
Nous avons maintenant une configuration très basique. Elle marchera pour tous
les processus exécutés sur le routeur lui-même, ainsi que pour le réseau local si celui-ci est
masqué. Si ce n'est pas le cas, soit vous avez une plage d'adresses IP pour chaque fournisseur
d'accès, soit vous masquez vers l'un des deux fournisseurs d'accès. Dans les deux cas, vous
ajouterez des règles indiquant, en fonction de l'adresse IP de la machine du réseau local, vers
quel fournisseur vous allez router.
Balance de charge
La seconde question concerne la balance de charge du trafic sortant vers les deux fournisseurs
d'accès. Ceci n'est pas vraiment très dur si vous avez déjà configuré l'accès séparé comme
décrit ci-dessus.
Au lieu de choisir l'un des deux fournisseurs d'accès comme route par défaut, celle-ci peut être
une route multi-chemin. Par défaut, le noyau répartira les routes vers les deux fournisseurs
d'accès. Ceci est réalisé de la façon suivante (construit également sur l'exemple de la section
de l'accès séparé) :
ip route add default scope global nexthop via $P1 dev $IF1
weight 1 \
nexthop via $P2 dev $IF2 weight 1
Ceci réalisera la balance des routes vers les deux fournisseurs. Les paramètres weight peuvent
permettre de favoriser un fournisseur par rapport à un autre.
Il est à noter que la balance de charge ne sera pas parfaite dans la mesure où elle est basée sur
les routes et que celles-ci sont mises dans des caches. Ceci signifie que les routes vers les sites
les plus souvent utilisés passeront toujours par le même fournisseur d'accès.
A et B sont des routeurs dont nous supposerons qu'ils fonctionnent avec Linux pour le
moment. Si le trafic va du réseau 1 vers le réseau 2, le routeur A a besoin de distribuer les
paquets sur les deux liens allant vers B. Le routeur B a besoin d'être configuré pour l'accepter.
On retrouve la même chose dans le sens inverse, pour les paquets allant du réseau 2 vers le
réseau 1. Le routeur B a besoin d'envoyer les paquets à la fois sur eth1 et eth2.
La répartition est faite par un périphérique TEQL, comme ceci (cela ne pouvait pas être plus
simple) :
Ceci a besoin d'être fait sur les deux hôtes. Le périphérique teql0 est basiquement un
distributeur tourniquet au-dessus de eth1 et eth2 pour l'envoi des paquets. Aucune
donnée n'arrive jamais à travers un périphérique teql, mais les données apparaissent sur
eth1 et eth2.
Nous n'avons pour le moment que les périphériques et nous avons également besoin d'un
routage correct. L'une des possibilités pour réaliser cela est d'assigner un réseau /31 sur
chacun des liens, ainsi que sur le périphérique teql0 :
FIXME: Avons nous besoin de quelque chose comme nobroadcast ? Un /31 est trop
petit pour contenir une adresse réseau et une adresse de diffusion. Si cela ne marche pas
comme prévu, essayez un /30, et ajustez les adresses IP. Vous pouvez même essayer sans
attribuer d'adresses à eth1 et eth2.
Sur le routeur A:
Sur le routeur B:
Le routeur A devrait maintenant être capable de lancer un ping vers 10.0.0.1, 10.0.0.3
et 10.0.0.5 à travers les deux liens physiques et le périphérique « égalisé ». Le routeur B
devrait maintenant être capable de lancer un ping vers 10.0.0.0, 10.0.0.2 et
10.0.0.4 à travers les liens.
Si cela marche, le routeur A peut prendre 10.0.0.5 comme route vers le réseau 2 et le
routeur B10.0.0.4 comme route vers le réseau 1. Pour le cas particulier où le réseau 1 est
votre réseau personnel et où le réseau 2 est l'Internet, le routeur A peut prendre 10.0.0.5
comme passerelle par défaut.
Avertissement
Rien n'est aussi simple qu'il y paraît. Les interfaces eth1 et eth2 sur les deux routeurs A
et B ne doivent pas avoir la fonction de filtrage par chemin inverse activée. Dans le cas
contraire, ils rejetteront les paquets destinés à des adresses autres que les leurs :
Il y a un sérieux problème avec le réordonnancement des paquets. Supposons que six paquets
aient besoin d'être envoyés de A vers B. Par exemple, eth1 peut traiter les paquets 1, 3 et 5
et eth2 les paquets 2, 4 et 6. Dans un monde idéal, le routeur B devrait recevoir ces paquets
dans l'ordre 1, 2, 3, 4, 5, 6. Mais il est plus probable que le noyau les recevra comme ceci : 2,
1, 4, 3, 6, 5. Ce problème va perturber TCP/IP. Alors qu'il n'y a pas de problèmes pour les
liens transportant différentes sessions TCP/IP, vous ne serez pas capable de regrouper
plusieurs liens et obtenir par ftp un simple fichier beaucoup plus rapidement, à moins que le
système d'exploitation envoyant ou recevant ne soit Linux. En effet, celui-ci n'est pas
facilement perturbé par de simples réordonnancements.
Cependant, l'équilibrage de charge est une bonne idée pour de nombreuses applications.
Jusqu'à maintenant, nous avons vu comment iproute travaille, et netfilter a été mentionné
plusieurs fois. Vous ne perdrez pas votre temps à consulter Rusty's Remarkably Unreliable
1 2
Guides . Le logiciel Netfilter peut être trouvé ici .
Netfilter nous permet de filtrer les paquets ou de désosser leurs en-têtes. Une de ses
fonctionnalités particulières est de pouvoir marquer un paquet avec un nombre, grâce à
l'option --set-mark.
Comme exemple, la commande suivante marque tous les paquets destinés au port 25, en
l'occurrence le courrier sortant.
Disons que nous avons plusieurs connexions, une qui est rapide (et chère au mégaoctet) et une
qui est plus lente, mais avec un tarif moins élevé. Nous souhaiterions que le courrier passe par
la route la moins chère.
Nous avons déjà marqué le paquet avec un "1" et nous allons maintenant renseigner la base de
données de la politique de routage pour qu'elle agisse sur ces paquets marqués.
Nous allons maintenant générer la table mail.out avec une route vers la ligne lente, mais peu
coûteuse.
Voilà qui est fait. Il se peut que nous voulions mettre en place des exceptions, et il existe de
nombreux moyens pour le faire. Nous pouvons modifier la configuration de netfilter pour
exclure certains hôtes ou nous pouvons insérer une règle avec une priorité plus faible qui
pointe sur la table principale pour nos hôtes faisant exception.
Nous pouvons aussi utiliser cette fonctionnalité pour nous conformer aux bits TOS en
marquant les paquets avec différents types de service et les nombres correspondants. On crée
ensuite les règles qui agissent sur ces types de service. De cette façon, on peut dédier une
ligne RNIS aux connexions interactives.
Inutile de le dire, cela marche parfaitement sur un hôte qui fait de la traduction d'adresse
(NAT), autrement dit du masquerading.
Désactivez le filtrage de chemin inverse pour que cela fonctionne correctement.
Note : pour marquer les paquets, vous aurez besoin de valider quelques options du noyau :
Dans cet article, je vais vous expliquer les différentes étapes pour mettre en place la QoS et
gérer votre bande passante sous Linux.
Pourquoi faire de la QoS ? Retenez que sans la QoS, vous ne pouvez pas gérer correctement
les flux qui transitent sur votre réseau. Vous aurez par exemple des problèmes à écouter un
flux audio en streaming sachant qu'en même temps, vous êtes en train de faire du ftp. Dans la
première partie de cet article, je vais vous montrer comment prioriser les divers flux de
votre réseau.
Pourquoi gérer la BP de mon réseau ? Une personne qui fait du ftp sur une ligne ADSL de
bureau peut monopoliser à elle seule toute la bande passante en sortie de votre réseau. Ce cas
ne se limite pas aux réseaux ADSL et peut être aussi constaté sur des réseaux à très haut débit
(lignes de type T1/T2). Linux peut apporter une solution efficace face à ce genre de problème
en vous offrant la possibilité de gérer intelligemment votre bande passante. Ce sera le sujet
de la deuxième partie de ce présent document.
Actuellement, sachez que vous pouvez faire de la QoS et de la gestion de bande passante sous
les noyaux 2.2 et 2.4. Néamoins, pour une question de facilité, je vous recommande un noyau
2.4 pour effectuer ce qui suit.
Pour faire de la QoS, nous allons modifier la valeur du champs TOS se situant dans l'en tête
IP grâce à iptables. Le champ TOS est sur 4 bits :
A vous d'adapter ce script suivant les services de votre réseau que vous souhaitez prioriser.
Nous abordons la deuxième partie du document. Linux utilise deux unités du contrôle de
trafic pour la gestion de la bande passante :
• Les filtres qui placent le trafic dans les files d'attentes (fwmark, u32)
• Les files d'attentes qui décident des flux prioritaires (CBQ, HTB, RED, TBF, SFQ...)
Gardez en vue que le protocole TCP/IP n'a pas d'aptitude à connaître les performances d'un
réseau. Il commence à envoyer des paquets, de plus en plus rapidement et quand des paquets
commencent à se perdre, il ralentit. La plupart des files d'attentes fonctionnent selon le
modèle suivant : elles recoivent des paquets, les positionnent en file d'attente jusqu'à un
certain point, et ensuite, éliminent tout paquet qui arrive dans le cas où la file d'attente est
pleine. Si on travaille en UDP, les paquets ne sont plus retransmis, si c'est du TCP, l'émetteur
renverra les paquets perdus. Le débit s'en trouve alors ralenti.
Compilation du noyau
Nous allons compiler le noyau afin que celui-ci sache gérer notre BP ( = Bande Passante). Si
vous avez une ditribution récente, il se peut que vous n'ayez pas besoin de le compiler. Lancez
un "make xconfig" sous le X dans le répertoire /usr/src/linux. Si cela ne marche pas, installez
les sources du noyau (le rpm est du type kernel-src-*.rpm)
Les options
Sélection à la
Option Noyau Définition
Compilation
QoS & fair queuing oui
Netfilter module Network Packet Filtering
(Classed Based Queue) - file d'attente basée
CBQ packet sur des classes. C'est ce type de file d'attente
module
scheduler qui sera implémentée dans la suite du présent
document
(Hierarchical Token buckets) implémenté dans
HTB packet la suite du présent document - Si vous ne
module
scheduler l'avez pas, j'explique plus bas comment avoir
cette file d'attente en patchant votre noyau
(Clark-Shenker-Zhang) - Les flux ne sont pas
CSZ packet
module limités à leur bande passante. Fournit un
scheduler
service garanti
The simplest PRIO
module
pseudoscheduler
(Random Early Detect) - Anticipe les
problèmes de congestion. RED élimine les
RED queue module
paquets pour indiquer à TCP/IP de ralentir -
Pour de gros débits
(Stochastic Fair Queuing) - Limitation basée
sur le taux de transfert utilisé - Consomme peu
SFQ queue module de CPU/Mem. Rapide, peu précis. Efficace sur
de gros débits - Offre un traitement
sensiblement équitable de chaque classe
Consomme peu de CPU. Limitation basée sur
TBF queue module le taux de transfert à utiliser - Non basé sur les
classes
(Queuing discipline) - Indispensable lorsque
Ingress QDisc module
l'on souhaite utiliser les files d'attente
QoS support oui
Rate estimator oui
Packet classifier
oui
API
TC Index classifier module
Routing table based
module
classifier
Firewall based
module
classifier
U32 classifier module
Special RSVP
module
classifier
Special RSVP
module
classifier for IPv6
Les files d'attentes les plus importantes sont CBQ et HTB (la suite du document se base sur
ces deux files d'attente). Vous n'êtes pas obligé de mettre en module les autres files d'attentes
(CSZ, RED, SFQ, TBF, TEQL), cependant, cela reste toujours intéressant de les laisser en
tant que module au cas où vous en auriez besoin plus tard.
Terminer la compilation
• make dep
• make clean
• make bzImage
• make modules
• make modules_install
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz
cp /usr/src/linux/arch/i386/boot/System.map /boot
Assurez-vous enfin que votre station Linux comporte la commande "tc" (un "which tc" vous
permettra de voir si "tc" est installé). Si vous ne l'avez pas, elle fait partie du package iproute2
(les sources sont ici et le rpm peut être téléchargé là)
Désormais, votre noyau linux implémente la gestion de bande passante. Il ne reste plus qu'à
écrire un script propre à votre config, ce qui est décrit dans la suite du document.
Si vous souhaitez partager votre bande passante sans trop vous compliquer la vie, sachez que
des scripts on été créés afin d'optimiser votre bande passante. Dans la suite du document, je
vais vous expliquer comment les mettre en place. Lisez bien la définition de chacun de ces
scripts, de manière à définir celui qui vous convient le mieux.
Remarque : Sachez que souvent, on préconise l'utilisation de files d'attentes de type HTB
plutot que CBQ. Cependant, si votre distribution n'est pas très récente, il y aura pas mal de
choses à réaliser pour implémenter les files d'attentes HTB sur votre station (j'explique
neanmoins la démarche à suivre si vous êtes dans ce cas).
CBQ.init
https://sourceforge.net/projects/cbqinit
Les fichiers de configuration doivent respecter une syntaxe précise de type cbq-
CLASS_ID.name où CLASS_ID est compris en hexa entre 0002 et FFFF (pour en savoir
plus, editez le script, c'est expliqué en détail).
Voilà, vous êtes désormais un gourou des files d'attentes CBQ :). Passons maintenant à la
gestion de la BP avec file d'attentes HTB.
HTB.init
Notes pour noyau < 2.4.18-3 : pour utiliser des files d'attentes HTB, sachez que vous devez
patcher votre noyau si il est inférieur à la version 2.4.18-3 (tapez "uname -a" pour vérifier la
version de votre distribution) :
http://luxik.cdi.cz/~devik/qos/htb/v2/htb2_2.4.17.diff pour les noyaux 2.4
http://luxik.cdi.cz/~devik/qos/htb/v2/htb2_2.2.17.diff pour les noyaux 2.2
Pour appliquer le patch lancez la commande suivante dans le répertoire /usr/src/linux : "patch
-pl -i htb2_2.4.17.diff"
Dans /usr/src/linux tapez : "make xconfig"
Dans la partie "Networking Options" -> "QoS and fair Queuing", selectionnez HTB packet
scheduler en module
Recompilez le noyau : "make dep && make clean && make bzImage && make modules &&
make modules_install"
Mettez en place le nouveau noyau qui prend en charge HTB :
cp /usr/src/linux/arch/i386/bzImage /boot/vmlinuz
cp /usr/src/linux/arch/i386/boot/System.map /boot
Il n'existe pas un mais plusieurs fichiers de configurations pour HTB.init. Les fichiers doivent
obligatoirement avoir une syntaxe précise. Par exemple :
Cela peut paraître un peu confu comme syntaxe, cependant, je vais vous donner des exemples.
Editez le script si vous souhaitez néanmoins en savoir plus à ce sujet.
Avec ce type de files d'attentes, vous ne pouvez realiser un contrôle de flux qu'en sortie de
vos interfaces réseaux. Dans le cas d'une station qui fait du routage, configurez les débits sur
les sorties des deux interfaces (voir exemple 2).
Exemple 1 :
Imaginons que vous ayez une bande passante sur votre station de 5 Mbits/s (~600Ko/s). Vous
souhaitez :
fichier eth0
DEFAULT=30 # ID class default - Le traffic non répertorié utilisera la class ID 30
fichier eth0-2.root
RATE=5Mbit # Bande passante allouée a la classe root (ici 5Mbits)
BURST=15k
fichier eth0-2:10.www
RATE=5Mbit
BURST=15k
LEAF=sfq # Type de file d'attente utilisée par cette classe (ici sfq)
RULE=*:80, # Voir les exemples du script CBQ.init - La syntaxe "RULE" est identique
fichier eth0-2:20.smtp
RATE=3Mbit
CEIL=5Mbit # La bande passante max de cette classe peut aller jusqu'a 5 Mbits/s uniquement
si il y a de la BP de libre.
BURST=15k
LEAF=sfq
RULE=*:25
fichier eth0-2:30.dfl
RATE=1Kbit
CEIL=5Mbit
BURST=15k
LEAF=sfq
Exemple 2 :
On traite ici le cas d'une personne ayant une connexion ADSL de type 512/128. Sa connexion
se fait via une machine-routeur possédant deux interfaces (eth0 et eth1). Elle souhaite limiter
l'upload à 90 Kbits/s (11,3 Ko/s) et donner la priorité aux services HTTP, SSH, TELNET,
POP3, SMTP et DNS. Une priorité plus petite sera attribuée à tout autre traffic. Côté,
download on garde la même idée, cependant, la limite sera fixée à 450 Kbits/s (57 Ko/s).
fichier eth1 (Tous fichier de type eth1* -> traffic sortant de l'interface eth1)
DEFAULT=30
R2Q=1
fichier eth1-2.root
#Classe root pour traffic sortant
RATE=90Kbit
fichier eth1-2\:10.high
# Classe pour traffic sortant de haute priorité
RATE=30Kbit
CEIL=prate
LEAF=sfq
#HTTP
RULE=*:80
#SSH
RULE=*:22
#TELNET
RULE=*:23
#SMTP
RULE=*:25
#DNS
RULE=*:53
#POP3
RULE=*:110
fichier eth1-2\:20.normal
# Classe pour traffic sortant normal
RATE=30kbit
CEIL=prate
LEAF=sfq
#IRC
RULE=*:6667
fichier eth1-2\:30.low
# Classe pour traffic sortant peu important
RATE=20Kbit
CEIL=prate
LEAF=sfq
#EMULE
RULE=*:3000
RULE=*:3000,
RULE=*:3010
RULE=*:3010,
RULE=*:4662 RULE=*:4662,
fichier eth0 (Tous fichier de type eth0* -> traffic sortant de l'interface eth0)
DEFAULT=30
R2Q=10
fichier eth0-2\:10.high
# Classe pour traffic sortant de haute priorité
RATE=150 Kbit
CEIL=prate
LEAF=sfq
#HTTP
RULE=*:80,
#SSH
RULE=*:22,
#TELNET
RULE=*:23,
#SMTP
RULE=*:25,
#DNS
RULE=*:53,
#POP3
RULE=*:110,
fichier eth0-2\:20.normal
# Classe pour traffic sortant normal
RATE=30kbit
CEIL=prate
LEAF=sfq
#IRC
RULE=*:6667,
fichier eth0-2\:30.low
# Classe pour traffic sortant peu important
RATE=150Kbit
CEIL=prate
LEAF=sfq
#EMULE
RULE=*:3000,
RULE=*:3010,
RULE=*:4662,
RULE=*:3000
RULE=*:3010
RULE=*:4662
RULE=*:4662
RULE=*:4662,
Il ne reste plus qu'à lancer le script HTB.init à chaque démarrage ; pour cela éditez le
/etc/rc.d/rc.local et ajoutez la ligne "HTB.init-[version] start" où [VERSION] désigne la
version de votre script HTB.
Si vous souhaitez obtenir des statistiques HTB, lancez la commande "HTB.init-[VERSION]
stats". Le script vous sortira des informations qui peuvent s'avérer utile.
wondershaper
http://lartc.org/wondershaper
Editez le script wshaper et indiquez les débits ; par exemple pour une ligne ADSL 512/128 :
DOWNLINK= 500
UPLINK= 100
DEV=ppp0
J'ai trouvé sur internet un script dérivé de Wondershaper, il peut s'avérer intéressant de le
mettre en oeuvre si vous avez une connexion de type ADSL. En revanche, ce script fait appel
à de nombreuses files d'attentes : CBQ, RED, IMQ, HTB et SFQ (Assurez-vous au préalable
que votre noyau les prend toutes en compte).
#!/bin/bash
#
# mon_limiteur - Limiteur et classificateur de trafic pour
modem Cable ou ADSL.
# Inspiré de WonderShaper (www.lartc.org)
#
# Écrit par Dan Singletary (7/8/02)
#
# Remarque - ce script suppose que le noyau a été patché avec
les files
# HTB et IMQ disponibles ici (les noyaux à venir ne demanderont
# pas forcément l'application d'un correctif):
# http://luxik.cdi.cz/~devik/qos/htb/
# http://luxik.cdi.cz/~patrick/imq/
#
# Options de configuration pour mon_limiteur:
# DEV - correspond au périphérique ethX connecté au modem
# RATEUP - à positionner à une valeur inférieure à la bande
# passante montante de la ligne.
# Pour ma ligne ADSL en 1500/128, RATEUP=90 convient au rythme
# montant de 128 kbps. À vous d'ajuster.
# RATEDN - à positionner en dessous de la bande passante
descendante de
# la ligne.
#
#
# Principe d'utilisation d'imq pour limiter le trafic entrant:
#
# Il est impossible de limiter directement le rythme auquel les
# données vous sont envoyées depuis l'Internet. Afin de limiter
le
# trafic entrant, on s'appuie sur les mécanismes anti-
congestion de
# TCP. Ceci signifie que SEUL LE TRAFIC TCP PEUT SE LIMITER. Le
# trafic hors TCP est placé dans une queue prioritaire car le
jeter
# ne conduit vraisemblablement qu'à une retransmission
ultérieure
# qui accroît la bande passante consommée.
# On limite le trafic TCP en jetant les paquets lorsqu'ils
débordent
# de la file HTB qui les limitera à un certain rythme (RATEDN)
# légèrement inférieur à la capacité réelle de la ligne. Jeter
ces
# paquets revient à en singer la perte par la file d'émission
du
# côté du FAI. Ceci a l'avantage d'éviter la congestion de la
file
# d'émission chez le FAI puisque TCP ralentira avant qu'elle ne
# se remplisse. L'usage d'une stratégie de mise en attente
basée sur
# la classification des paquets par priorité permet de ne PAS
jeter
# certains types de paquets (ssh, telnet, etc). Les paquets ne
sont
# retirés des files d'attente de faible priorité qu'une fois
que
# chaque classe a atteint un seuil minimum (1/7 de la bande
passante
# dans ce script).
#
# Résumé:
# * La perte d'un paquet TCP diminue le rythme de réception de
la
# connexion associée via les mécanismes de contrôle de
congestion.
# * Jeter des paquets TCP n'apporte rien. S'ils sont
importants, ils
# seront retransmis.
# * Limiter le rythme des connexions TCP entrantes en dessous
de la
# capacité de la ligne DEVRAIT éviter la mise en attente des
paquets
# du côté du FAI (DSLAM, concentrateur de cables, etc).
L'expérience
# indique que ces files contiennent 4 secondes de trafic à
1500 kbps,
# soit 6 Mb de données. À ce niveau, l'absence de mise en
attente
# diminue la latence.
#
# Avertissements:
# * Est-ce que la limitation de bande passante diminue
l'efficacité de
# transferts TCP massifs ?
# - Apparemment non. L'augmentation de priorité des paquets
# d'acquittement maximise le débit en évitant de perdre de la
bande
# passante à retransmettre des paquets déjà reçus.
#
DEV=eth0
RATEUP=90
RATEDN=700 # Nettement inférieur à la capacité de la ligne de
1500.
# On n'a donc pas à limiter le trafic entrant jusqu'à ce
# qu'une meilleure réalisation telle que la modification
# de fenêtre TCP soit disponible.
#
# Fin des options de configuration
#
if [ "$1" = "status" ]
then
echo "[qdisc]"
tc -s qdisc show dev $DEV
tc -s qdisc show dev imq0
echo "[class]"
tc -s class show dev $DEV
tc -s class show dev imq0
echo "[filter]"
tc -s filter show dev $DEV
tc -s filter show dev imq0
echo "[iptables]"
iptables -t mangle -L MONLIMITEUR-OUT -v -x 2> /dev/null
iptables -t mangle -L MONLIMITEUR-IN -v -x 2> /dev/null
exit
fi
# Remise à zéro
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev imq0 root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV -j MONLIMITEUR-OUT 2>
/dev/null > /dev/null
iptables -t mangle -F MONLIMITEUR-OUT 2> /dev/null > /dev/null
iptables -t mangle -X MONLIMITEUR-OUT 2> /dev/null > /dev/null
iptables -t mangle -D PREROUTING -i $DEV -j MONLIMITEUR-IN 2>
/dev/null > /dev/null
iptables -t mangle -F MONLIMITEUR-IN 2> /dev/null > /dev/null
iptables -t mangle -X MONLIMITEUR-IN 2> /dev/null > /dev/null
ip link set imq0 down 2> /dev/null > /dev/null
rmmod imq 2> /dev/null > /dev/null
if [ "$1" = "stop" ]
then
echo "Limitation de débit désactivée sur $DEV."
exit
fi
###########################################################
#
# Limitation de trafic sortant (limite supérieure à RATEUP)
# shell sécurisé
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --dport ssh -j
MARK --set-mark 22
# shell sécurisé
iptables -t mangle -A MONLIMITEUR-OUT -p tcp --sport ssh -j
MARK --set-mark 22
#################################################### #
# Limitation du trafic entrant (débit maximal de RATEDN)
# shell sécurisé
iptables -t mangle -A MONLIMITEUR-IN -p tcp --dport ssh -j MARK
--set-mark 20
# shell sécurisé
iptables -t mangle -A MONLIMITEUR-IN -p tcp --sport ssh -j MARK
--set-mark 20
#!/bin/bash
echo 'Qdisc'
tc -s qdisc show dev eth0
echo 'Classes'
tc -s class show dev eth0
echo 'Filter'
tc -s filter show dev eth0