Aperçu des réseaux informatiques
1 Les réseaux locaux
1.1 Construire un réseau local
1.1.1 Les types de relais classiques
-
Les répéteurs (couche physique) :
- Les commutateurs (couche liaison) :
- Les routeurs (couche réseau)
1.1.2 Démocratisation des commutateurs
-
Historique de l'évolution des réseaux locaux :
-
Un réseau local à diffusion :
- Vers des réseaux segmentés :
- Le but, la commutation totale:
1.1.3 Le Spanning Tree
-
Liens redondants pour la robustesse :
- Eviter les doublons dans les réseaux ...
- ... mais surtout éviter les boucles.
- Principe de fonctionnement du Spanning Tree :
-
un identifiant associé à chaque élément,
- messages BPDU échangés entre éléments (Bridge Protocol Data Units),
- un algorithme itératif pour casser les cycles.
- Grandes lignes de l'algorithme :
-
Election d'un élément racine (plus petit identifiant) :
- Par élément, élection d'un port racine
(le plus proche de l'élément racine) :
- Par segment, élection d'un élément privilégié :
- Les port non marqués sont désactivés (uniquement réception des BPDU).
- Importance du choix de l'élément racine.
1.1.4 Les réseaux virtuels
-
Concept de réseaux virtuels (VLAN, norme IEEE 802.1q) :
- Encapsulation des trames (ISL) ou protocole 802.3ac.
- Définition des VLAN par ports, adresses MAC ou adresses IP.
- Communication inter-VLAN par routeur.
1.2 Configuration IP (théorie)
1.2.1 Hypothése de travail
-
Une hypothèse : utilisation d'Ethernet.
- Les protocoles sont encapsulés :
- Quelques codes Ethernet de protocoles :
0600 |
XNS |
0800 |
IP |
0805 |
X.25 |
0806 |
ARP |
6004 |
LAT |
8035 |
RARP |
8037 |
IPX |
809B |
EtherTalk |
80F3 |
AARP |
814C |
SNMP |
86DD |
IPv6 |
|
|
1.2.2 Les protocoles d'Internet
-
Les protocoles liés à Internet (IPv4)
- Les protocoles liés à Internet (IPv6)
1.2.3 L'adressage IPv4
-
Au moins une adresse par interface.
- Adresses sur 32 bits.
- Notation quadruplet pointé.
- L'adresse est la juxtaposition de :
-
une adresse de réseau ;
- un numéro de machine.
- Deux adresses spéciales :
-
les bits machine à zéro => le réseau ;
- les bits machine à un => la diffusion.
1.2.4 Exemple d'adresse IPv4
-
Adresse de douaisis.escaut.net : 0xC1303924.
- Configuration classique :
-
adresse usuelle : 193.48.57.36 ;
- masque de réseau : 255.255.255.224 ;
- adresse de réseau : 193.48.57.32 ;
- adresse de diffusion : 193.48.57.63.
- Configuration moderne :
-
adresse usuelle : 193.48.57.24 ;
- nombre de bits réseau : 27 ;
- le résumé : 193.48.57.24/27.
- Tout n'est que correspondances :
-
réseau = adresse
&
masque ;
- diffusion = adresse
|
~
masque ;
1.2.5 L'adressage IPv6
-
Des adresses sur 128 bits (16 octets).
- Notation mots hexadécimaux double pointés.
- Plusieurs adresses par interface :
-
une notion d'adresses locales :
- des adresses routées :
Top Level Aggregator |
grands opérateurs internationaux |
Next Level Aggregator |
opérateurs de moindre importance |
Site Level Aggregator |
gestionnaire du site |
- des adresses multicast prédéfinies :
-
un préfixe en fonction du niveau de diffusion :
-
FF02::/16 pour le lien local,
- FF05::/16 pour le site local,
- FF0E::/16 pour l'ensemble d'Internet.
- des groupes de services :
-
0x1 pour les noeuds IPv6,
- 0x2 pour les routeurs IPv6,
- 0x101 pour les serveurs NTP,
- 0x10003 pour les serveurs DHCP, ...
- exemple des routeurs locaux : FF02::2.
1.2.6 Exemple d'adresse IPv6
-
Adresses de douaisis.escaut.net :
-
adresse locale : fe80::210:b5ff:fe86:b6a7/64 ;
- adresse globale : 2001:660:4401:6002:210:b5ff:fe86:b6a7/64.
- Préfixes :
-
pour l'université (65536 réseaux) : 2001:660:4401::0/48 ;
- pour l'école (256 réseaux) : 2001:660:4401:6000::0/56.
1.2.7 Résolution d'adresse (DHCP)
-
Problème des machines amnésiques :
-
stations sans disque (diskless) ;
- terminaux X ;
- imprimantes réseau ;
- micro à accès Internet ...
- Récuperer les informations réseau :
-
l'indispensable adresse IP ;
- Le masque réseau, l'adresse de diffusion ;
- les adresses de la passerelle et du DNS ;
- les paramètres MTU, TTL, ...
- Protocole Reverse ARP (obsolète) ;
- BOOTstrap Protocol et son successeur ...
- ... Dynamic Host Configuration Protocol.
- DHCP décrit par le Request for Comments 1541.
- BOOTP et DHCP utilisent IP !
-
DHCP serveur sur le port UDP 67 ;
- DHCP client sur le port UDP 68.
- Problème de l'oeuf et de la poule :
-
IP inutilisable sans l'adresse IP ;
- DHCP non implantable sans IP.
- Solution préconisée :
-
paquet DHCP diffusé sans adresse source ;
- protocole ARP inutilisable pour la réponse :
-
facilité : utiliser la diffusion ;
- efficacité : court-circuiter ARP.
- Base de données de paramètres réseau :
-
indexée par un identificateur unique ;
- exemple : l'adresse Ethernet.
- Assignation automatique d'adresses réseau :
-
adresse assignée pour une période fixée ;
- assigner toujours la même adresse, si possible.
- Dialogue entre serveurs et client DHCP :
1.2.8 Paquet DHCP
1.2.9 Autoconfiguration IPv6
-
Obtention automatique d'une adresse routée.
- Mise à jour automatique de la table de routage.
- Paquets ICMPv6 mis en oeuvre :
-
sollicitation de routeur :
- annonce du routeur :
- le bit M impose l'autoconfiguration avec états,
- le bit O indique la présence d'informations réseau.
- Options des paquets :
-
la taille des options est donnée en multiple de 64 bits.
- options pour les adresses physiques :
- option d'information sur le préfixe :
- option pour la taille maximale des données :
- le bit L indique la correspondance réseau physique / logique,
- le bit A autorise la fabrication d'adresse globale.
1.3 La communication dans les réseaux locaux
1.3.1 Principe de la résolution d'adresse
-
Communiquer =>
connaître l'adresse physique de la cible.
- Dépendant de la couche matériel.
- Deux principes :
-
résolution statique (table, fonction) ;
- résolution dynamique.
1.3.2 Résolution d'adresse Ethernet en IPv4
-
Résolution dynamique : IP => Ethernet.
- Protocole ARP (Address Resolution Protocol).
- Principe :
-
diffusion de "qui s'appelle xx.yy.zz.yy ?" ;
- réponse directe "moi, aa:bb:cc:dd:ee:ff !".
- Cache des réponses ARP récentes.
- Format du paquet ARP :
- Exemple de dialogue ARP :
1.3.3 Découverte de voisin en IPv6
-
Intégration d'ARP dans le protocole ICMPv6.
- une adresse IPv6 multicast sollicité :
- une adresse Ethernet multicast correspondante :
33:33:FF:ww:xx:yy
- Paquets mis en oeuvre :
-
sollicitation de voisin :
- annonce de voisin :
- le bit R indique que l'émetteur est un routeur,
- le bit S indique une réponse à une sollicitation
- le bit O impose l'écrasement des anciennes valeurs.
- Exemple de découverte de voisins :
1.4 Le routage entre réseaux locaux
1.4.1 Les classes d'adresses IP
-
Les classes d'adresses :
Classe |
Préfixe |
Intervalle |
A |
0 |
1. -- 126. |
B |
10 |
128.0. -- 191.255. |
C |
110 |
192.0.0. -- 223.255.255. |
D |
1110 |
224.0.0. -- 239.255.255. |
LoopBack |
|
127. |
Classe |
Nb réseaux |
Nb hôtes |
A |
126 |
16.777.216 |
B |
16.384 |
65.536 |
C |
2.097.152 |
256 |
D |
-- |
-- |
LoopBack |
1 |
1 |
- Les classes non-routées :
Classe |
Réseaux |
Nb réseaux |
A |
10.0.0.0, 127.0.0.0 |
2 |
B |
172.16.0.0 à 172.31.0.0 |
16 |
C |
192.168.0.0 à 192.168.255.0 |
256 |
1.4.2 Notion de sous-réseaux
-
Les adresses IP s'épuisent.
- Rentabiliser les classes C.
- Découper le numéro de machine :
-
en un numéro de sous-réseau ;
- et en un numéro d'hôte.
- Exemple, la classe des serveurs de Polytech'Lille :
-
une classe C 193.48.57.0 ;
- un masque réseau 255.255.255.224 ;
- soit 8 sous-réseaux de 32 machines :
1.4.3 Principes du routage IP
Communication entre machines non directement connectées
-
Nombre de répéteurs limité.
- Diffusion impossible sur l'Internet.
- Solution : des tables de routage.
1.4.4 Exemple de table de routage
Table de routage de
soleil.uvsq.fr
réseau cible |
routeur |
193.51.24.0 |
193.51.24.1 |
193.51.25.0 |
193.51.24.2 |
193.51.38.0 |
193.51.24.12 |
1.4.5 Exemple de route par défaut
Table de routage de
soleil.uvsq.fr
réseau cible |
routeur |
193.51.24.0 |
193.51.24.1 |
193.51.25.0 |
193.51.24.2 |
193.51.38.0 |
193.51.24.12 |
défaut |
193.51.24.30 |
1.4.6 Principe de la table de routage
-
Liste de paires ( clef, attribut ).
- Cas simple :
-
la clef est un préfixe réseau (numéro et masque),
- l'attribut est l'adresse du routeur,
- algorithme de choix de la route :
-
table de routage à trois champs :
-
numéro de réseau (r) ;
- masque de réseau (m) ;
- adresse du routeur (ar).
- adresse de la destination : a,
- routeur (ar) choisi si ( a & m ) = r,
- généralisation aux sous-réseaux.
- Routage du paquet sur l'adresse destination.
- Sélection des préfixes réseau convenables.
- Les préfixes les plus longs sont retenus.
- Utilisation du premier couple ( préfixe, adresse).
- Raffinement (routage Linux > 2.2) :
-
la clef comporte les éléments suivants :
-
le préfixe réseau,
- le type de service,
- un niveau de priorité.
- l'attribut comporte un type :
-
unicast
- : route normale,
- unreachable
- : ICMP "destination non atteignable",
- blackhole
- : rien,
- prohibit
- : ICMP "communication interdite",
- nat
- : réécriture de l'adresse destination,
- ...
-
1.4.7 Introduction d'une stratégie de routage
-
Stratégie de routage de Linux > 2.2
- Il s'agit d'une liste séquentielle de règles.
- Chaque règle est une paire ( sélecteur, action).
- Le sélecteur s'applique sur plusieurs éléments :
-
l'adresse source du paquet,
- l'adresse destination du paquet,
- interface de provenance du paquet,
- type de service,
- marque du paquet.
- L'action consiste à utiliser une table de routage.
- Il existe des règles de types différents :
-
unicast
- : utiliser la route ad hoc de la table,
- unreachable
- : ICMP "destination non atteignable",
- blackhole
- : rien,
- prohibit
- : ICMP "communication interdite",
- nat
- : réécriture de l'adresse source,
- ...
-
1.4.8 Exemple de routage de sous-réseaux
Table de routage de
soleil.uvsq.fr
réseau cible |
masque réseau |
routeur |
193.51.24.0 |
255.255.255.224 |
193.51.24.1 |
193.51.24.64 |
255.255.255.224 |
193.51.24.30 |
193.51.25.0 |
255.255.255.0 |
193.51.24.2 |
193.51.38.0 |
255.255.255.0 |
193.51.24.12 |
0.0.0.0 |
0.0.0.0 |
193.51.24.30 |
1.4.9 Plan du réseau de l'UVSQ
1.5 Configuration IP (station)
1.5.1 Configuration d'interface sous Unix
-
Lister les interfaces : netstat -i.
- Exemple sur artois :
rex@artois:~$ netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR ...
eth0 1500 0 13081896 0 0 0 ...
eth1 1500 0 9043501 0 0 0 ...
lo 3924 0 261476 0 0 0 ...
... TX-OK TX-ERR TX-DRP TX-OVR Flg
... 10402147 0 0 0 BNRU
... 7328120 0 0 0 BNRU
... 261476 0 0 0 LRU
- Une commande standard : ifconfig.
- Permet de définir :
-
l'adresse IP de l'interface ;
- l'adresse de diffusion ;
- le masque de réseau ;
- la taille maximale de paquet (MTU).
- Exemple d'utilisation de ifconfig :
$ /sbin/ifconfig eth0 193.48.57.37
netmask 255.255.255.224 broadcast 193.48.57.63
- Permet de vérifier la configuration :
rex@artois:~$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:10:B5:02:A5:B7
inet addr:193.48.57.37 Bcast:193.48.57.63 Mask:255.255.255.224
inet6 addr: fe80::210:b5ff:fe02:a5b7/10 Scope:Link
UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
RX packets:13086840 errors:0 dropped:0 overruns:0 frame:0
TX packets:10407691 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:5 Base address:0xe000
1.5.2 Résolution des noms DNS
1.5.3 Mise à jour du routage sous Unix
1.5.4 Configuration réseau sous Windows XP
-
La configuration de base :
- Des commandes en ligne :
- Encore le registre :
1.5.5 Configuration automatique d'interface
-
Méthodes pour obtenir les informations IP :
-
statique, codée dans un fichier ;
- dynamique, utilisation de serveurs réseau (DHCP) ;
- configuration automatique (zeroconf).
- Disparition des scripts utilisant ifconfig et route
- Centralisation des configurations réseau :
- DHCP permet une configuration avancée :
subnet 172.26.16.0 netmask 255.255.240.0 {
option domain-name "students.deule.net studserv.deule.net escaut.net deule.net";
option subnet-mask 255.255.240.0;
option broadcast-address 172.26.31.255;
option classless-routes 10:ac:1a:ac:1a:1f:fe:18: <...> ;
option ms-classless-routes 10:ac:1a:ac:1a:1f:fe:18: <...> ;
option static-routes 172.26.0.0 172.26.31.254, 193.48.57.0 172.26.31.254, <...> ;
option routers gordogato.studserv.deule.net;
pool {
allow members of "STUDENTS";
range 172.26.17.0 172.26.28.255;
}
pool {
option routers router-students.deule.net;
allow members of "STUDENTS.MARTIN";
range 172.26.29.0 172.26.29.50;
}
ddns-domainname "students.private.direct.deule.net";
ddns-rev-domainname "private.reverse.deule.net";
ddns-ptr-domainname "students.deule.net";
}
- Zeroconf, un ensemble de techniques :
-
IPv4All pour l'adresse dans 169.254.1.0 à 169.254.254.255 ;
- IPv4All repose sur une exploration par ARP ;
- mDNS remplace l'interrogation de DNS ;
- mDNS utilise le multicast sur 224.0.0.251 ;
- DNS-SD pour la découverte des services (RR SRV).
1.6 Configuration IP (cisco)
1.6.1 Exemples de configurations matérielles
-
Matériel actuel.
-
Le commutateur/routeur CISCO 6506 de l'école :
-
Carte principale SUP720 :
-
terminologie : Supervisor Engine,
- matrice de commutation de 720 gigabits/s,
- traite jusqu'à 400.000.000 paquets par seconde,
- comprend un processeur RISC R7000 à 600Mhz.
- 512 Mo de mémoire vive.
- 2 Mo de mémoire sauvegardée.
- 64 Mo de mémoire de masse (flash).
- Cartes réseau :
-
26 interfaces Gigabit.
- 4 interfaces 10Gigabit.
- Un commutateur 3560E de l'école :
-
Carte processeur :
-
terminologie : Switching Fabric,
- bande passante de 68 gigabits/s,
- processeur WS-C3560E-48PD (PowerPC405 >400Mhz, 1998).
- 128 Mo de mémoire vive.
- 64 Mo de mémoire sauvegardée.
- Cartes réseau :
-
1 port Ethernet rapide,
- 48 ports Gigabit Ethernet 10/100/1000Mb/s,
- 2 ports 10Gigabit Ethernet.
- Power over Ethernet avec 15.4W sur les 48 ports.
- Un commutateur 2950G de l'école :
-
Carte processeur :
-
terminologie : Switching Fabric,
- bande passante de 13.6 gigabits/s,
- processeur WS-C2950G-48-EI (RC32300, 150 MHz).
- 20 Mo de mémoire vive.
- 8 Mo de mémoire sauvegardée.
- Cartes réseau :
-
2 ports Gigabit Ethernet 1000Mb/s,
- 48 ports Ethernet rapide 10/100Mb/s.
- Les anciens matériels.
-
Le routeur CISCO 7202 de l'école :
-
Carte principale NE-150 :
-
terminologie : Network Processing Engine,
- traite jusqu'à 150.000 paquets par seconde,
- comprend un processeur RISC R4700 à 150Mhz.
- 64 Mo de mémoire vive.
- 4 Mo de mémoire sauvegardée.
- 2 cartes mémoire PCMCIA de 16Mo.
- Cartes réseau :
-
une carte Ethernet rapide 10/100Mb/s,
- une carte ATM fibre optique 155Mb/s.
- Un commutateur 2924 XL de l'école :
-
Carte processeur :
-
terminologie : Switching Fabric,
- traite jusqu'à 3 millions de paquets par seconde,
- comprend un processeur Power PC 403GA (environ 33 Mhz).
- 8 Mo de mémoire vive.
- 4 Mo de mémoire sauvegardée.
- Cartes réseau :
-
une carte GigaBit Ethernet 1Gb/s,
- 24 ports Ethernet rapide 10/100Mb/s.
- Le commutateur 8540MSR de l'école :
-
Carte processeur :
-
bande passante de 40 gigabits/s,
- processeur Risc R5000.
- 256 Mo de mémoire vive.
- 8+16 Mo de mémoire sauvegardée.
- Cartes réseau :
-
1 port ethernet 10Mb/s,
- 6 ports Gigabit Ethernet 1000Mb/s,
- 13 ports ATM à 155Mb/s,
- 48 ports Ethernet rapide 10/100Mb/s.
1.6.2 Principe de configuration
-
Un élément de réseau est un ordinateur spécialisé :
-
un ou plusieurs processeurs,
- de la mémoire vive, des interfaces réseaux,
- un système d'exploitation, un système de fichier,
- pas de port clavier, pas de carte vidéo.
- Système d'exploitation des CISCO : l'IOS (version 12).
- Configuration par port série ou via le réseau.
- Session typique de configuration :
rex@artois:~$ telnet router-servers
User Access Verification
Password:
RG20-7202>enable
Password:
RG20-7202#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
RG20-7202(config)#exit
RG20-7202#write
Building configuration...
[OK]
RG20-7202#reload
Proceed with reload? [confirm]
- Support de nombreux protocoles et mécanismes réseau :
protocole |
description |
apollo |
un (vieux) protocole d'HP |
appletalk |
le protocole des MACs |
atm |
un protocole multimédia d'opérateurs |
frame-relay |
relai de trames |
ip |
protocole Internet |
ipx |
protocole de Novell |
ipv6 |
protocole Internet (version 6) |
lane |
émulation LAN sur ATM |
lat |
protocole de Digital Equipement |
lnm |
LanManager (utilisé par MS-Windows) |
ppp |
protocole Point to Point Protocol |
sna |
protocole réseau d'IBM |
spanning-tree |
protocole utilisé par les commutateurs |
vines |
protocole indépendant |
vlans |
réseaux locaux virtuels |
x25 |
un ancien protocole d'opérateurs |
xns |
protocole de Xerox |
... |
|
1.6.3 Configuration basique de l'IOS
-
Mise en place de mots de passe :
RG20-7202#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
RG20-7202(config)#enable password pasglop
RG20-7202(config)#line vty 0 10
RG20-7202(config-line)#password pasglop
RG20-7202(config-line)#exit
- Instructions pour déverminer :
RG20-7202#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
RG20-7202(config)#logging 193.48.57.34
RG20-7202(config)#logging facility local7
RG20-7202(config)#exit
RG20-7202#terminal monitor
RG20-7202#debug ip icmp
ICMP packet debugging is on
RG20-7202#
- Configuration IP de l'interface propre :
RG20-7202#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
RG20-7202(config)#interface FastEthernet1/0
RG20-7202(config-if)#description Interface coté USTL
RG20-7202(config-if)#ip address 134.206.3.60 255.255.0.0
RG20-7202(config-if)#media-type MII
RG20-7202(config-if)#exit
RG20-7202(config)#ip domain-name deule.net
RG20-7202(config)#ip name-server 193.48.57.34
1.6.4 Configuration de VLAN
1.6.5 Régles de routage
-
Règles simples (numéros 1 à 99) :
RG20-7202#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
RG20-7202(config)#access-list 1 deny 193.48.64.0 0.0.0.255
RG20-7202(config)#access-list 1 permit any
RG20-7202(config)#interface fastEthernet1/0
RG20-7202(config-if)#ip access-group 1 out
RG20-7202(config-if)#exit
- Règles complexes (numéros 99 à 199) :
RG20-7202#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
RG20-7202(config)#access-list 100 deny tcp 193.48.64.39 0.0.0.0 any eq ftp
RG20-7202(config)#access-list 100 permit ip any any
RG20-7202(config)#interface fastEthernet1/0
RG20-7202(config-if)#ip access-group 100 out
RG20-7202(config-if)#exit
1.6.6 Table de routage IP
-
Routages statiques.
- Interfaces directement connectées :
r-uvsq#sh ip route connected
C 193.51.43.0 is directly connected, Ethernet1
193.51.24.0 is subnetted
mask is 255.255.255.224,
2 subnets
C 193.51.24.0 is directly connected, Ethernet0
- Routages explicites :
r-uvsq#sh ip route static
S* 0.0.0.0 (mask is 0.0.0.0) [1/0] via 193.51.43.2
- Exterior Gateway Protocol (EGP).
- Informations entre systèmes autonomes ;
- Définition des pairs EGP :
autonomous-system 2092
router egp 1309
network 193.51.24.0
network 193.51.25.0
...
- Acquisition des routes pour l'exterieur :
r-uvsq#sh ip route egp
E 193.48.241.0 [140/4] via 193.51.43.2, 0:00:29, Ethernet1
E 193.54.247.0 [140/4] via 193.51.43.2, 0:00:29, Ethernet1
E 194.167.101.0 [140/4] via 193.51.43.2, 0:00:29, Ethernet1
E 193.105.168.0 [140/4] via 193.51.43.2, 0:00:29, Ethernet1
...
- Routing Information Protocol (RIP) ;
- Acquisition des routes intérieures :
r-uvsq#sh ip route rip
R 193.51.34.0 [120/1] via 193.51.24.8, 0:00:22, Ethernet0
R 193.51.35.0 [120/1] via 193.51.35.254, 0:00:24, Serial3
R 193.51.32.0 [120/1] via 193.51.24.6, 0:00:16, Ethernet0
R 193.51.33.0 [120/1] via 193.51.24.7, 0:00:03, Ethernet0
R 193.51.38.0 [120/1] via 193.51.24.12, 0:00:16, Ethernet0
R 193.51.39.0 [120/1] via 193.51.39.254, 0:00:08, Serial2
R 193.51.37.0 [120/1] via 193.51.24.10, 0:00:19, Ethernet0
R 193.51.42.0 [120/1] via 193.51.39.254, 0:00:08, Serial2
R 193.51.40.0 [120/2] via 193.51.39.254, 0:00:08, Serial2
R 193.51.41.0 [120/1] via 193.51.24.13, 0:00:23, Ethernet0
R 193.51.26.0 [120/1] via 193.51.24.3, 0:00:12, Ethernet0
R 193.51.27.0 [120/1] via 193.51.27.254, 0:00:08, Serial0
R 193.51.24.64 [120/1] via 193.51.24.94, 0:00:28, Serial1
R 193.51.25.0 [120/1] via 193.51.24.2, 0:00:07, Ethernet0
R 193.51.30.0 [120/1] via 193.51.24.9, 0:00:25, Ethernet0
R 193.51.28.0 [120/2] via 193.51.24.94, 0:00:28, Serial1
R 193.51.29.0 [120/2] via 193.51.24.94, 0:00:28, Serial1
2 Protocoles TCP/IP
2.1 Protocole réseau IPv4
2.1.1 Format des paquets IPv4
-
IP (Internet Protocol).
- Format de la trame :
- Type de service (TOS : Type Of Service) :
-
Définition historique dans la RFC 791.
- Champ contenant deux informations :
-
3 bits pour le type de service ;
- 3 bits pour la priorité du paquet.
- La RFC 1122 ajoute deux bits dans le TOS.
- La RFC 1349 donne leur signification :
-
le bit de poid faible doit être 0 ;
- l'autre devient le bit de "coût faible".
- La RFC 2474 transforme TOS en DSCP :
-
en patoi : Differentiated Services CodePoint ;
- en frenchie : services différenciés.
- Champ contenant deux informations :
-
6 bits pour le DSCP ;
- 2 bits pour éviter les congestions (RFC 3168).
- But : différentiation de flux donc de services.
- Protocoles encapsulés : ICMPv4(1), UDP(17), TCP(6).
2.1.2 Options IPv4
-
Format des options :
- L'option end of option list
-
format :
- rôle : alignement en fin d'options.
- L'option no operation
-
format :
- rôle : alignement en fin d'option.
- L'option loose source routing
-
format :
- rôle : routage lâche imposé.
- L'option strict source routing
-
format :
- rôle : routage strict imposé.
- L'option record route
-
format :
- rôle : enregistrement de route.
- L'option record timestamp
-
format :
- types d'enregistrement :
Code |
Signification |
1 |
uniquement les estampilles de temps |
2 |
insérer les adresses des routeurs |
3 |
uniquement pour les routeurs précisés |
- rôle : enregistrement d'estampilles de temps.
2.1.3 Fragmentation des paquets
-
Taille des paquets IPv4 <= 65535.
- Les réseaux ne sont pas identiques.
- La taille des trames est variable.
- Fragmentation des paquets :
- Découpage à l'identique :
- Puis modification de l'entête :
Paquet |
Lg. totale |
Drap. |
Dép. |
original |
lg-ent+1000 |
000 |
0 |
fragment 1 |
lg-ent+344 |
001 |
0 |
fragment 2 |
lg-ent+328 |
001 |
344 |
fragment 3 |
lg-ent+328 |
000 |
672 |
- Ce procédé tombe en désuétude :
-
perte d'un fragment => perte du paquet,
- charge CPU pour les routeurs et le destinataire,
- bloquage des fragments par des filtres primitifs.
- Attaque "Ping of Death" :
-
forger un fragment dépassant les 64Ko,
- ecrasement mémoire sur le destinataire ...
- ... plantage du système d'exploitation.
- Principe de découverte du MTU sur le chemin :
-
paquets envoyés avec le bit "pas de fragmentation",
- on commence par des paquets de taille maximale,
- sur réception d'ICMP "fragmentation impossible" ...
- ... on diminue la taille des paquets.
2.2 Protocole de contrôle ICMPv4
2.2.1 Format des paquets ICMPv4
-
ICMP (Internet Control Messages Protocol).
- Protocole encapsulé dans IP.
- Véhicule les erreurs réseau.
- Format général :
- Types de message :
Type |
Description |
0 |
Réponse d'écho |
3 |
Destination inaccessible |
4 |
Limitation du débit de la source |
5 |
Modification de route |
8 |
Demande d'écho |
11 |
Datagramme trop vieux |
12 |
Problème de paramètre |
13 |
Demande d'estampille de temps |
14 |
Réponse d'estampille de temps |
17 |
Demande de masque |
18 |
Réponse de masque |
- Codes possibles pour le type 3 :
Code |
Description |
0 |
Réseau inaccessible |
1 |
Machine inaccessible |
2 |
Protocole inaccessible |
3 |
Port inaccessible |
4 |
Fragmentation impossible |
5 |
Route impossible à suivre |
2.2.2 Gestion de congestion
-
Résolution de congestion :
-
diversité des liens sur Internet :
-
un routeur peut être submergé ;
- émission du paquet Source Quench ;
- la source réduit son débit.
2.2.3 Gestion d'erreurs de routage
-
Redirection de paquets :
-
origine : une erreur de routage :
(M1 route pour M2 par R1)
-
le fautif est averti de son erreur ;
- le paquet est ré-orienté.
2.2.4 Utilitaires basés sur ICMP
-
Utilisation d'ICMP dans ping :
-
envoi d'un paquet ICMP de type 8 (Echo Request) ;
- réception d'un paquet ICMP de type 0 (Echo Reply) ;
- (+) calcul d'un délai de propagation ;
- (+) émission de plusieurs Echo Request.
- Utilisation d'ICMP dans traceroute :
-
émission d'un paquet IP avec un TTL=1 ;
- réception d'un paquet ICMP de type 11 ...
- ... émis par la 1ère passerelle du chemin ;
- augmentation du Time To Live jusqu'à ...
- ... obtenir une réponse de la machine visée.
2.3 Protocole réseau IPv6
2.3.1 Format des paquets IPv6
-
Pas de somme de contrôle :
-
évite le recalcul lors d'un routage,
- supports physiques de meilleure qualité.
- Identificateur de flux :
-
repérage de flux par les routeurs,
- identificateur global sur le chemin ou ...
- ... identificateur local aux routeurs.
- Longueur des données : entête IPv6 non incluse.
- Nombre de sauts : identique à la durée de vie IPv4.
- Un type d'entête suivante :
-
chaînage pour éviter la surcharge des routeurs,
- un entête concerne un protocole ou une extension,
- il faut terminer par un protocole.
2.3.2 Format des entêtes IPv6
-
Les entêtes de type extension :
Code |
Nom |
0 |
Proche en proche |
43 |
Routage |
44 |
Fragmentation |
50 |
Authentification |
51 |
Confidentialité |
59 |
Fin des entêtes |
60 |
Destination |
- Les entêtes de type protocole :
Code |
Nom |
6 |
TCP |
17 |
UDP |
41 |
IPv6 |
58 |
ICMPv6 |
2.3.3 Les extensions IPv6
-
Elles remplacent certains champs IPv4 (fragmentation).
- Elles remplacent certaines options IPv4 (routage par la source).
- Des extensions examinées par tous les routeurs (jumbogrammes).
- Des extensions examinées par la destination (mobilité).
- Des extensions pour la sécurité :
-
authentification de l'émetteur :
-
clef secrète partagée par les correspondants,
- calcul d'une somme de contrôle codée par la clef,
- décodage puis vérification de la somme par le destinataire,
- protection optionnelle contre le rejeu.
- confidentialité des données :
-
mode transport : entêtes de niveau 4 cryptées,
- mode tunnel : tout le paquet est crypté.
2.3.4 Les protocoles IPv6
-
Une somme de contrôle obligatoire :
-
prend en compte une pseudo-entête :
-
adresse IPv6 de l'émetteur,
- adresse IPv6 du destinataire,
- longueur des données (sur 32 bits),
- code du protocole de niveau 4.
- prend en compte l'entête du protocole et ses données.
- l'algorithme somme les mots de 16 bits en complément à 1.
- le résultat est le complément à 1 de la somme.
- Une bonne nouvelle : pas de modification d'UDP ou de TCP.
- Un nouveau protocole de contrôle : ICMPv6.
2.4 Protocole de contrôle ICMPv6
2.4.1 Le format de la trame
-
Identique à une trame ICMPv4 :
2.4.2 Les codes utilisés
-
Trois catégories de codes.
- La gestion des erreurs :
-
les différents types :
Type |
Description |
1 |
destination inaccessible |
2 |
paquet trop grand |
3 |
paquet trop vieux |
4 |
erreur de paramétre |
- Codes possibles pour le type "Destination inaccessible" :
Code |
Description |
0 |
Réseau inaccessible |
1 |
Interdiction administrative |
2 |
Pas un voisin |
3 |
Adresse inaccessible |
4 |
Port inaccessible |
- Les codes d'information :
Type |
Description |
128 |
demande d'écho |
129 |
réponse d'écho |
130 |
demande de gestion multicast |
131 |
rapport de gestion multicast |
132 |
réduction d'un groupe multicast |
- Codes pour la découverte des voisins :
Type |
Description |
133 |
sollicitation du routeur |
134 |
annonce du routeur |
135 |
sollicitation d'un voisin |
136 |
annonce d'un voisin |
137 |
redirection |
2.5 Protocole de transport UDP
2.5.1 Adressage UDP
-
IP : communication de machine à machine.
- UDP : plusieurs points d'accès par hôte.
- Notion de ports UDP (sur 16 bits) :
Port |
Nom |
Description |
7 |
echo |
Y a de l'écho |
9 |
discard |
Trou noir |
37 |
time |
Serveur de date |
53 |
domain |
Serveur de noms |
67 |
bootps |
Serveur d'adresses |
69 |
tftp |
Transfert de fichiers |
137 |
netbios-ns |
Serveur de noms NETBIOS |
517 |
talk |
Utilitaire de conversation |
- Une queue de messages par port.
2.5.2 Les caractéristiques d'UDP
UDP c'est IP offert aux utilisateurs :
(+) |
simplicité |
(+) |
rapidité |
(+) |
robustesse |
(-) |
non fiable |
(-) |
messages non ordonnés |
(-) |
programmation complexe |
2.5.3 Format des datagrammes
2.5.4 Exemple de datagramme
2.6 Protocole de transport TCP
2.6.1 Adressage TCP
2.6.2 Les caractéristiques de TCP
TCP est une couche transport orientée connexion :
-
remise des messages assurée ;
- remise dans l'ordre ;
- transferts tamponnés (performances) ;
- flux de données séquentiel ;
- transfert bi-directionnel.
2.6.3 Format des datagrammes
2.6.4 Options TCP
-
L'option no operation
-
format :
- rôle : aligner sur des mots.
- L'option maximum segment
-
format :
- rôle : donne la taille maximum d'un segment TCP en réception.
- L'option window scale
-
format :
- rôle : multiplicateur de la fenêtre de réception
(multiplication par décalage de bits sur la gauche).
- Les options Selective Acknowledgment
-
formats :
- rôle : accuser réception de données hors séquence.
- Les options d'écho (obsolètes)
-
formats :
- rôle : calculer un temps d'aller-retour.
- L'option d'estampille de temps
-
formats :
- rôle : calculer un temps d'aller-retour.
2.6.5 Fiabilité
-
Accusé de réception :
-
Attendre une confirmation de réception :
- Retransmettre après un délai :
- Efficacité due au fenêtrage :
- Une connexion concertée :
- Une déconnexion concertée :
2.6.6 Adaptabilité
-
Fenêtre mobile (la cible décide).
- Calcul d'un temps moyen aller-retour :
t=at+(1-a)t0
- Temporisateurs constamment adaptés :
d=bt
- Prise en compte des erreurs réseau.
2.6.7 Quelques types d'attaques
-
Attaque : prédiction de numéros de séquence :
- Solution : numéros aléatoires.
- Attaque : inondations de paquets SYN.
- Solutions :
-
augmentation de la taille des tampons,
- diminution des temporisations,
- vérification adresse d'entrée / de sortie,
- suppression de la queue de connexions (liste de cookies).
2.6.8 Exemple de datagramme
3 Programmation réseau
3.1 Généralité sur les sockets
3.1.1 Présentation
3.1.2 Caractéristiques des sockets
-
Une interface de programmation générique.
- Une interface semblable à celle des fichiers.
descripteur de fichier <=> descripteur de socket
- Une socket appartient à une famille.
- Il existe plusieurs modes de connexion.
- À chaque famille un adressage.
3.1.3 Les familles de sockets
-
Détermine le protocole réseau :
Famille |
Protocole |
PF_UNIX, PF_LOCAL |
Tubes nommés |
PF_INET |
Protocoles TCP et UDP |
PF_INET6 |
Protocoles IPv6 |
PF_APPLETALK |
Protocole AppleTalk |
PF_IPX |
Protocole Novell |
PF_X25, PF_CCITT |
Protocole X25 |
- Des caractéristiques liées au protocole.
3.1.4 Les modes de connexion
-
Détermine la qualité de connexion.
- Plusieurs modes par famille :
-
Unix
- : SOCK_DGRAM, SOCK_STREAM ;
- IP
- : SOCK_DGRAM, SOCK_STREAM, SOCK_RAW ;
- X25
- : SOCK_SEQPACKET.
- Les modes courants :
-
mode connecté : SOCK_STREAM ;
- mode non connecté : SOCK_DGRAM ;
- accès direct au protocole : SOCK_RAW.
3.1.5 Les adressages
3.1.6 Les adressages
-
Une structure compatible par famille.
- Exemple : Famille PF_UNIX :
Fichier d'inclusion <sys/un.h>
struct sockaddr_un {
uint16_t sun_family;
uint8_t sun_path[UNIX_PATH_MAX];
};
- Exemple : Famille PF_INET :
Fichier d'inclusion <netinet/in.h>
struct in_addr { uint32_t s_addr; };
struct sockaddr_in {
uint16_t sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
uint8_t sin_zero[8];
};
- Exemple : Famille PF_INET6 :
Fichier d'inclusion <netinet/in.h>
struct in6_addr {
union {
uint8_t u6_addr8[16];
uint16_t u6_addr16[8];
uint32_t u6_addr32[4];
} in6_u;
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
};
struct sockaddr_in6 {
uint16_t sin6_family;
uint16_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;};
3.2 Primitives communes
3.2.1 Création d'une socket
-
Réservation des ressources par socket :
#include <sys/types.h>
#include <sys/socket.h>
int socket(int famille,int mode,int protocol);
- Retourne un descripteur de socket.
- Le protocole doit correspondre au mode.
- Exemple : la famille AF_INET :
-
SOCK_STREAM utilise TCP ;
- SOCK_DGRAM utilise UDP ;
- SOCK_RAW utilise ICMP, IPIP, etc.
- Mettre protocol à zéro 0 pour le protocole par défaut.
- Assignation d'une adresse par bind :
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd,struct sockaddr *address,socklen_t length);
- Coercition de l'adressage de la famille.
- Cas particulier de la famille PF_INET :
-
une adresse joker : INADDR_ANY ;
- un port joker : 0.
3.2.2 Contrôle d'une socket
-
Positionnement des options d'une socket par setsockopt :
#include <sys/types.h>
#include <sys/socket.h>
int setsockopt(int sockfd,int level,int option,
char *arguments,int number);
- Niveau level de l'option :
-
soit au niveau socket (SOL_SOCKET) ;
- soit au niveau protocole (SOL_IP,SOL_TCP,SOL_UDP).
- L'option est codée par option :
-
Quelques options au niveau SOL_SOCKET :
-
SO_KEEPALIVE : teste la socket ;
- SO_DONTROUTE : pas de routage ;
- SO_REUSEADDR : réutilisation immédiate ;
- SO_SNDBUF : taille du tampon ;
- SO_RCVBUF : taille du tampon.
- Quelques options au niveau SOL_IP :
-
IP_TOS : type de service ;
- IP_TTL : durée de vie ;
- IP_PMTU_DISCOVER : calcul du MTU minimum.
- Quelques options au niveau SOL_IPV6 :
-
IPV6_NEXTHOP : nombre de sauts ;
- IPV6_V6ONLY : désactive la double pile.
- Une option au niveau SOL_TCP :
-
TCP_NODELAY : pas de tampon en sortie.
3.3 Primitives pour le mode connecté
3.3.1 Schéma de principe
3.3.2 Primitives pour le serveur
-
Définition du tampon des connexions :
- Attente des connexions des clients :
3.3.3 Primitive pour le client
3.3.4 Exemple de serveur
-
La fonction d'initialisation d'un serveur IPv4 :
int initialisationServeur(short int *port,int connexions){
{
int df;
struct sockaddr_in adresse;
socklen_t taille=sizeof adresse;
int statut;
/* Creation d'une socket */
df=socket(PF_INET,SOCK_STREAM,0);
if(df<0){
perror("initialisationServeur.socket");
exit(-1);
}
/* Specification de l'adresse de la socket */
adresse.sin_family=AF_INET;
adresse.sin_addr.s_addr=INADDR_ANY;
adresse.sin_port=htons(*port);
statut=bind(df,(struct sockaddr *)&adresse,sizeof(adresse));
if(statut<0) return -1;
/* On recupere le numero du port utilise */
statut=getsockname(df,(struct sockaddr *)&adresse,&taille);
if(statut<0){
perror("initialisationServeur.getsockname");
exit(-1);
}
*port=ntohs(adresse.sin_port);
/* Taille de la queue d'attente */
statut=listen(df,connexions);
if(statut<0) return -1;
return df;
}
- La fonction d'initialisation d'un serveur IPv6 :
int initialisationServeur(short int *port,int connexions){
int df;
struct sockaddr_in6 adresse;
socklen_t taille=sizeof adresse;
int statut;
/* Creation d'une socket */
df=socket(PF_INET6,SOCK_STREAM,0);
if(df<0){
perror("initialisationServeur.socket");
exit(-1);
}
/* Specification de l'adresse de la socket */
adresse.sin6_family=AF_INET6;
adresse.sin6_addr=in6addr_any;
adresse.sin6_port=htons(*port);
adresse.sin6_flowinfo=0;
adresse.sin6_scope_id=0;
statut=bind(df,(struct sockaddr *)&adresse,taille);
if(statut<0) return -1;
/* Recuperation du numero du port utilise */
statut=getsockname(df,(struct sockaddr *)&adresse,&taille);
if(statut<0){
perror("initialisationServeur.getsockname");
exit(-1);
}
*port=ntohs(adresse.sin6_port);
/* Taille de la queue d'attente */
statut=listen(df,connexions);
if(statut<0) return -1;
return df;
}
- La fonction de gestion des clients :
int boucleServeur(int ecoute,int (*traitement)(int))
{
int dialogue;
while(1){
/* Attente d'une connexion */
if((dialogue=accept(ecoute,NULL,NULL))<0) return -1;
/* Passage de la socket de dialogue a la fonction de traitement */
if(traitement(dialogue)<0){ close(ecoute); return 0;}
}
}
int gestionClient(int sd){
int pid;
int statut;
pid=fork();
if(pid<0){perror("fork"); exit(-1);}
if(pid!=0)
close(sd);
else{
dup2(sd,0); dup2(sd,1); dup2(sd,2);
statut=execl(CHEMIN_PROGRAMME,CHEMIN_PROGRAMME,NULL);
}
return 0;
}
- La fonction principale :
int main(int argc,char *argv[])
{
int s;
/* Lecture des arguments de la commande */
analyseArguments(argc,argv);
/* Initialisation du serveur */
s=initialisationServeur(&port,MAX_CONNEXIONS);
/* Lancement de la boucle d'ecoute */
boucleServeur(s,gestionClient);
}
3.3.5 Exemple de client
-
La fonction de connexion au serveur en IPv4 :
int connexionServeur(char *hote,int port)
{
int df;
struct sockaddr_in adresse;
socklen_t taille=sizeof adresse;
int statut;
/* Creation d'une socket */
df=socket(PF_INET,SOCK_STREAM,0);
if(df<0){
perror("connexionServeur.socket");
exit(-1);
}
/* Connection de la socket a l'hote */
adresse.sin_family=AF_INET;
if(nomVersAdresse(hote,(void *)&adresse)<0) return -1;
adresse.sin_port=htons(port);
if(connect(df,(struct sockaddr *)&adresse,taille)<0) return(-1);
else return df;
}
- La fonction de connexion au serveur en IPv6 :
int connexionServeur(char *hote,int port)
{
int df;
struct sockaddr_in6 adresse;
socklen_t taille=sizeof adresse;
int statut;
/* Creation d'une socket */
df=socket(PF_INET6,SOCK_STREAM,0);
if(df<0){
perror("connexionServeur.socket");
exit(-1);
}
/* Connection de la socket a l'hote */
adresse.sin6_family=AF_INET6;
if(nomVersAdresse(hote,(void *)&adresse)<0) return -1;
adresse.sin6_port=htons(port);
adresse.sin6_flowinfo=0;
adresse.sin6_scope_id=0;
if(connect(df,(struct sockaddr *)&adresse,taille)<0) return(-1);
else return df;
}
- La fonction principale :
int main(int argc,char *argv[])
{
int s;
/* Lecture des arguments de la commande */
analyseArguments(argc,argv);
/* Connection au serveur */
s=connexionServeur(machine,port);
if(s<0){ fprintf(stderr,"Erreur de connexion au serveur\n"); exit(-1); }
/* Boucle de communication avec le serveur */
while(1){
char tampon[MAX_TAMPON];
fd_set ens_lecture;
int taille;
int statut;
FD_ZERO(&ens_lecture); FD_SET(0,&ens_lecture); FD_SET(s,&ens_lecture);
statut=select(s+1,&ens_lecture,NULL,NULL,NULL);
if(statut<0){perror("select"); exit(-1);}
if(FD_ISSET(0,&ens_lecture)){
if((taille=read(0,tampon,MAX_TAMPON))<=0) break;
if(write(s,tampon,taille)!=taille) break;
}
if(FD_ISSET(s,&ens_lecture)){
if((taille=read(s,tampon,MAX_TAMPON))<=0) break;
if(write(1,tampon,taille)!=taille) break;
}
}
}
3.4 Primitives pour le mode non connecté
3.4.1 Schéma de principe
3.4.2 Primitives de communication
-
Envoi d'un message (datagramme) par sendto :
-
le prototype :
#include <sys/types.h>
#include <sys/socket.h>
int sendto(int sockfd,char *message,int size,int flag,
struct sockaddr *address,socklen_t length);
- retourne le nombre d'octets envoyés ;
- le message est contenu dans message ;
- la longueur du message est size ;
- l'adresse cible est dans address ;
- le drapeau flag contrôle les options :
-
MSG_OOB : messages urgents ;
- MSG_DONTROUTE : interdit le routage.
- Réception d'un message par recvfrom :
-
le prototype :
#include <sys/types.h>
#include <sys/socket.h>
int recvfrom(int sockfd,char *message,int size,int flag,
struct sockaddr *address,socklen_t *length);
- retourne le nombre d'octets reçus ;
- le message est stocké dans message ;
- la taille du tampon message est size ;
- l'adresse source est dans *address ;
- le drapeau flag contrôle les options :
- MSG_OOB : messages urgents ;
- MSG_PEEK : le système garde le message.
- MSG_WAITALL : remplit le tampon.
- Des primitives de dialogue plus concises :
-
les prototypes :
#include <sys/types.h>
#include <sys/socket.h>
int send(int sockfd,char *message,int size,int flag);
int recv(int s,char *message,int size,int flag);
- Utilisable en mode SOCK_DGRAM après un connect.
- Utiles en mode SOCK_STREAM pour les messages urgents :
static void sig_urg(int signo){
int n; char c;
if((n=recv(servfd,&c,1,MSG_OOB))<0){
perror("recv error");
exit(-1);
}
...
}
void main(void){
...
signal(SIGURG,sig_urg);
...
}
3.4.3 Exemple de serveur
int main(int argc,char *argv[])
{
int s; /* Descripteur de la SOCKET */
struct sockaddr_in6 adresseServeur; /* Structure adresse du serveur */
socklen_t taille=sizeof addresseServeur;
int statut;
/* Lecture des arguments de la commande */
analyseArguments(argc,argv);
/* Creation de la SOCKET d'ecoute du serveur */
s=socket(PF_INET6,SOCK_DGRAM,0);
if(s<0) {perror("socket"); exit(-1);}
/* Preparation de la structure adresse du serveur */
adresseServeur.sin6_family=AF_INET6;
adresseServeur.sin6_addr=in6addr_any;
adresseServeur.sin6_port=htons(SERVEUR_PORT);
adresseServeur.sin6_flowinfo=0;
adresseServeur.sin6_scope_id=0;
/* Installation du serveur a la bonne adresse */
statut=bind(s,(struct sockaddr *)&adresseServeur,taille);
if(statut<0) {perror("bind"); exit(-1);}
/* Attente de la connexion d'un client puis dialogue avec ce client */
while(1){
struct sockaddr_in6 adresseClient; /* Structure adresse du client */
socklen_t taille=sizeof adresseClient; /* Taille de cette adresse */
char tampon1[MAX_TAMPON];
char tampon2[MAX_TAMPON];
int nboctets;
nboctets=recvfrom(s,tampon1,MAX_TAMPON-1,0,
(struct sockaddr *)&adresseClient,
&taille);
tampon1[nboctets]='\0';
sprintf(tampon2,"%s%s",PREFIXE,tampon1);
sendto(s,tampon2,strlen(tampon2),0,
(struct sockaddr *)&adresseClient,taille);
}
}
3.4.4 Exemple de client
int main(int argc,char *argv[])
{
int s; /* Descripteur de SOCKET */
struct sockaddr_in6 adresse; /* Adresse de la SOCKET du serveur */
int statut; /* Stocke le statut des commandes */
/* Analyse des arguments */
analyseArguments(argc,argv);
/* Creation de la SOCKET du client */
s=socket(PF_INET6,SOCK_DGRAM,0);
if(s<0){perror("socket"); exit(-1);}
/* Preparation de la structure adresse du serveur */
adresse.sin6_family=AF_INET6;
if(nomVersAdresse(machine,(void *)&adresse)<0){
fprintf(stderr,"Impossible de trouver l'adresse IP du serveur !\n");
exit(-1);
}
adresse.sin6_port=htons(port);
adresse.sin6_flowinfo=0;
adresse.sin6_scope_id=0;
/* Dialogue avec le serveur */
{ char tampon[MAX_TAMPON];
int taille;
fgets(tampon,MAX_TAMPON,stdin);
sendto(s,tampon,strlen(tampon),0,(struct sockaddr *)&adresse,sizeof adresse);
taille=recvfrom(s,tampon,MAX_TAMPON,0,NULL,NULL);
fputs(tampon,stdout);
}
/* Fermeture de la SOCKET de dialogue */
close(s);
exit(0);
}
3.5 Fonctions de bibliothèque
3.5.1 Obtention des adresses IP (classique)
-
Trouver une machine à partir du nom par gethostbyname2 :
#include <netdb.h>
struct hostent *gethostbyname2(char *name,int type);
- En pratique le type type est AF_INET ou AF_INET6;
- Tout est dans la structure hostent :
struct hostent {
char *h_name; /* nom officiel */
char **h_aliases; /* liste des surnoms */
int h_addrtype; /* type de l'adressage */
int h_length; /* taille des adresses */
char **h_addr_list; /* liste des adresses */
};
#define h_addr h_addr_list[0]
- Trouver une machine à partir de l'adresse par gethostbyaddr :
#include <netdb.h>
struct hostent *gethostbyaddr(char *address,socklen_t length,int type);
- En pratique le type type est AF_INET ou AF_INET6;
- L'adresse address doit être en binaire ;
- L'adresse peut être obtenue par inet_pton :
#include <arpa/inet.h>
int inet_pton(int type,const char *string,void *address);
3.5.2 Obtention des adresses IP (moderne)
-
Trouver une machine à partir du nom par getaddrinfo :
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int getaddrinfo(char *name,char *service,
struct addrinfo *hints,
struct addrinfo **res);
void freeaddrinfo(struct addrinfo *res);
- Trouver une machine à partir de l'adresse par getnameinfo :
#include <sys/socket.h>
#include <netdb.h>
int getnameinfo(struct sockaddr *address,socklen_t length,
char *name,size_t maxname,char *service,size_t maxservice,
int flags);
-
les chaînes name et service sont allouées par l'appelant ;
- les chaînes name et service peuvent être NULL.
3.5.3 Trouver l'adresse de socket
3.5.4 Numéros de ports
-
Un port de transport est défini par :
-
un numéro (sur 16 bits) ;
- un protocole (UDP ou TCP).
- Fichier de description : /etc/services.
- Les champs d'une ligne de ce fichier :
-
service : nom officiel du service ;
- port/proto : le type de port (UDP ou TCP) ;
- synonymes : surnoms du service.
- Exemple de fichier /etc/services :
smtp 25/tcp mail
time 37/tcp timserver
domain 53/udp nameserver
nntp 119/tcp readnews
printer 515/tcp spooler
talk 517/udp
- Trouver le numéro de port d'un service par getservbyname :
#include <netdb.h>
struct servent *getservbyname(char *name,char *protocol);
- La réponse est une structure servent :
struct servent {
char *s_name; /* nom officiel */
char **s_aliases; /* liste de surnoms */
int s_port; /* numero de port */
char *s_proto; /* protocole */
};
3.5.5 Numéros de protocoles
-
Fichier de définitions : /etc/protocols.
- Les champs d'une ligne de ce fichier :
-
protocole : nom officiel du protocole ;
- numéro : numéro du protocole ;
- synonymes : surnoms du protocole.
- Exemple de fichier /etc/protocols :
ip 0 IP
icmp 1 ICMP
tcp 6 TCP
udp 17 UDP
- Trouver le numéro d'un protocole par getprotobyname :
#include <netdb.h>
struct protoent *getprotobyname(char *name);
- La réponse est une structure protoent :
struct protoent {
char *p_name; /* nom officiel */
char **p_aliases; /* liste des surnoms */
int p_proto; /* numero de protocole */
};
3.5.6 Exemples de résolution
-
Résolution d'adresse de machine (en fonction du nom) :
int nomVersAdresse(char *hote,struct sockaddr_storage *padresse)
{
/* On regarde deja s'il s'agit d'une adresse IP */
struct sockaddr_in *ipv4_sock=(struct sockaddr_in *)padresse;
unsigned char *ipv4=(unsigned char *)&ipv4_sock->sin_addr;
if(padresse->ss_family!=AF_INET6){
int size=inet_pton(AF_INET,hote,ipv4);
if(size>0){
padresse->ss_family=AF_INET;
return 0;
}
}
struct sockaddr_in6 *ipv6_sock=(struct sockaddr_in6 *)padresse;
unsigned char *ipv6=(unsigned char *)&ipv6_sock->sin6_addr;
if(padresse->ss_family!=AF_INET){
int size=inet_pton(AF_INET6,hote,ipv6);
if(size>0){
padresse->ss_family=AF_INET6;
return 0;
}
}
/* Sinon on cherche l'adresse via le DNS */
if(padresse->ss_family!=AF_INET){
struct hostent *h=gethostbyname2(hote,AF_INET6);
if(h!=NULL){
memcpy(ipv6,h->h_addr_list[0],h->h_length);
padresse->ss_family=AF_INET6;
return 0;
}
}
if(padresse->ss_family!=AF_INET6){
struct hostent *h=gethostbyname2(hote,AF_INET);
if(h!=NULL){
memcpy(ipv4,h->h_addr_list[0],h->h_length);
padresse->ss_family=AF_INET;
return 0;
}
}
return -1;
}
- Résolution d'adresse de machine (en fonction du descripteur) :
int socketVersNom(int ds,char *nom)
{
struct sockaddr_storage adresse;
struct sockaddr *padresse=(struct sockaddr *)&adresse;
socklen_t taille=sizeof adresse;
int statut;
struct hostent *machine;
/* Recupere l'adresse de la socket distante */
statut=getpeername(ds,padresse,&taille);
if(statut<0){
perror("socketVersNom.getpeername");
exit(-1);
}
/* Recupere le nom de la machine */
void *ip;
int taille_ip;
int taille_nom;
if(padresse->sa_family==AF_INET){
struct sockaddr_in *ipv4=(struct sockaddr_in *)padresse;
ip=(void *)&ipv4->sin_addr;
taille_ip=sizeof(ipv4->sin_addr);
taille_nom=INET_ADDRSTRLEN;
}
if(padresse->sa_family==AF_INET6){
struct sockaddr_in6 *ipv6=(struct sockaddr_in6 *)padresse;
ip=(void *)&ipv6->sin6_addr;
taille_ip=sizeof(ipv6->sin6_addr);
taille_nom=INET6_ADDRSTRLEN;
}
machine=gethostbyaddr(ip,taille_ip,padresse->sa_family);
if(machine==NULL){
inet_ntop(padresse->sa_family,ip,nom,taille_nom);
return -1;
}
else{
strcpy(nom,machine->h_name);
return 0;
}
}
- Résolution de nom de service :
int cherchePortTCP(char *nom)
{
struct servent *pinfo;
pinfo=getservbyname(nom,"tcp");
return ntohs(pinfo->s_port);
}
3.6 Le super-serveur Unix
3.6.1 Définition d'un démon
3.6.2 Le super-serveur d'Unix
-
Problèmes avec les serveurs :
-
phase d'initialisation identique ;
- appropriation de ressources systèmes.
- Le super-serveur inetd :
3.6.3 Schéma de fonctionnement
-
Mode connecté :
- Mode non connecté :
3.6.4 Exemples de serveurs
-
Serveur TCP utilisant inetd :
int main(int argc,char **argv)
{
char *url; /* Nom du fichier demande */
/* Ouverture de la session SYSLOG */
openlog(NOM_SERVEUR,LOG_PID,LOG_DAEMON);
syslog(LOG_INFO,"Traitement d'une requete");
/* Envoi eventuel du fichier demande */
url=requeteValide(stdin);
if(url!=NULL){
char *type=typeDeFichier(url);
printf("%s\nContent-Type: %s\n\n",REP_SUCCES,type);
envoiFichier(url,stdout);
syslog(LOG_INFO,"Succes, fichier %s envoye",url);
}
else{
printf("%s\n",REP_ERREUR);
syslog(LOG_INFO,"Echec, requete invalide ",url);
}
/* Fermeture de la session SYSLOG */
syslog(LOG_INFO,"Fin du traitement de la requete");
closelog();
exit(0);
}
- Serveur UDP utilisant inetd :
int main(int argc,char **argv)
{
char tampon[MAX_TAMPON]; /* Stocke le message de la sonde */
int longueur; /* Longueur du message */
char reponse[MAX_TAMPON]; /* Stocke la reponse a la sonde */
struct sockaddr_in adresse; /* Adresse de socket de l'emetteur */
int taille=sizeof(adresse); /* Taille de cette adresse */
/* Ouverture de la session SYSLOG */
openlog(NOM_SERVEUR,LOG_PID,LOG_DAEMON);
syslog(LOG_INFO,"Traitement d'un paquet-sonde");
/* On retourne les donnees avec un prefixe */
longueur=recvfrom(0,tampon,MAX_TAMPON-1,0,&adresse,&taille);
tampon[longueur]='\0';
{ char *texte=inet_ntoa(adresse.sin_addr);
syslog(LOG_INFO,"Sonde en provenance de %s",texte); }
sprintf(reponse,"%s%s",ECHO_PREFIXE,tampon);
sendto(0,reponse,strlen(reponse),0,&adresse,taille);
/* Fermeture de la session SYSLOG */
syslog(LOG_INFO,"Fin du traitement");
closelog();
exit(0);
}
A Annexes
A.1 Démonstrations
A.1.1 Construire un réseau local
-
Protocoles de découverte de voisins :
SR30-Cisco-1#show cdp neighbors
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone,
D - Remote, C - CVTA, M - Two-port Mac Relay
Device ID Local Intrfce Holdtme Capability Platform Port ID
SR30-1200-1.deule.net
Gig 0/44 136 T I AIR-AP124 Fas 0
SR22-R3560E.deule.net
Gig 0/2 126 R S I WS-C3560E Gig 0/10
RG20-R6506.deule.net
Ten 0/1 173 R S I WS-C6506- Ten 1/4
SR30-3560E-2.deule.net
Ten 0/2 167 S I WS-C3560E Ten 0/
SR32-HP-1# show lldp info remote-device
LLDP Remote Devices Information
LocalPort | ChassisId PortId PortDescr SysName
--------- + ------------------------- ------ --------- ----------------------
A1 | RG20-R6506.deule.net Ten...
A1 | 00 11 5d f2 54 00 Te3/4 TenGig... RG20-R6506.deule.net
B1 | e4 11 5b 6e e3 80 51 B1 SR32-HP2910-2
- Adresses apprises sur un commutateur :
RG20-Cisco-4# show mac-address-table
Dynamic Address Count: 142
Secure Address (User-defined) Count: 0
Static Address (User-defined) Count: 0
System Self Address Count: 50
Total MAC addresses: 192
Maximum MAC addreses: 8192
Non-static Address Table:
Destination Address Address Type VLAN Destination Port
------------------- ------------ ---- --------------------
0000.9431.1968 Dynamic 8 FastEthernet0/1
0000.b438.80e2 Dynamic 7 FastEthernet0/1
0000.b452.e1cf Dynamic 3 FastEthernet0/1
0000.b45c.95c1 Dynamic 11 FastEthernet0/1
0000.e899.8873 Dynamic 8 FastEthernet0/1
0000.e8ee.d420 Dynamic 8 FastEthernet0/1
0005.0254.9f41 Dynamic 8 FastEthernet0/1
0005.0276.2442 Dynamic 8 FastEthernet0/1
0010.4b5b.8557 Dynamic 3 FastEthernet0/1
0010.4bce.7310 Dynamic 8 FastEthernet0/1
...
SR32-HP-1# show mac-address vlan 4
Status and Counters - Address Table - VLAN 4
MAC Address Located on Port
------------- ---------------
00000c-9ff004 A1
00112f-c66ad0 A1
00115d-f25400 A1
00163e-e04561 A1
...
- Définition des VLANS :
RG20-2# show vlan
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Fa0/6, Fa0/7, Fa0/8, Fa0/20
2 SERVERS active
3 STAFF active Fa0/22, Fa0/23, Fa0/24
4 STUDENTS active Fa0/9, Fa0/10, Fa0/11, Fa0/12,
Fa0/13, Fa0/14, Fa0/15, Fa0/16,
Fa0/17, Fa0/18, Fa0/19, Fa0/21
5 ADMIN active
6 INSECURE active
7 STAFF-PRIV active
...
RG20-2# show running-config
Current configuration:
!
version 11.2
service password-encryption
!
hostname RG20-2924M-2
!
enable password 7 110E091D
!
interface VLAN1
ip address 172.26.224.17 255.255.240.0
no ip route-cache
!
interface FastEthernet0/1
switchport mode trunk
!
interface FastEthernet0/2
switchport mode trunk
!
interface FastEthernet0/3
switchport mode trunk
!
interface FastEthernet0/4
switchport mode trunk
!
interface FastEthernet0/5
switchport mode trunk
!
interface FastEthernet0/9
switchport access vlan 4
!
interface FastEthernet0/10
switchport access vlan 4
!
...
- Spanning tree :
RG20-2# show spanning-tree vlan 4
Spanning tree 4 is executing the IEEE compatible Spanning Tree protocol
Bridge Identifier has priority 32768, address 00d0.58f5.3f83
Configured hello time 2, max age 20, forward delay 15
Current root has priority 32768, address 00d0.588f.9083
Root port is 42, cost of root path is 27
Topology change flag not set, detected flag not set, changes 2565
Times: hold 1, topology change 35, notification 2
hello 2, max age 20, forward delay 15
Timers: hello 0, topology change 0, notification 0
Interface Fa0/1 (port 13) in Spanning tree 4 is FORWARDING
Port path cost 19, Port priority 128
Designated root has priority 32768, address 00d0.588f.9083
Designated bridge has priority 32768, address 00d0.58f5.3f83
Designated port is 13, path cost 27
Timers: message age 0, forward delay 0, hold 0
BPDU: sent 3504307, received 3203
...
- Configuration liées au 802.1x sur un commutateur :
RG20-2950G-13#sh run
...
aaa new-model
aaa authentication dot1x default group radius
dot1x system-auth-control
...
interface FastEthernet0/37
switchport access vlan 4
switchport mode access
dot1x port-control auto
dot1x host-mode multi-host
spanning-tree portfast
!
...
radius-server host 172.26.16.2 auth-port 1812 acct-port 1813
radius-server key petitcurieux
...
- Fichier de contrôle 802.1x sur les clients :
[STATE] Processing CONNECTING state.
[STATE] Sending EAPOL-Start Frame.
[STATE] Processing ACQUIRED state.
Connection established, authenticating...
[STATE] Sending EAPOL-Response-Identification
[STATE] ACQUIRED -> AUTHENTICATING
[STATE] Processing AUTHENTICATING state.
[STATE] Sending EAPOL-Response-Authentication
[CONFIG] Loading certificate /etc/1x/cert/cacert.pem . . .
[CONFIG] Loaded root certificate /etc/1x/cert/cacert.pem
[CONFIG] Loading user Private Key from /etc/1x/cert/hosttp-priv-nopass.pem...
Authenticated!
[STATE] (global) -> AUTHENTICATED
- Fichier de contrôle 802.1x sur le serveur :
eap {
default_eap_type = peap
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
md5 { }
leap { }
gtc { auth_type = PAP }
tls {
private_key_file = ${raddbdir}/certs/radius-priv.pem
certificate_file = ${raddbdir}/certs/radius-cert.pem
CA_file = /etc/ssl/cacert.pem
CA_path = /etc/ssl/newcerts
dh_file = ${raddbdir}/certs/dh
random_file = ${raddbdir}/certs/random
fragment_size = 1024
include_length = yes
}
ttls {
default_eap_type = md5
copy_request_to_tunnel = no
use_tunneled_reply = no
}
peap {
default_eap_type = mschapv2
}
mschapv2 { }
}
A.1.2 Configuration IP de base
-
Configuration d'une interface Ethernet sous Linux :
douaisis# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:10:B5:86:B6:A7
inet addr:193.48.57.36 Bcast:193.48.57.63 Mask:255.255.255.224
inet6 addr: 2001:660:4401:6002:210:b5ff:fe86:b6a7/64 Scope:Global
inet6 addr: fe80::210:b5ff:fe86:b6a7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:65304644 errors:0 dropped:0 overruns:0 frame:0
TX packets:66466136 errors:0 dropped:0 overruns:1 carrier:0
collisions:0 txqueuelen:100
RX bytes:3113046169 (2.8 GiB) TX bytes:2088704981 (1.9 GiB)
Interrupt:11
- Type de messages DHCP (T53) :
1 DHCPDISCOVER
2 DHCPOFFER
3 DHCPREQUEST
4 DHCPDECLINE
5 DHCPACK
6 DHCPNAK
7 DHCPRELEASE
- Analyse d'une session DHCP :
pevele# tcpdump -vvv -s 1024 -e port bootps or port bootpc
gayant05# ifdown eth0 ; sleep 5 ; ifup eth0
pevele# tcpdump ...
15:29:27.437993 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 342:
router-students.priv.eudil.fr.bootps > pevele.eudil.fr.bootps:
(request) hops:1 xid:0x8382b23e G:router-students.priv.eudil.fr
ether 0:10:b5:7:34:a3 vend-rfc1048 T53:1
(ttl 255, id 9180)
15:29:28.438911 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 359:
pevele.eudil.fr.bootps > router-students.priv.eudil.fr.bootps:
(reply) hops:1 xid:0x8382b23e Y:gayant05.priv.eudil.fr
S:pevele.eudil.fr G:router-students.priv.eudil.fr
ether 0:10:b5:7:34:a3 file "gayant05 vend-rfc1048 T53:2
T54:3241163042 T51:93600 T58:46800 T59:81900 SM:255.255.240.0
DG:router-students.priv.eudil.fr NS:pevele.eudil.fr
HN:"gayant05" DN:"priv.eudil.fr" T28:2887393279
(ttl 64, id 28934)
15:29:28.456249 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 590:
router-students.priv.eudil.fr.bootps > pevele.eudil.fr.bootps:
(request) hops:1 xid:0x8382b23e G:router-students.priv.eudil.fr
ether 0:10:b5:7:34:a3 vend-rfc1048 T57:548
T55:1.3.6.15.28.12.7.9.42.48.49 HN:"gayant05" T51:43200 T53:3
T54:3241163042 T50:2887389578
(ttl 255, id 9184)
15:29:28.494105 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 347:
pevele.eudil.fr.bootps > router-students.priv.eudil.fr.bootps:
(reply) hops:1 xid:0x8382b23e Y:gayant05.priv.eudil.fr
S:pevele.eudil.fr G:router-students.priv.eudil.fr
ether 0:10:b5:7:34:a3 file "gayant05 vend-rfc1048 T53:5
T54:3241163042 T51:43200 SM:255.255.240.0
DG:router-students.priv.eudil.fr NS:pevele.eudil.fr
DN:"priv.eudil.fr" T28:2887393279 HN:"gayant05"
(ttl 64, id 28946)
- Avertissement de routeur en IPv6 :
douaisis# tcpdump -vvv -s 1024 -e icmp6
13:17:04.112383 0:d0:58:f3:4b:10 33:33:0:0:0:1 ip6 118:
fe80::2d0:58ff:fef3:4b10 > ip6-allnodes:
icmp6: router advertisement
(chlim=64, pref=medium, router_ltime=1800,
reachable_time=0, retrans_time=0)
(src lladdr: 00:d0:58:f3:4b:10)
(mtu: mtu=1500)
(prefix info: LA valid_ltime=2592000,preferred_ltime=604800,
prefix=net-servers.escaut.net/64)
[class 0xe0] (len 64, hlim 255)
douaisis# host -t any net-servers.escaut.net
net-servers.escaut.net MX 100 douaisis.escaut.net
net-servers.escaut.net A 193.48.57.32
net-servers.escaut.net AAAA 2001:660:4401:6002:0:0:0:0
- Sollicitation de routeur en IPv6 :
douaisis# tcpdump -vvv -s 1024 -e icmp6
artois# ifdown vlan2 ; ifup vlan2
douaisis# tcpdump ...
13:19:55.334322 0:b:db:5c:98:2c 33:33:ff:5c:98:2c ip6 78:
:: > ff02::1:ff5c:982c:
icmp6: neighbor sol:
who has fe80::20b:dbff:fe5c:982c (len 24, hlim 255)
13:19:56.334373 0:b:db:5c:98:2c 33:33:0:0:0:2 ip6 70:
fe80::20b:dbff:fe5c:982c > ip6-allrouters:
icmp6: router solicitation
(src lladdr: 00:0b:db:5c:98:2c) (len 16, hlim 255)
13:19:56.335277 0:d0:58:f3:4b:10 33:33:0:0:0:1 ip6 118:
fe80::2d0:58ff:fef3:4b10 > ip6-allnodes:
icmp6: router advertisement
(chlim=64, pref=medium, router_ltime=1800, reachable_time=0,
retrans_time=0)
(src lladdr: 00:d0:58:f3:4b:10)
(mtu: mtu=1500)
(prefix info: LA valid_ltime=2592000,preferred_ltime=604800,
prefix=net-servers.escaut.net/64)
[class 0xe0] (len 64, hlim 255)
douaisis# grep ip6-allrouters /etc/hosts
ff02::2 ip6-allrouters
- Sollicitation de routeur en IPv6 :
artois# route -A inet6 | grep vlan2
Destination Next Hop Flags Metric Ref Use Iface
2001:660:4401:6002::/64 :: UA 256 2 0 vlan2
fe80::/64 :: UA 256 0 0 vlan2
ff00::/8 :: UA 256 0 0 vlan2
::/0 fe80::2d0:58ff:fef3:4b10 UGDA 1024 9 1 vlan2
A.1.3 La communication dans les réseaux locaux
-
Capture de paquets ARP :
gayant05# tcpdump -vvv -s 1024 -e -x arp &
gayant05# ping phinaert07 > /dev/null
16:18:33.356560 0:10:b5:7:34:a3 Broadcast arp 42:
arp who-has phinaert07.priv.eudil.fr tell gayant05
0001 0800 0604 0001 0010 b507 34a3 ac1a
118a 0000 0000 0000 ac1a 1166
- Liste de la table ARP :
gayant05# arp -a
router-students.priv.eudil.fr (172.26.16.1) at 00:D0:BC:BF:6C:38 [ether] on eth0
hainaut.priv.eudil.fr (172.26.16.2) at 00:60:08:71:B9:BE [ether] on eth0
phinaert07.priv.eudil.fr (172.26.17.102) at 00:10:B5:07:36:86 [ether] on eth0
- Découverte de voisins en IPv6 :
gayant05# cat /proc/net/dev_mcast
2 eth0 1 0 3333ff0734a3
2 eth0 1 0 333300000001
2 eth0 1 0 01005e000001
gayant05# tcpdump -vvv -s 1024 -e -x icmp6 &
gayant05# ping6 phinaert07 > /dev/null
11:22:09.746594 0:10:b5:7:34:a3 33:33:ff:7:36:86 ip6 86:
2001:660:4401:6004:210:b5ff:fe07:34a3 > ff02::1:ff07:3686:
icmp6: neighbor sol:
who has 2001:660:4401:6004:210:b5ff:fe07:3686
(src lladdr: 00:10:b5:07:34:a3) (len 32, hlim 255)
6000 0000 0020 3aff 2001 0660 4401 6004
0210 b5ff fe07 34a3 ff02 0000 0000 0000
0000 0001 ff07 3686 8700 ed30 0000 0000
2001 0660 4401 6004 0210 b5ff fe07 3686
0101 0010 b507 34a3
11:22:09.747305 0:10:b5:7:36:86 0:10:b5:7:34:a3 ip6 86:
2001:660:4401:6004:210:b5ff:fe07:3686
> 2001:660:4401:6004:210:b5ff:fe07:34a3:
icmp6: neighbor adv:
tgt is 2001:660:4401:6004:210:b5ff:fe07:3686(SO)(
tgt lladdr: 00:10:b5:07:36:86) (len 32, hlim 255)
6000 0000 0020 3aff 2001 0660 4401 6004
0210 b5ff fe07 3686 2001 0660 4401 6004
0210 b5ff fe07 34a3 8800 06db 6000 0000
2001 0660 4401 6004 0210 b5ff fe07 3686
0201 0010 b507 3686
A.1.4 Le routage entre réseaux locaux
-
Exemple des classes d'adresses pour l'EUDIL :
pevele# sed 's/^[^:]*:[^:]*:\([^:]*\):.*$/\1/' /register/network/vlans
172.26.224.0/255.255.240.0
193.48.57.32/255.255.255.224
193.48.64.0/255.255.255.0
172.26.16.0/255.255.240.0
193.48.68.0/255.255.255.128
172.26.64.0/255.255.240.0
172.26.32.0/255.255.240.0
172.26.48.0/255.255.240.0
193.48.57.192/255.255.255.224
193.48.65.0/255.255.255.0
193.48.57.224/255.255.255.224
193.48.57.160/255.255.255.224
172.26.80.0/255.255.255.224
- Exemple de la table de routage du routeur IPv4 de l'école :
7202# show ip route connected
172.26.0.0/16 is variably subnetted, 6 subnets, 2 masks
C 172.26.224.0/20 is directly connected, ATM2/0.1
C 172.26.48.0/20 is directly connected, ATM2/0.8
C 172.26.32.0/20 is directly connected, ATM2/0.7
C 172.26.16.0/20 is directly connected, ATM2/0.4
C 172.26.80.0/27 is directly connected, ATM2/0.13
C 172.26.64.0/20 is directly connected, ATM2/0.6
193.48.57.0/27 is subnetted, 4 subnets
C 193.48.57.192 is directly connected, ATM2/0.9
C 193.48.57.224 is directly connected, ATM2/0.11
C 193.48.57.160 is directly connected, ATM2/0.12
C 193.48.57.32 is directly connected, ATM2/0.2
C 193.48.65.0/24 is directly connected, ATM2/0.10
C 193.48.64.0/24 is directly connected, ATM2/0.3
193.48.68.0/25 is subnetted, 1 subnets
C 193.48.68.0 is directly connected, ATM2/0.5
C 192.168.1.0/24 is directly connected, ATM2/0.101
C 192.168.2.0/24 is directly connected, ATM2/0.102
C 134.206.0.0/16 is directly connected, FastEthernet1/0
C 192.168.3.0/24 is directly connected, ATM2/0.103
7202# show ip route rip
R 192.168.166.0/24 [120/1] via 172.26.33.63, 00:00:05, ATM2/0.7
R 195.83.194.0/24 [120/2] via 134.206.3.1, 00:00:04, FastEthernet1/0
R 192.168.91.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
R 193.49.225.0/24 [120/1] via 134.206.3.2, 00:00:08, FastEthernet1/0
[120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
R 192.168.61.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
R 192.168.60.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
R 192.168.247.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
R 192.168.246.0/24 [120/1] via 134.206.3.1, 00:00:04, FastEthernet1/0
...
7202# show ip route static
S* 0.0.0.0/0 [1/0] via 134.206.3.2
- Exemple de la table de routage du routeur IPv6 de l'école :
3640# sh ipv6 route
IPv6 Routing Table - 19 entries
Codes: C - Connected, L - Local, S - Static, R - RIP, B - BGP
U - Per-user Static route
I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
L 2001:660:3000:1104:140::/128 [0/0] via ::, Tunnel0
C 2001:660:3000:1104::/64 [0/0] via ::, Tunnel0
L 2001:660:4401:6002:2D0:58FF:FEF3:4B10/128 [0/0] via ::, FastEthernet3/0.2
C 2001:660:4401:6002::/64 [0/0] via ::, FastEthernet3/0.2
L 2001:660:4401:6003:2D0:58FF:FEF3:4B10/128 [0/0] via ::, FastEthernet3/0.3
C 2001:660:4401:6003::/64 [0/0] via ::, FastEthernet3/0.3
L 2001:660:4401:6004:2D0:58FF:FEF3:4B10/128 [0/0] via ::, FastEthernet3/0.4
C 2001:660:4401:6004::/64 [0/0] via ::, FastEthernet3/0.4
L 2001:660:4401:6007:2D0:58FF:FEF3:4B10/128 [0/0] via ::, FastEthernet3/0.7
C 2001:660:4401:6007::/64 [0/0] via ::, FastEthernet3/0.7
L 2001:660:4401:6009:2D0:58FF:FEF3:4B10/128 [0/0] via ::, FastEthernet3/0.9
C 2001:660:4401:6009::/64 [0/0] via ::, FastEthernet3/0.9
L 2001:660:4401:6011:2D0:58FF:FEF3:4B10/128 [0/0] via ::, FastEthernet3/0.11
C 2001:660:4401:6011::/64 [0/0] via ::, FastEthernet3/0.11
L 2001:660:4401:6012:2D0:58FF:FEF3:4B10/128 [0/0] via ::, FastEthernet3/0.12
C 2001:660:4401:6012::/64 [0/0] via ::, FastEthernet3/0.12
L FE80::/10 [0/0] via ::, Null0
L FF00::/8 [0/0] via ::, Null0
S ::/0 [1/0] via ::, Tunnel0
3640# show running-config interface FastEthernet3/0.2
Building configuration...
Current configuration : 237 bytes
!
interface FastEthernet3/0.2
encapsulation dot1Q 2
ip address 193.48.57.62 255.255.255.224
ipv6 address 2001:660:4401:6002::/64 eui-64
ipv6 enable
ipv6 nd prefix 2001:660:4401:6002::/64
ipv6 rip TO enable
ipv6 rip T0 enable
end
3640# show running-config interface Tunnel0
Building configuration...
Current configuration : 203 bytes
!
interface Tunnel0
no ip address
ipv6 address 2001:660:3000:1104:140::/64
ipv6 enable
ipv6 rip T0 enable
tunnel source FastEthernet3/0.2
tunnel destination 193.51.178.140
tunnel mode ipv6ip
end
- Exemple de la table de routage d'artois :
artois# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
193.48.57.32 0.0.0.0 255.255.255.224 U 0 0 0 vlan2
172.26.16.0 0.0.0.0 255.255.240.0 U 0 0 0 vlan4
0.0.0.0 193.48.57.33 0.0.0.0 UG 0 0 0 vlan2
artois# netstat -r -A inet6
Kernel IPv6 routing table
Destination Next Hop Flags Metric Ref Use Iface
::1/128 :: U 0 118472 4 lo
fe80::20b:dbff:fe5c:982c/128 :: U 0 7196 0 lo
2001:660:4401:6002:20b:dbff:fe5c:982c/128 :: U 0 161399 0 lo
ff00::/8 :: UA 256 0 0 vlan2
fe80::/64 :: UA 256 0 0 vlan2
2001:660:4401:6002::/64 :: UA 256 4168 0 vlan2
::/0 fe80::2d0:58ff:fef3:4b10 UGDA 1024 293 0 vlan2
ff00::/8 :: UA 256 0 0 vlan4
fe80::/64 :: UA 256 0 0 vlan4
2001:660:4401:6004::/64 :: UA 256 14549 0 vlan4
::/0 fe80::2d0:58ff:fef3:4b10 UGDA 1024 4353 0 vlan4
ff00::/8 :: UA 256 0 0 eth0
fe80::/64 :: UA 256 0 0 eth0
- Exemple de la table de routage d'une machine avec vmware :
avalon# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
193.48.64.0 * 255.255.255.0 U 0 0 0 eth0
192.168.230.0 * 255.255.255.0 U 0 0 0 vmnet1
default * 0.0.0.0 U 0 0 0 eth0
A.1.5 Protocoles TCP/IP
-
Montrer l'option IP d'enregistrement de route :
artois# tcpdump -s 1500 -vvv -xe icmp &
artois# ping -R ftp.jussieu.fr
PING nephtys.lip6.fr (195.83.118.1) 56(124) bytes of data.
64 bytes from nephtys.lip6.fr (195.83.118.1): icmp_seq=1 ttl=54 time=13.7 ms
RR: artois.eudil.fr (193.48.57.37)
router-eudil.univ-lille1.fr (193.49.225.60)
193.49.225.1
193.49.253.114
172.21.86.60
172.21.86.33
lille-pos2-0.cssi.renater.fr (193.51.179.146)
nri-b-a0-2-580.cssi.renater.fr (193.51.179.153)
jussieu-a1-0-65.cssi.renater.fr (193.51.182.202)
artois# tcpdump ...
tcpdump: listening on vlan2
09:55:23.648014 0:b:db:5c:98:2c 0:d0:bc:bf:6c:1c ip 138: artois.eudil.fr > nephtys.lip6.fr: icmp: echo request (DF) (ttl 64, id 0, len 124, optlen=40 NOP RR{artois.eudil.fr#0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0})
4f00 007c 0000 4000 4001 da71 c130 3925
c353 7601 0107 2708 c130 3925 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0800 9d70
593d 0001 6b2b 7d3f 24e3 0900 0809 0a0b
0c0d 0e0f 1011 1213 1415 1617 1819 1a1b
1c1d 1e1f 2021 2223 2425 2627 2829 2a2b
2c2d 2e2f 3031 3233 3435 3637
09:55:23.661758 0:d0:bc:bf:6c:1c 0:b:db:5c:98:2c ip 138: nephtys.lip6.fr > artois.eudil.fr: icmp: echo reply (ttl 54, id 44009, len 124, optlen=40 RR{artois.eudil.fr router-eudil.univ-lille1.fr 193.49.225.1 193.49.253.114 172.21.86.60 172.21.86.33 lille-pos2-0.cssi.renater.fr nri-b-a0-2-580.cssi.renater.fr jussieu-a1-0-65.cssi.renater.fr#} EOL)
4f00 007c abe9 0000 3601 b362 c353 7601
c130 3925 0727 28c1 3039 25c1 31e1 3cc1
31e1 01c1 31fd 72ac 1556 3cac 1556 21c1
33b3 92c1 33b3 99c1 33b6 ca00 0000 a570
593d 0001 6b2b 7d3f 24e3 0900 0809 0a0b
0c0d 0e0f 1011 1213 1415 1617 1819 1a1b
1c1d 1e1f 2021 2223 2425 2627 2829 2a2b
2c2d 2e2f 3031 3233 3435 3637
- Montrer les ICMP 8 et 0 de demande et de réponse d'écho :
gayant05# ping gayant06
PING gayant06.priv.eudil.fr (172.26.17.139): 56 data bytes
64 bytes from 172.26.17.139: icmp_seq=0 ttl=255 time=2.0 ms
64 bytes from 172.26.17.139: icmp_seq=1 ttl=255 time=1.3 ms
64 bytes from 172.26.17.139: icmp_seq=2 ttl=255 time=1.5 ms
gayant05# tcpdump -e -x -s 128 icmp
tcpdump: listening on eth0
14:22:05.046558 0:10:b5:7:34:a3 0:10:b5:7:34:9c ip 98:
gayant05 > gayant06.priv.eudil.fr: icmp: echo request
4500 0054 b534 0000 4001 4a2b ac1a 118a
ac1a 118b 0800 49fe cc0e 0000 fd01 083a
f1b3 0000 0809 0a0b 0c0d 0e0f 1011 1213
1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
3435 3637
14:22:05.047075 0:10:b5:7:34:9c 0:10:b5:7:34:a3 ip 98:
gayant06.priv.eudil.fr > gayant05: icmp: echo reply
4500 0054 b138 0000 ff01 8f26 ac1a 118b
ac1a 118a 0000 51fe cc0e 0000 fd01 083a
f1b3 0000 0809 0a0b 0c0d 0e0f 1011 1213
1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
3435 3637
...
- Montrer les ICMP 5 de modification de route :
gayant05# route add -host gayant06 gw router-students
gayant05# ping gayant06
PING gayant06.priv.eudil.fr (172.26.17.139): 56 data bytes
64 bytes from 172.26.17.139: icmp_seq=0 ttl=255 time=1.7 ms
64 bytes from 172.26.17.139: icmp_seq=1 ttl=255 time=2.0 ms
64 bytes from 172.26.17.139: icmp_seq=2 ttl=255 time=1.7 ms
...
gayant05# tcpdump -e -x -s 128 icmp
tcpdump: listening on eth0
14:28:50.976445 0:10:b5:7:34:a3 0:d0:bc:bf:6c:38 ip 98:
gayant05 > gayant06.priv.eudil.fr: icmp: echo request
4500 0054 faa1 0000 4001 04be ac1a 118a
ac1a 118b 0800 44ca 060f 0000 9203 083a
19e6 0e00 0809 0a0b 0c0d 0e0f 1011 1213
1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
3435 3637
14:28:50.977596 0:d0:bc:bf:6c:38 0:10:b5:7:34:a3 ip 70:
router-students.priv.eudil.fr > gayant05: icmp:
redirect gayant06.priv.eudil.fr to net gayant06.priv.eudil.fr
4500 0038 a817 0000 ff01 99ed ac1a 1001
ac1a 118a 0500 ea80 ac1a 118b 4500 0054
faa1 0000 3f01 05be ac1a 118a ac1a 118b
0800 44ca 060f 0000
14:28:50.978087 0:10:b5:7:34:9c 0:10:b5:7:34:a3 ip 98:
gayant06.priv.eudil.fr > gayant05: icmp: echo reply
4500 0054 b18c 0000 ff01 8ed2 ac1a 118b
ac1a 118a 0000 4cca 060f 0000 9203 083a
19e6 0e00 0809 0a0b 0c0d 0e0f 1011 1213
1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
3435 3637
...
- Montrer les paquets ICMP 11 de datagramme trop vieux, les paquets
UDP de TTL croissants et le paquet ICMP 3 (destination inaccessible) :
pevele# traceroute -q 1 ftp.jussieu.fr
traceroute to nephtys.lip6.fr (195.83.118.1), 30 hops max, 38 byte packets
1 router-servers.eudil.fr (193.48.57.33) 2.108 ms
2 cisco1.univ-lille1.fr (134.206.3.2) 3.811 ms
...
11 nephtys.lip6.fr (195.83.118.1) 35.629 ms
pevele# tcpdump -e -x -s 128 \( icmp and dst host pevele \) or \
\( udp and dst host ftp.jussieu.fr \)
14:32:37.503746 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 52:
pevele.eudil.fr.51131 > nephtys.lip6.fr.33435: udp 10 [ttl 1]
4500 0026 c7bc 0000 0111 be63 c130 3922
c353 7601 c7bb 829b 0012 98dc 0101 7504
083a 63af 0700
14:32:37.504901 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 70:
router-servers.eudil.fr > pevele.eudil.fr: icmp:
time exceeded in-transit [tos 0xc0]
45c0 0038 aa3e 0000 ff01 1c22 c130 3921
c130 3922 0b00 11ba 0000 0000 4500 0026
c7bc 0000 0111 be63 c130 3922 c353 7601
c7bb 829b 0012 98dc
14:32:37.507148 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 52:
pevele.eudil.fr.51131 > nephtys.lip6.fr.33436: udp 10
4500 0026 c7bd 0000 0211 bd62 c130 3922
c353 7601 c7bb 829c 0012 0acd 0202 7504
083a f0bc 0700
14:32:37.510803 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 70:
cisco1.univ-lille1.fr > pevele.eudil.fr: icmp:
time exceeded in-transit [tos 0xc0]
45c0 0038 5202 0000 fe01 e5df 86ce 0302
c130 3922 0b00 9fc8 0000 0000 4500 0026
c7bd 0000 0111 be62 c130 3922 c353 7601
c7bb 829c 0012 0acd
...
16:23:02.449608 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 52:
pevele.eudil.fr.52994 > nephtys.lip6.fr.33445: udp 10
4500 0026 cf0d 0000 0b11 ad12 c130 3922
c353 7601 cf02 82a5 0012 eb3a 0b0b 561e
083a 1fdc 0600
16:23:02.483371 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 80:
nephtys.lip6.fr > pevele.eudil.fr: icmp:
nephtys.lip6.fr udp port 33445 unreachable [tos 0xc0]
45c0 0042 a24b 0000 3601 ae08 c353 7601
c130 3922 0303 30c8 0000 0000 4500 0026
cf0d 0000 0111 b712 c130 3922 c353 7601
cf02 82a5 0012 eb3a 0b0b 561e 083a 1fdc
0600
- Description du protocole UDP :
$ cat /etc/services | grep udp
echo 7/udp
discard 9/udp sink null
daytime 13/udp
...
time 37/udp timserver
...
bootps 67/udp
bootpc 68/udp
tftp 69/udp
$ echo | nc -u pevele.eudil.fr 13
Tue Nov 7 14:38:56 2000
$ netstat -A inet -u -a
udp 0 0 *:bootps *:*
udp 0 0 *:domain *:*
udp 0 0 *:ntp *:*
udp 0 0 *:netbios-dgm *:*
udp 0 0 *:netbios-ns *:*
udp 0 0 *:tftp *:*
udp 0 0 *:talk *:*
udp 0 0 *:ntalk *:*
udp 0 0 *:time *:*
udp 0 0 *:daytime *:*
udp 0 0 *:discard *:*
udp 0 0 *:chargen *:*
udp 0 0 *:echo *:*
udp 0 0 *:sunrpc *:*
udp 0 0 *:syslog *:*
...
- Montrer la perte de paquets avec les commandes :
$ nc -u -l -p 4000 | ( sleep 10 ; cat ) > /tmp/fich1
...
$ nc -u localhost 4000 < /vmlinuz
...
$ ls -l /tmp/fich1 /vmlinuz
-rw-r--r-- 1 root root 69581 Nov 7 14:43 /tmp/fich1
-rw-r--r-- 1 root root 716749 Oct 18 17:14 /vmlinuz
- Description du protocole TCP :
$ cat /etc/services | grep tcp
...
ftp-data 20/tcp
ftp 21/tcp
ssh 22/tcp # SSH Remote Login Protocol
telnet 23/tcp
smtp 25/tcp mail
time 37/tcp timserver
...
gopher 70/tcp # Internet Gopher
finger 79/tcp
www 80/tcp http # WorldWideWeb HTTP
...
$ nc pevele 21
220-Welcome, archive user @193.48.64.39 !
220-
220-The local time is: Tue Nov 7 14:51:25 2000
220-
220-This is an experimental FTP server. If have any unusual problems,
220-please report them via e-mail to <root@pevele.eudil.fr>.
220-
220-If you do have problems, please try using a dash (-) as the first
220-character of your password -- this will turn off the continuation
220-messages that may be confusing your ftp client.
220-
220 pevele.eudil.fr FTP server (Version wu-2.6.0(1) Fri Jun 23 08:07:11 CEST 2000) ready.
quit
221 Goodbye.
$ netstat -A inet -t -a -p
...
tcp *:ssh *:* LISTEN -
tcp *:telnet *:* LISTEN -
tcp *:smtp *:* LISTEN -
tcp 193.48.64.39:33785 artois.eudil.fr:3128 ESTABLISHED 502/netscape
tcp 193.48.64.39:33782 artois.eudil.fr:3128 ESTABLISHED 502/netscape
tcp 193.48.64.39:33414 pevele.eudil.fr:ssh ESTABLISHED 2204/ssh
tcp 193.48.64.39:33275 pevele.eudil.fr:ssh ESTABLISHED 1743/ssh
...
- Mode connecté :
$ netstat -A inet -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 94 pevele.eudil.fr:smtp 62.161.186.124:1325 ESTABLISHED
tcp 0 49 pevele.eudil.fr:1384 sofrer-nat.clients:smtp ESTABLISHED
tcp 0 0 pevele.eudil.fr:smtp 62.161.186.124:1317 TIME_WAIT
tcp 0 0 pevele.eudil.fr:smtp kipper02.priv.eudi:4510 TIME_WAIT
tcp 0 58400 pevele.eudil.f:ftp-data ttmdy070188.montro:2582 ESTABLISHEDs
tcp 0 0 pevele.eudil.fr:smtp 62.161.186.124:1311 TIME_WAIT
tcp 0 0 pevele.eudil.fr:pop3 phinaert03.priv.eu:2920 TIME_WAIT
tcp 0 0 pevele.eudil.fr:ssh goto.priv.eudil.fr:866 ESTABLISHED
tcp 0 77 pevele.eudil.fr:ftp ttmdy070188.montro:2566 ESTABLISHED
tcp 0 0 pevele.eudil.fr:smtp 207.94.47.202:3362 FIN_WAIT2
tcp 0 1 pevele.eudil.fr:1031 212.37.207.51:auth LAST_ACK
tcp 0 0 pevele.eudi:netbios-ssn corse.eudil.fr:61739 ESTABLISHED
...
- Montrer la non perte de paquets avec les commandes :
$ nc -l -p 4000 | ( sleep 10 ; cat ) > /tmp/fich1
...
$ nc localhost 4000 < /vmlinuz
...
$ ls -l /tmp/fich1 /vmlinuz
-rw-r--r-- 1 root root 716749 Nov 7 15:28 /tmp/fich1
-rw-r--r-- 1 root root 716749 Oct 18 17:14 /vmlinuz
- Montrer la phase de connexion TCP :
gayant05# nc pevele 21
...
gayant05# tcpdump -e -x -s 128 host pevele and port 21
15:31:57.189984 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 74:
weppes.priv.eudil.fr.2137 > pevele.eudil.fr.ftp:
S 3611621681:3611621681(0) win 32120
<mss 1460,sackOK,timestamp 110933944 0,nop,wscale 0>
(DF) [tos 0x10]
4510 003c 94a3 4000 3f06 f097 ac1a 1004
c130 3922 0859 0015 d744 f931 0000 0000
a002 7d78 7ce4 0000 0204 05b4 0402 080a
069c b7b8 0000 0000 0103 0300
15:31:57.190068 0:60:8:71:b9:82 0:d0:bc:bf:6c:38 ip 74:
pevele.eudil.fr.ftp > weppes.priv.eudil.fr.2137:
S 3640171901:3640171901(0) ack 3611621682 win 32120
<mss 1460,sackOK,timestamp 190083705 110933944,nop,wscale 0>
(DF)
4500 003c 60c3 4000 4006 2388 c130 3922
ac1a 1004 0015 0859 d8f8 9d7d d744 f932
a012 7d78 888f 0000 0204 05b4 0402 080a
0b54 7279 069c b7b8 0103 0300
15:31:57.192459 0:d0:bc:bf:6c:38 0:60:8:71:b9:82 ip 66:
weppes.priv.eudil.fr.2137 > pevele.eudil.fr.ftp:
. ack 1 win 32120 <nop,nop,timestamp 110933945 190083705>
(DF) [tos 0x10]
4510 0034 94a5 4000 3f06 f09d ac1a 1004
c130 3922 0859 0015 d744 f932 d8f8 9d7e
8010 7d78 b753 0000 0101 080a 069c b7b9
0b54 72791
A.1.6 Programmation réseau
-
Montrer les appels systèmes avec :
$ strace nc -l -p 4000
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sin_family=AF_INET, sin_port=htons(4000),
sin_addr=inet_addr("0.0.0.0")}}, 16) = 0
listen(3, 1) = 0
rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_DFL}, 8) = 0
alarm(0) = 0
accept(3,
- Montrer le fonctionnement d'un serveur TCP :
# strace -f /usr/sbin/ftpd -s -p 2121
# strace ftp localhost 2121
- Montrer le fonctionnement d'un serveur UDP :
# strace -f nc -u -l -p 4000
...
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sin_family=AF_INET, sin_port=htons(4000), sin_addr=inet_addr("0.0.0.0")}}, 16) = 0
rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_DFL}, 8) = 0
alarm(0) = 0
recvfrom(3, ...
... {sin_family=AF_INET, sin_port=htons(4000),
sin_addr=inet_addr("127.0.0.1")}}, [16]) = 0
select(16, [0 3], NULL, NULL, NULL) = 1 (in [3])
read(3, "\n", 8192) = 1
write(1, "\n", 1) = 1
...
# strace nc -u localhost 4000
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_DFL}, 8) = 0
alarm(0) = 0
connect(3, {sin_family=AF_INET, sin_port=htons(4000),
sin_addr=inet_addr("127.0.0.1")}}, 16) = 0
rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_IGN}, 8) = 0
alarm(0) = 0
select(16, [0 3], NULL, NULL, NULL) = 1 (in [0])
read(0, "\n", 8192) = 1
write(3, "\n", 1) = 1
...
- Exemple de fichier /etc/inetd.conf.
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
#:INTERNAL: Internal services
#
echo stream tcp nowait root internal
echo dgram udp wait root internal
chargen stream tcp nowait root internal
chargen dgram udp wait root internal
discard stream tcp nowait root internal
discard dgram udp wait root internal
daytime stream tcp nowait root internal
daytime dgram udp wait root internal
time stream tcp nowait root internal
time dgram udp wait root internal
#:STANDARD: These are standard services.
#
telnet stream tcp nowait telnetd.telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/wu-ftpd -l
telnet stream tcp nowait telnetd.telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
#:BSD: Shell, login, exec and talk are BSD protocols.
#
shell stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rshd
login stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rlogind
exec stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rexecd
talk dgram udp wait root.tty /usr/sbin/tcpd /usr/sbin/kotalkd
ntalk dgram udp wait root.tty /usr/sbin/tcpd /usr/sbin/ktalkd
A.2 Programmation en Bourne Shell
A.2.1 Serveur Web en Bourne Shell
#!/bin/sh
#
# Exemple de serveur HTTP en shell
#
#
# Quelques constantes
#
NC=/usr/bin/nc
PORT=8080
TTY_PREFIXE=/dev/tty
PTY_PREFIXE=/dev/pty
TTY_NUMERO=q3
REPERTOIRE=${HOME}/Scripts/Web
#
# Boucle principale
# (ecoute sur le port, traitement de la requete, envoi du fichier)
#
while true ; do
#
# On ecoute sur le cote maitre du terminal virtuel
#
${NC} -l -p ${PORT} 4<>${PTY_PREFIXE}${TTY_NUMERO} >&4 2>&4 <&4 &
PID=$!
#
# On lance un sous-shell sur le cote esclave
#
(
stty -echo igncr
#
# Lecture de la requete HTTP
#
read requete
#
# Lecture des entetes (mises a la poubelle)
#
while read line ; do
if [ -z "${line}" ] ; then break ; fi
done
#
# Analyse de la requete
#
set -- ${requete}
commande=$1 ; file=$2 ; protocole=$3
#
# Reponse a la requete
#
if [ "${commande}" != "GET" -o ! -f "${REPERTOIRE}/${file}" ] ; then
echo "${protocole} 400 erreur"
echo
echo "Erreur !!"
else
echo "${protocole} 200 OK"
echo "Content-type: text/html"
echo
cat "${REPERTOIRE}/${file}"
fi
) 4<>${TTY_PREFIXE}${TTY_NUMERO} >&4 2>&4 <&4
#
# On stoppe l'ecoute
#
kill ${PID}
sleep 2
done
A.2.2 Exemple de page Web
<html>
<head>
<title>Serveur web de demonstration</title>
</head>
Voici deux p't liens :
<dl>
<dt>
<a href="/fichier1">Premier fichier</a>
<dt>
<a href="/fichier2">Second fichier</a>
</dl>
<p align=right>
Serveur Script
</p>
</body>
</html>
A.3 Sources pour RPC
A.3.1 Makefile pour le serveur et le client RPC
#
# Generation d'un client et d'un serveur RPC de demonstration
# (simple addition et soustraction d'entiers).
#
# Quelques constantes liees au projet
CLIENT_OBJS=calc_client.o calc_clnt.o calc_xdr.o
SERVER_OBJS=calc_server.o calc_svc.o calc_xdr.o
# Message pour la marche a suivre
all:
@echo -e "\
Tapez d'abord make generate pour obtenir le fichier d'inclusion .h et\n\
les fichiers C. Modifiez les programmes calc_client.c et calc_server.c\n\
puis lancez la compilation par make compile."
# Generation des fichiers C par rpcgen
generate: calc.x
rpcgen -a -C $^
# Copie des fichiers modifies a la main sur leurs modeles
copy:
cp calc_client_modified.c calc_client.c
cp calc_server_modified.c calc_server.c
# Compilation des programmes C
compile: client server
client: ${CLIENT_OBJS} calc.h
gcc -o client ${CLIENT_OBJS}
server: ${SERVER_OBJS} calc.h
gcc -o server ${SERVER_OBJS}
# Regle de nettoyage
clean:
rm -f client server *.o calc.h calc_svc.c calc_clnt.c calc_xdr.c
rm -f calc_client.c calc_server.c
A.3.2 Définition des RPC
/********************************************************************/
/** Fichier de definition de RPC d'addition et de soustraction **/
/********************************************************************/
/** Quelques constantes **/
#define PROGRAM_NUMBER 19992000
#define VERSION_NUMBER 1
/** Structures des parametres des procedures **/
struct operandes {
int x;
int y;
};
/** Definition des RPC **/
program CALC_PROG {
version CALC_VERSION {
int ADD(operandes) = 1;
int SUB(operandes) = 2;
} = VERSION_NUMBER;
} = PROGRAM_NUMBER;
A.3.3 Fichier C du serveur
/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "calc.h"
int *
add_1_svc(operandes *argp, struct svc_req *rqstp)
{
static int result;
/* AJOUT DE CODE : implantation de l'addition */
result=argp->x+argp->y;
/* FIN D'AJOUT DE CODE */
return(&result);
}
int *
sub_1_svc(operandes *argp, struct svc_req *rqstp)
{
static int result;
/* AJOUT DE CODE : implantation de la soustraction */
result=argp->x-argp->y;
/* FIN D'AJOUT DE CODE */
return(&result);
}
A.3.4 Fichier C du client
/*
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "calc.h"
void
/** MODIFICATION DE CODE : ajout des operandes en parametre **/
calc_prog_1( char* host, int x, int y )
/** FIN DE MODIFICATION DE CODE **/
{
CLIENT *clnt;
int *result_1;
operandes add_1_arg;
int *result_2;
operandes sub_1_arg;
clnt = clnt_create(host, CALC_PROG, CALC_VERSION, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host);
exit(1);
}
/** AJOUT DE CODE : initialisation du parametre de la RPC **/
add_1_arg.x = x ; add_1_arg.y = y ;
/** FIN D'AJOUT DE CODE **/
result_1 = add_1(&add_1_arg, clnt);
if (result_1 == NULL) {
clnt_perror(clnt, "call failed:");
}
/** AJOUT DE CODE : affichage du resultat de la RPC **/
printf("%d + %d = %d\n",add_1_arg.x,add_1_arg.y,*result_1);
/** FIN D'AJOUT DE CODE **/
/** AJOUT DE CODE : initialisation du parametre de la RPC **/
sub_1_arg.x = x ; sub_1_arg.y = y ;
/** FIN D'AJOUT DE CODE **/
result_2 = sub_1(&sub_1_arg, clnt);
if (result_2 == NULL) {
clnt_perror(clnt, "call failed:");
}
/** AJOUT DE CODE : affichage du resultat de la RPC **/
printf("%d - %d = %d\n",sub_1_arg.x,sub_1_arg.y,*result_2);
/** FIN D'AJOUT DE CODE **/
clnt_destroy( clnt );
}
main( int argc, char* argv[] )
{
char *host;
/** AJOUT DE CODE : variables pour les operandes **/
int x,y;
/** FIN D'AJOUT DE CODE **/
/** MODIFICATION DE CODE : nouvelle syntaxe **/
if(argc < 4) {
printf("usage: %s server_host op1 op2\n", argv[0]);
/** FIN DE MODIFICATION DE CODE **/
exit(1);
}
host = argv[1];
/** MODIFICATION DE CODE : recuperation et utilisation des operandes **/
x = atoi(argv[2]);
y = atoi(argv[3]);
calc_prog_1( host, x, y );
/** FIN DE MODIFICATION DE CODE **/
}
This document was translated from LATEX by
HEVEA.