Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
1 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
PLAN
Historique
Support du réseau dans le kernel
Protocoles gérés
Les drivers réseau
La stack réseau
Les primitives kernel pour le réseau
Support d'IPv6
Administration réseau
Références
Liens
2 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Historique
3 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Protocoles gérés
UNIX Unix domain sockets
INET TCP/IP
Linux gère une multitude de protocoles réseau : AX25 Amateur radio
IPX Novell IPX
APPLETALK Appletalk
1. TCP X25 X.25
2. UDP Etc…
OSI 4 : couche transport : 3. Netbios
(define in include/linux/socket.h)
1. IP
OSI 3 : couche réseau : 2. ICMP
3. IGMP
4. ATM
La pile réseau de GNU Linux peut être considéré comme la plus complète et disponible à ce jour.
4 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Protocoles gérés
5 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Support du réseau dans le Kernel
User
Application
Application utilisateur space
Kernel
Protocoles réseaux
space
Couche réseau
Interface de diagnostique des devices
Couche de liaison
Driver réseau
Couche matérielle
Carte réseau
Modèle Internet de la pile réseau. Architecture de la pile réseau.
La pile réseau couvre le protocole TCP/IP D'un point de vue de Linux, la pile est localisée
de la couche liaison (drivers) jusqu'à la dans le noyau avec une API (les sockets BSD)
couche transport (sockets BSD). pouvant être appelée depuis l'espace utilisateur.
6 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
LES DRIVERS RESEAUX
Exemple de drivers réseau
Les buffers de socket (sk_buffer = socket buffer)
7 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les drivers réseaux : introduction
Toutes les cartes peuvent interagir avec le noyau de deux façon différentes :
Polling : Le noyau vérifie le status du device à intervalle régulier de façon à vérifier s'il y a
quelque chose à faire ;
Interruptions : La carte envoie un signal au noyau sous la forme d'une interruption pour lui
indiquer qu'il y a quelque chose à faire.
1. Matériel : elle accepte les paquets entrant en provenance des interfaces réseaux et les
positionne directement en file d'entrée.
10 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Chargement d'un driver
réseau dynamiquement
dans le kernel
11 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les drivers réseaux : enregistrement
Cela est assez représentatif de l'ancienne façon de programmer qui définissait le fonctionnement
d'un module dynamique en fonction de la façon dont il était compilé tel un module statique au sein
De l'image d'un noyau.
13 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les drivers réseaux : exemple d'implémentation (new)
vortex_info_tbl[] _ _devinitdata = {
Dans cette nouvelle version, les directives de {"3c590 Vortex 10Mbps",
pré-processing ne sont plus nécessaires ce ... ... ...
qui enlève tous les #ifdef et #endif. }
Cela le rend plus facile à lire pour les static int _ _init vortex_init (void)
développeurs de drivers via l'utilisation d'un {
ensemble de macros (_ _init, _ _exit, et ...
_ _devinitdata ). }
module_init(vortex_init);
module_exit(vortex_cleanup);
14 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les drivers réseaux : exemple d'implémentation (macros 1/2)
15 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les drivers réseaux : exemple d'implémentation (macros 2/2)
Macro Description
_ _exitcall Anciennement appelée par la routine de sortie du drivers lors de son déchargement.
_exitdata A utiliser par les structures de données marquées par le tag __exitcall.
16 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les buffer sk 1/4
Un paquet issu ou à destination du réseau n’est qu’une suite d’octets, un buffer, à émettre/recevoir.
Il est associé dans le noyau Linux à une structure de contrôle de type sk_buff appelée
sk_buffers (socket buffer). A cette structure est attaché un bloc mémoire contenant le buffer
reçu ou à émettre.
Lorsqu’un paquet doit être émis ou est reçu par la carte réseau, un sk_buff est créé. Cette structure
de contrôle se compose notamment de :
Des pointeurs *head, *data, *tail, et *end servent à la gestion du bloc mémoire associé au
sk_buffer. head et end pointent respectivement sur le début et la fin du bloc mémoire. data
pointe sur un en-tête du paquet en fonction de l’endroit où le paquet se situe dans la pile de
protocoles.
Par exemple un paquet capturé à l’aide d’un hook netfilter aura son pointeur data positionné sur le premier
octet de l’en-tête IP. tail pointe sur le premier octet de bourrage du bloc mémoire (le bloc mémoire pouvant
être plus grand que le paquet à stocker).
17 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les buffers sk 2/4
Description d'un bloc mémoire associé à un sk_buffer, l'un vide et l'autre initialisé avec un bloc mémoire initialisé avec un paquet :
Il est possible de déplacer ces pointeurs pour, par exemple, positionner le pointeur data sur un en-tête
différent. Il faut cependant garder à l’esprit qu’en mode noyau aucun contrôle n’est effectué sur les accès
mémoire et qu’un plantage du noyau peut donc se produire du fait d’une manipulation hasardeuse de
pointeur.
Les fonctions pour manipuler les sk_buffers sont définies dans le fichier header linux/skbuff.h.
18 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les buffers sk 3/4
19 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les buffers sk 4/4
struct sk_buff_head
{
/* These two members must be first. */
Structure
struct sk_buff * next;
de struct sk_buff * prev;
données _ _u32 qlen;
spinlock_t lock;
};
Init.
20 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
LA STACK RESEAU
Architecture
Circulation des paquets
Routage
21 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
L'équipe de Netfilter et son leader actuel
Patrick McHardy :
Team Leader du projet
Netfilter .
22 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Architecture
Les trames émises et reçues peuvent être amenées à traverser l’ensemble des couches
(matérielles et logicielles) :
Emission
Réception
Représentation des trames dans le Kernel Space les paquets sont manipulés par le noyau dans
des structures de type sk_buffer.
Le parcours d’une trame reçue ou à émettre, le traitement dans la pile IP peut être découpé en phases.
23 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Circulation des paquets 1/2
24 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Couche transport
OSI #4
Couche réseau
OSI #3
2: Data
Protocol Layer (TCP / IP)
Link
1: Physical
Interface Layer (Ethernet, etc.) Layer
26 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Estimation du coût (temps et consommation mémoire) des recopies
de paquets dans la pile réseau 2/5
Application
Résumé
des Couche transport (TCP / UDP)
couches
3: ip_output ( ……. )
3: ip_input ( ……... )
Carte réseau
27 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Estimation du coût (temps et consommation mémoire) des recopies
de paquets dans la pile réseau 3/5
send (int socket, const char *buf, int length, int flags)
Userspace
Kernelspace sendto (int socket, const char *data_buffer, int length, int flags, struct sockaddr *destination, int destination _length)
sendit (struct proc *p, int socket, struct msghdr *mp, int flags, int *return_size) uipc_syscalls.c
sosend (struct socket *s, struct mbuf *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags ) uipc_socket.c
tcp_userreq (struct socket *s, int request, struct mbuf *m, struct mbuf * nam, struct mbuf * control ) tcp_userreq.c
28 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Estimation du coût (temps et consommation mémoire) des recopies
de paquets dans la pile réseau 4/5
29 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Algorigramme de la fonction tcp recvmsg
30 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Latence 1/2
L'étude de la latence des couches de la pile réseau TCP/IP sur l'envoi d'un paquet de 1024 octets
en UDP et en TCP toutes les secondes montre les résultats suivant :
Globalement le temps de recopie pour 1024 octets est de 1 µs, l'appel à la primitive système de la socket BSD est
D'environ 2 µs et le temps de checksum en UDP est aussi de 2 µs.
L'utilisation du DMA pour le transfert des données entre le device et la mémoire est un réel atout d'un point de vue des
Performances.
Le temps d'émission par le driver réseau d'un paquet réseau est en dessous des 2 µs mais il monte à environ 4 µs en
réception du fait de la complexité inhérente du driver dans son mode réception. De plus, ce dernier mode possède une
recopie mémoire non négligeable.
UDP:
Le temps d'émission pour 1024 octets en UDP quand le checksum est requis est de 18.9 µs alors qu'en réception cela
Demande 35 µs. La capacité maximum d'envoie en UDP est donc de 433 Mbits/s alors qu'en réception le taux est de
234 Mbits/s.
TCP:
Avec le protocole TCP, l'envoie d'un paquet de 1024 octets met 22.5 µs et 36 µs en réception. La vitesse maximum en
Émission est de 364Mbits/s alors qu'en réception elle est de 228Mbits/s.
Lorsque le destinataire/expéditaire est local (localhost) la capacité maximale est d'environ 150 Mbit/s.
Le temps global nécessaire dans le noyau GNU Linux pour les recopies mémoires, les checksums et les appels systèmes
sont de 22% pour la partie émission en TCP et 16.7% pour la partie réception avec le même protocole. Idem pour UDP.
31 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Emission
Latence 2/2
Réception
32 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Spécificité du protocole ARP
APar
l ‘émission, seuls
définition, les paquets
les hooks deservent
netfilter type ETH_P_ALL
à
peuvent être capturés.
capturer des trames IP. Il n’est ainsi pas
possible de voir les requêtes ARP.
Il est important de noter que, comme pour le chemin
suivi par les
On peut trames dans
cependant le noyau,
les capturer lessortie
à la fonctions
utilisées dans
du driver le carte
de la packet handling
réseau peuvent du
au moment changer
selon
choixladu
version du noyau
traitement utilisé. sur la trame
à appliquer
en fonction du protocole identifié par le champs
Pour récupérer les
skb->protocol detrames ARP,sk_buffer.
la structure il suffit d’enregistrer
une
Pourstructure
cela, à packet_type
chacun de ces dans une des(IPv4,
protocoles listes
ptype
IPv6,(ptype_base
ARP, BOOTP, ou ...)
ptype_all) avecune
est associé la fonction de
callback dev_add_pack()
structurede (définie
type packet_type dans
enregistré dans une
linux/netdevice.h).
file (ptype_all ou la table de hash ptype_base).
Comme pour les netfilter hooks, il faut supprimer ce
hook (packet
La file handling)
ptype_all lorsquepour
est utilisée le module
capturer esttous
retiré
dulesnoyau. Ceci
paquets se fait grâce
provenant (ou àà destination)
la fonction de
dev_remove_pack()
toutes les interfaces (linux/netdevice.h).
réseaux.
En enregistrantest
ptype_base une fonction pour
« hashée » ETH_P_ALL notre
par identifiant
packet type seet
de protocole retrouvera
permet dedans la liste
décider ptype_all.
à quelle
fonction est destiné le paquet (sk_buffer). Position des hooks de type « packet handling » dans la chaîne
OnUnvask_buffer
ainsi récupérer toutes les trames
peut « matcher » une ou arrivant
plusieurs
de traitement des trames reçues ou à émettre.
(ou à destination)
entrées du driver de la carte réseau.
dans la table.
Lorsque l’on récupère un sk_buffer avec ce type de hook, c’est en fait une copie du sk_buffer capturé sur
laquelle
33 onProjet
va travailler. La copie
Open STB / Orange doit
Labs - R&D être détruite
– Présentation ensous
pile réseau finGNU
de Linux
fonction avec la fonction kfree_skb().
interne Groupe France Télécom
Ce type de hook n’est donc pas destiné à modifier le paquet capturé.
Netfilter 1/2
L'intégration de netfilter, le firewall de Linux, se fait au travers de hook [1], de la façon suivante.
Les différents passages de fonctions s'effectuent via l'appel de NF_HOOK, une constante préprocesseur,
avec les paramètres suivants :
•
protocole du HOOK, exemple : PF_INET pour IPv4 ;
•
chaîne, exemple : NF_IP_PRE_ROUTING, NF_IP_LOCAL_IN, etc ;
•
pointeur vers une structure struct sk_buff, qui contient en fait des données relative au paquet ;
•
interface d'entrée ;
•
interface de sortie (peut être NULL) ;
•
la fonction à appeler si le paquet n'est pas supprimé.
[1]
on peut traduire hook par crochet, ou bien encore intercepteur
34 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Netfilter 2/2
35 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Netfilter : étude de cas 1/2
nf_register_hook(&nfho_tunnel_in);
36 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Netfilter : étude de cas 2/2
37 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Routage 1/5 : routage statique vs dynamique
Routage statique vs routage dynamique
Le paramétrage statique d'une interface se fait de différente façon selon les familles de linux.
Sous GNU Debian/Ubuntu il y a le fichier /etc/network/interfaces qui contient le paramétrage
des interfaces réseau alors que sous Redhat/Fedora/suze c'est le fichier /etc/sysconfig/network-
scripts/ifcfg-eth0
Statique (paramétrage manuel) :
$ ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 up
Par convention l'adresse réseau est celle la plus basse : 192.168.1.0. L'adresse de broadcast celle
la plus haute : 192.168.1.255. Pour finir, la gateway est : 192.168.1.1. Au dela de cette
convention, les adresses peuvent être choisis séparément.
Pour un paquet réseau destiné à être émis sur le réseau, le routage statique consiste à utiliser
l'adresse réseau (Ex: 192.168.1.X) pour savoir sur quelle interface envoyer le paquet.
Lorsqu'aucune interface ne possède d'adresse en adéquation avec celle des interfaces, la table
de routage envoie sur celle désigné pour être associée à la route par défault (plus précisément
à la passerelle). Pour spécifier une route manuellement il suffit d'utiliser la commande
suivante :
$ route add default gw 192.168.1.1 eth0
Il ne s'agit pas ici de routage interne ou externe utilisé sur les WAN comme RIP ou OSPF
mais d'un routage local sur un LAN.
http://www.subnetmask.info/ http://www.subnet-calculator.com/
39 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Routage 3/5 : résolution de noms
Fichier /etc/resolv.conf : fichier de résolution des noms d'hôtes (hostname)
Search nom-de_domaine.com : nom du nom de domaine (souvent celui du fournisseur d'accès à
l'Internet).
nameserver IPADDRESS : adresse IP du serveur DNS primaire, secondaire
Cela configure la résolution avec le DNS (Domain Name Server) et les adresses IP. Si la configuration cliente utilise
le protocole DHCP avec une interface réseau il sera possible de récupérer une configuration réseau complète : $
dhclient eth0
Fichier: /etc/nsswitch.conf : fichier de configuration vers le système base de données de noms via le protocole
DNS, NIS, NIS+
Le système résoud premièrement les noms d'hôte par le fichier d'association /etc/hosts, ensuite essaye une
résolution DNS (/etc/resolv.conf) et enfin recherche le serveur NIS/NIS+. Anciennement, il y avait une
recherche dans les fichiers suivants /etc/nsswitch.conf, /etc/svc.conf, /etc/netsvc.conf …. suivant la
distribution.
40 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Routage 4/5 : chemin de recherche
Activation du routage :
echo "1" > /proc/sys/net/ipv4/ip_forward
•
Inhibition du routage :
echo "0" > /proc/sys/net/ipv4/ip_forward
41 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Routage 5/5
Le rôle de la couche IP est de décider comment orienter les paquets vers leur destination finale. Pour rendre cela possible,
chaque interface sur le réseau est associée à un contexte réseau obtenu soit statiquement, soit dynamiquement. Une
adresse IP est constituée de quatre nombres séparés par des points, comme `167.216.245.249'. Chaque nombre étant
compris entre zéro et 255.
http://mirabellug.org/wikini/upload/Documentations_routage.pdf
42 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Filtrage 1/9 : iptables / ip6tables
Sous Linux, les pares-feu, le NAT (traduction d'adresses réseau), les connexions réseau
et l'accounting sont tous fournis par le sous-système Netfilter, aussi connu des
administrateurs sous le nom de la commande iptables.
L'interface d'iptables est l'une des plus sophistiquées que Linux propose. Grâce à elle et
à son large éventail de règles, le filtrage des paquets entrant et sortant du réseau s'effectue
de manière très souple et aussi finement que nécessaire.
Les iptables apportent une réponse élégante aux administrateurs qui se posent des
questions quant à la surveillance du trafic ICMP, la simplification de la gestion des
connexions TCP, le choix du type de trafic à autoriser.
Le filtrage du trafic nécessite, du moins pour les noyaux 2.4, l’emploi du module ip_tables.
La commande lsmod permet de lire la liste des modules chargés par le noyau.
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables
http://www.c-sait.net/cours/iptables.php
http://www.linux-france.org/prj/inetdoc/telechargement/iptables-tutorial.pdf
http://ploug.eu.org/doc/iptables-tutorial.pdf
43 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Filtrage 2/9 : iptables / ip6tables
NetFilter avec IPtables n'a pas du tout la même architecture, le fonctionnement est différent, même si la syntaxe
d'IPtables peut paraître proche de celle d'IPchains.
En particulier, les chaînes INPUT et OUTPUT ne contrôlent pas tout ce qui entre et sort de la passerelle, routage
compris, mais uniquement ce qui entre en direction de la passerelle elle même et sort de la passerelle elle même.
Entendez par là que tout le trafic entre le réseau privé masqué par le NAT et l'Internet ne sera aucunement
influencé par ces deux chaînes. Nous verrons en détail plus loin pourquoi et comment.
En tout état de cause, dans l'explication qui suit, quelles que soient l'origine et la destination
des paquets, ils vont entrer dans la pile de protocoles IP par le même point et en sortir par le
même autre point. Netfilter se présente comme une série de 5 "hooks" (points d'accrochage), sur lesquels
des modules de traitement des paquets vont se greffer. Ces points sont:
•
NF_IP_PRE_ROUTING
•
NF_IP_LOCAL_IN
•
NF_IP_FORWARD
•
NF_IP_POSTROUTING
•
NF_IP_LOCAL_OUT
44 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Filtrage 3/9 : iptables / ip6tables
La branche gauche représente le trajet des paquets qui
entrent et qui sortent vers et depuis un processus local
(SMB, FTP, HTTP etc.)
45 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Filtrage 4/9 : iptables / ip6tables
Ce que sait faire Netfilter :
A travers ces cinq points d'insertion, Netfilter va être capable :
D'effectuer des filtrages de paquets, principalement pour assurer des fonctions de Firewall. On pourra par
exemple interdire à tous les paquets venant de l'Internet et s'adressant au port 80 (HTTP) de passer. Notre
serveur APACHE est un serveur Intranet et ne doit pas être accessible depuis l'extérieur.
D'effectuer des opérations de NAT (Network Address Translation) Ces fonctions sont particulièrement utiles
lorsque l'on veut faire communiquer tout ou partie d'un réseau privé, monté avec des adresses IP privées
(192.168.x.x par exemple) avec l'Internet.
D'effectuer des opérations de marquage des paquets, pour leur appliquer un traitement spécial. Ces
fonctionnalités sont particulièrement intéressantes sur une passerelle de réseau d'entreprise, un peu moins pour
notre cas de réseau domestique.
Netfilter dispose d'une commande à tout faire : IPtables. Cette commande va permettre, entre autres, d'écrire des
chaînes de règles dans des tables. Il y a dans Netfilter trois tables qui correspondent aux trois principales :
46 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Filtrage 5/9 : iptables / ip6tables
La table "Filter"
Cette table va contenir toutes les règles qui permettront de filtrer les paquets. Cette table contient trois chaînes:
– La chaîne INPUT.
Cette chaîne décidera du sort des paquets entrant localement sur l'hôte.
– La chaîne OUTPUT.
Ici, ce ne sont que les paquets émis par l'hôte local qui seront filtrés
– La chaîne FORWARD.
Enfin, les paquets qui traversent l'hôte, suivant les routes implantées, seront filtrés ici.
La table NAT
Cette table permet d'effectuer toutes les translations d'adresses nécessaires.
– La chaîne PREROUTING.
Permet de faire de la translation d'adresse de destination. Cette méthode est intéressante si l'on veut faire croire au monde extérieur, par
exemple, qu'il y a un serveur WEB sur le port 80 de la passerelle, alors que celui-ci est hébergé par un hôte du réseau privé, sur le port 8080.
– La chaîne POSTROUTING.
Elle permet de faire de la translation d'adresse de la source, comme du masquage d'adresse, la méthode classique pour connecter un réseau
privé comme client de l'Internet, avec une seule adresse IP "officielle".
– La chaîne OUTPUT.
Celle-ci va permettre de modifier la destination de paquets générés localement (par la passerelle elle-même).
La table MANGLE
Cette table permet le marquage des paquets entrants (PREROUTING) et générés localement (OUTPUT). Le marquage de paquets va
permettre un traitement spécifique des paquets marqués dans les tables de routage avec IPROUTE 2. Ceci nous mènerait trop loin. Si
vous êtes intéressé par cette question, voyez à ce sujet le document: "Linux 2.4 Advanced Routing HOWTO".
Depuis la version 2.4.18 du noyau, d'autres tables ont été rajoutées sur tous les "hooks". Nous avons ainsi à notre disposition les tables
supplémentaires INPUT, POSTROUTING et FORWARD
47 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Filtrage 6/9 : iptables / ip6tables
Les chaînes
Les chaînes sont des ensembles de règles que nous allons écrire dans chaque table. Ces chaînes vont permettre d'identifier des
paquets qui correspondent à certains critères.
Les cibles
Les cibles enfin sont des sortes d'aiguillage qui dirigeront les paquets satisfaisant aux critères . Les cibles préconstruites sont :
– ACCEPT
Les paquets qui satisfont aux critères sont acceptés, ils continuent leur chemin dans la pile,
– DROP
Les paquets qui satisfont aux critères sont rejetés, on les oublie, on n'envoie même pas de message ICMP . Un trou noir,
quoi.
– LOG
C'est une cible particulière qui permet de tracer au moyen de syslog les paquets qui satisfont aux critères.
Suivant les contextes, d'autres cibles deviennent accessibles, comme REJECT (similaire à DROP, mais avec envoi d'un message
d'erreur ICMP à la source du paquet rejeté), RETURN, REDIRECT, SNAT, DNAT, MASQUERADE...
En français, nous pourrons faire des choses de ce genre :
– Par défaut, tous les paquets qui entrent sont rejetés (DROP)
– Les paquets qui entrent par le port 80 sur l'interface eth0 sont acceptés
– Les paquets qui sortent par le port 80 sur l'interface eth0 sont acceptés
– etc.
IPtables est en quelques sortes l'interface utilisateur de Netfilter. Dans sa partie "visible", ça ressemble à IPchains, mais ici, ce
n'est qu'une interface de commande de Netfilter. La syntaxe est plus complète et plus rigoureuse.
48 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Filtrage 7/9 : iptables / ip6tables
La table de filtrage
C'est la table qui va permettre de filtrer tous les paquets qui entrent et sortent de notre machine. Il n'y a ici aucune modification de
ces paquets, ils seront comparés à des critères définis dans la table Filter. Dans notre cas, il peut se passer deux choses
différentes:
Un paquet qui entre est destiné à un processus de l'hôte (serveur HTTP, FTP...).
Un paquet qui entre est destiné à un autre réseau, c'est alors une fonction de routage.
Un paquet entre dans notre machine. Peu importe par quelle interface il entre,
il peut venir aussi bien du réseau local que de l'Internet. Il passe d'abord par la fonction
de décision de routage. C'est elle qui va déterminer si le paquet est destiné à un
processus local de l'hôte ou à un hôte sur un autre réseau.
Initialisation de Netfilter
Tapez successivement les commandes suivantes pour initialiser votre système: iptables -F iptables -X iptables -t nat -F
iptables -t nat -X De cette manière, vous avez toutes vos chaînes vides, avec par défaut la règle "ACCEPT"
iptables -L L'affichage va vous assurer que les trois chaînes INPUT, FORWARD et OUTPUT sont
vides et ont bien la règle par défaut ACCEPT
iptables -t nat -L L'affichage va vous assurer que les trois chaînes PREROUTING, POSTROUTING et
OUTPUT sont vides et ont bien la règle par défaut ACCEPT.
Mise en place de Masquerade
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE Où ppp0 représente l'interface connectée à l'Internet.
Remplacez éventuellement, si votre configuration est différente. Ceci signifie en gros: Tout ce qui sort du
routage (-A POSTROUTING) et qui doit passer vers l'Internet (-o ppp0) doit subir un masquage d'adresse (-j
MASQUERADE)
echo 1 > /proc/sys/net/ipv4/ip_forward Ceci pour être certain que votre noyau autorise le routage. Vous n'en avez
pas besoin, si votre machine est configurée par défaut pour assurer le routage.
Pour bien montrer que les chaînes INPUT et OUTPUT n'interviennent pas dans le routage, nous allons tout simplement leur
mettre DROP comme règle par défaut (Attention, il faut que vos clients utilisent un DNS situé ailleurs que sur votre
passerelle Linux, sinon, ça ne fonctionnera pas à cause du DNS) :
iptables -P INPUT DROP
iptables -P OUTUT DROP
iptables -L (pour vérifier que INPUT et OUTPUT "droppent" bien tout ce qui passe).
50 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Filtrage 9/9 : iptables / ip6tables
51 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
LES PRIMITIVES KERNEL
POUR LE RESEAU
52 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Primitives réseau du kernel 1/6
Make a copy of a shared buffer : struct sk_buff * skb_unshare (struct sk_buff * skb, int pri);
struct sk_buff * skb_peek (struct sk_buff_head * list_);
Queue a buffer at the list head : void __skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk);
void skb_queue_head (struct sk_buff_head * list, struct sk_buff * newsk);
Queue a buffer at the list tail : void __skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk);
void skb_queue_tail (struct sk_buff_head * list, struct sk_buff * newsk);
Remove from the head of the queue : struct sk_buff * __skb_dequeue (struct sk_buff_head * list);
struct sk_buff * skb_dequeue (struct sk_buff_head * list);
53 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Primitives réseau du kernel 2/6
Insert a buffer : void skb_insert (struct sk_buff * old, struct sk_buff * newsk);
Append a buffer : void skb_append (struct sk_buff * old, struct sk_buff * newsk);
Remove from the tail of the queue : struct sk_buff * __skb_dequeue_tail (struct sk_buff_head * list);
Remove from the head of the queue : struct sk_buff * skb_dequeue_tail (struct sk_buff_head * list);
Add data to a buffer : unsigned char * skb_put (struct sk_buff * skb, unsigned int len);
Add data to the start of a buffer : unsigned char * skb_push (struct sk_buff * skb, unsigned int len);
Remove data from the start of a buffer : unsigned char * skb_pull (struct sk_buff * skb, unsigned int len);
Adjust headroom : void skb_reserve (struct sk_buff * skb, unsigned int len);
Remove end from a buffer : void skb_trim (struct sk_buff * skb, unsigned int len);
54 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Primitives réseau du kernel 3/6
Allocate an skbuff for sending : struct sk_buff * dev_alloc_skb (unsigned int length);
Copy a buffer if need be : struct sk_buff * skb_cow (struct sk_buff * skb, unsigned int headroom);
Private function : void skb_over_panic (struct sk_buff * skb, int sz, void * here);
void skb_under_panic (struct sk_buff * skb, int sz, void * here);
void __kfree_skb (struct sk_buff * skb);
Allocate a network buffer : struct sk_buff * alloc_skb (unsigned int size, int gfp_mask);
Duplicate an sk_buff : struct sk_buff * skb_clone (struct sk_buff * skb, int gfp_mask);
Copy an sk_buff : struct sk_buff * skb_copy (const struct sk_buff * skb, int gfp_mask);
Copy and expand sk_buff : struct sk_buff * skb_copy_expand (const struct sk_buff * skb,
int newheadroom, int newtailroom, int gfp_mask);
Run a filter on a socket : int sk_run_filter (struct sk_buff * skb, struct sock_filter * filter, int flen);
Register ethernet device : struct net_device * init_etherdev (struct net_device * dev, int sizeof_priv );
Find a device by its name : struct net_device * __dev_get_by_name (const char * name);
struct net_device * dev_get_by_name (const char * name);
Allocate a name for a device : int dev_alloc_name (struct net_device * dev, const char * name);
Allocate a network device and name : struct net_device * dev_alloc (const char * name, int * err);
Post buffer to the network code : void netif_rx (struct sk_buff * skb);
void net_call_rx_atomic (void (*fn) (void));
Register a SIOCGIF handler : int register_gifconf (unsigned int family, gifconf_func_t * gifconf);
Set up master/slave pair : int netdev_set_master (struct net_device * slave, struct net_device *master);
Update promiscuity count on a device : void dev_set_promiscuity (struct net_device * dev, int inc);
Update allmulti count on a device : void dev_set_allmulti (struct net_device * dev, int inc);
Network device ioctl : int dev_ioctl (unsigned int cmd, void * arg);
57 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Primitives réseau du kernel 6/6
Remove device from the kernel : int unregister_netdevice (struct net_device * dev);
58 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
LES SOCKETS BSD
59 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les sockets BSD 1/4 : introduction
http://www-adele.imag.fr/users/Didier.Donsez/cours/socketunix.pdf
60 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les sockets BSD 2/4 : les primitives système
61 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les sockets BSD 3/4 : données utiles
Format générique des adresses de sockets :
Domaine d ’adresse :
struct sockaddr { • Internet AF_INET, Unix AF_UNIX
short sa_family; /* domaine AF_UNIX, AF_INET */ • mais aussi AF_OSI, AF_NS, AF_SNA, AF_CCITT,
char sa_data[14]; /* adresse */ AF_APPLETALK,
} ...
Type associé aux adresses dans le domaine Unix :
Type :
#include<sys.un.h> • au niveau bas du protocole (exemple : datagramme IP)
SOCK_RAW
struct sockaddr_un { • en mode non connecté SOCK_DGRAM, SOCK_RDM,
short sun_family; /* domaine AF_UNIX */ SOCK_SEGPACKET
char sun_path[128]; /* chemin */ • en mode connecté SOCK_STREAM
}
Protocole :
Type associé aux adresses dans le domaine Internet : • par défaut à 0, le système choisit le protocole
#include <netinet/in.h> • IPPROTO_UDP pour UDP avec les sockets de type
SOCK_DGRAM,
struct in_addr { u_long s_addr; }; SOCK_RDM, SOCK_SEGPACKET
struct sockaddr_in { • IPPROTO_TCP pour TCP avec une socket de type
short sin_family; /* domaine AF_INET */ SOCK_STREAM
u_short sin_port; /* port de la socket */ • il existe d ’autres protocoles
struct in_addr sin_addr; /* N° IP de la machine format réseau • dans le domaine AF_UNIX, il n ’y a pas de protocole
*/
char sin_zero[8]; /* 8 caractères nuls de bourrage */
};
62 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Les sockets BSD 4/4
64 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Administration réseau
65 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
/PROC
$ ls /proc/sys/net/ipv4/route
http://mirrors.deepspace6.net/Linux+IPv6-HOWTO-fr/proc-net.html http://linuxgazette.net/issue77/lechnyr.html
66 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
SUPPORT D'IPV6
67 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
IPv6 1/3 : rappels
Le protocole IPv4 permet d'utiliser un peu plus de quatre milliards d'adresses différentes pour connecter les
ordinateurs et les autres appareils reliés au réseau. Du temps des débuts d'Internet, quand les ordinateurs étaient
rares, cela paraissait plus que suffisant. Il était pratiquement inimaginable qu'il y aurait un jour suffisamment de
machines sur un unique réseau pour que l'on commence à manquer d'adresses disponibles.
Une grande partie des quatre milliards d'adresses IP théoriquement disponibles ne sont pas utilisables, soit
parce qu'elles sont destinées à des usages particuliers (par exemple, le multicast), soit parce qu'elles
appartiennent déjà à des sous-réseaux importants. En effet, d'immenses plages de 16,8 millions d'adresses, les
réseaux dits de classe A, ont été attribuées aux premières grandes organisations connectées à Internet, qui les ont
conservées jusqu'à aujourd'hui sans parvenir à les épuiser. Les Nord-Américains, et dans une moindre mesure les
Européens, se sont partagé les plus grandes plages d'adresses, relativement peu nombreuses, tandis que les
régions connectées plus tardivement, comme l'Amérique du Sud et surtout l'Asie, sont restées sur la touche.
En conséquence, il y a aujourd'hui, principalement en Asie, une pénurie d'adresses que l'on doit compenser par
des mécanismes comme la Traduction d'adresse et de port réseau (NAPT) et l'attribution dynamique d'adresses,
et en assouplissant le découpage en classes des adresses (CIDR).
Au vu de l'importance et de la croissance d'Internet, cette situation pose de plus en plus de problèmes. Il est de plus
prévisible que la demande d'adresses Internet va augmenter dans les années à venir, même dans les régions du
monde épargnées jusqu'ici, suite à des innovations comme les téléphones mobiles (et bientôt, sans doute, les
automobiles et divers appareils) connectés à Internet.
C'est principalement en raison de cette pénurie, mais également pour résoudre quelques-uns des problèmes révélés
par l'utilisation à vaste échelle d'IPv4, qu'a commencé en 1995 la transition vers IPv6. Parmi les nouveautés
essentielles, on peut citer :
– l'augmentation de 232 (soit environ 10^10) à 2128 (soit environ 10^38) du nombre d'adresses disponibles ;
– des mécanismes de configuration et de renumérotation automatique ;
– IPsec, QoS et le multicast implémentés nativement ;
– la simplification des en-têtes de paquets, qui facilite notamment le routage.
68 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
IPv6 2/3 : rappels
Une adresse IPv6 est longue de 16 octets, soit 128 bits, contre 4 octets (32 bits) pour IPv4. On dispose ainsi d'environ
3,4 × 1038 adresses, soit 340 282 366 920 938 463 463 374 607 431 768 211 456, soit encore, pour reprendre
l'image usuelle, plus de 667 132 000 milliards (6,67 x 10^17) d'adresses par millimètre carré de surface terrestre.
On abandonne la notation décimale pointée employée pour les adresses IPv4 (par exemple 172.31.128.1) au profit
d'une écriture hexadécimale, où les 8 groupes de 16 bits sont séparés par un signe deux-points :
1fff:0000:0a88:85a3:0000:0000:ac1f:8001
Différentes sortes d'adresses IPv6 jouent des rôles particuliers. Ces propriétés sont indiquées par le début de l'adresse,
appelé préfixe.
L'Internet IPv6 est défini comme étant le sous-réseau 2000::/3 (les adresses commençant par un 2 ou un 3). Seules
ces adresses peuvent être routées. Toutes les autres adresses ne peuvent être utilisées que localement sur un même
réseau physique (de niveau 2), ou par un accord privé de routage mutuel. Parmi les adresses de 2000::/3, on
distingue :
– Les adresses 6to4 (2002::/16) permettant d'acheminer le trafic IPv6 via un ou plusieurs réseaux IPv4.
– Les adresses du 6bone (3ffe::/16) pour l'expérimentation des interconnexions de réseaux IPv6. (Le 6bone
n'est plus opérationnel depuis le 6/6/2006)
69 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
IPv6 : 3/3
La souche IPv6 a été intégrée officiellement au noyau depuis les versions 2.2, mais
ces noyaux étaient incomplets et non conformes aux RFC. Les noyaux 2.4 sont plus
corrects, mais eux aussi présentent quelques lacunes. Les noyaux 2.6 sont donc
préférables ; ils intègrent un partie des développements du projet japonais USAGI, en
particulier la sécurité (IPsec). Il faut aussi un noyau compilé avec l'option IPv6 (dans le
noyau ou en module). Ce type de noyau est en général disponible dans toutes les
distributions (au moins comme paquetage optionnel).
Les applications, quand à elles, doivent utiliser une librairie C supportant IPv6. La GNU
Libc 2 intègre correctement le support IPv6 à partir de la version 2.2 de la Glibc. Aussi,
il est important d'utiliser une distribution Linux qui réponde à ces critères.
Test du support d'IPv6 : test -f /proc/net/if_inet6 && echo "Support IPv6 available."
Test si IPv6 est activé : lsmod |grep -w 'ipv6' && echo "IPv6 enabled"
Résumé : http://www.bieringer.de/linux/IPv6/status/IPv6+Linux-status-distributions.html
Guide : http://deepspace6.net/sections/docs.html
IPv6 théorie et pratique : http://livre.point6.net/index.php/Accueil
70 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Lectures de référence
71 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Livres de référence sur TCP-IP
TCP/IP illustré – Volume 1
Editeur : Vuibert
Édition : Nouv. éd (28 septembre 1998)
Langue : Français
ISBN-10: 2711786390
ISBN-13: 978-2711786398
http://www.uic.rsu.ru/doc/inet/tcp_stevens/
72 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Liens 1/2
GNU Linux DDK : http://www.kroah.com/log/2006/05/24/#ddk
Linux Device Drivers, Third Edition - Network Drivers : http://lwn.net/images/pdf/LDD3/ch17.pdf
Ipsysctl tutorial : http://ipsysctl-tutorial.frozentux.net/ipsysctl-tutorial.html
Linux IP Networking : http://www.cs.unh.edu/cnrg/gherrin/linux-net.html
UNIX IP Stack Tuning Guide : http://www.cymru.com/Documents/ip-stack-tuning.html
Performance Analysis of the TCP/IP Stack of Linux Kernel :
http://user.informatik.uni-goettingen.de/~kperf/gaug-ifi-tb-2005-03.pdf
Linux IP Masquerade mini HOWTO :
http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/fr/pdf/IP-Masquerade-HOWTO.pdf
Pont + pare-feu + DSL Mini-HOWTO :
http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/fr/pdf/Bridge+Firewall+DSL.pdf
Mini How-To sur la configuration de l’aliasing IP sous Linux :
http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/fr/pdf/IP-Alias.pdf
Linux Network Administrators Guide : http://tldp.org/LDP/nag2/nag2.pdf
The Linux Networking Overview HOWTO :
http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/pdf/Networking-Overview-HOWTO.pdf
TCP/IP Stack Hardening : http://www.cromwell-intl.com/security/security-stack-hardening.html
Voyage au centre de la pile TCP/IP de Linux : http://asyd.net/docs/kernel/tcpip-stack.html
A Measurement Study of the Linux TCP/IP Stack Performance and
Scalability on SMP systems : http://www.cse.iitb.ac.in/~varsha/allpapers/mypapers/comswarepaper.pdf
Berkeley sockets : http://en.wikipedia.org/wiki/Berkeley_sockets
Linux TCP/IP Stack : http://www.cs.odu.edu/~csi/tcpipstack.ppt
IP & Ethernet Interfaces : http://www.beyondlogic.org/etherip/ip.htm
Implementation of TCP/IP in Linux : http://netweb.usc.edu/~rsinha/docs/tcp-ip.ppt
Conception du sous-système réseau de linux : http://lacl.univ-paris12.fr/cegielski/reseau.html
73 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
Liens 2/2
Serial Line IP Implementation for Linux Kernel TCP/IP Stack : http://www.cse.iitb.ac.in/~bestin/pdfs/slip.pdf
HOWTO du routage avancé et du contrôle de trafic sous Linux :
http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/fr/pdf/lartc.pdf
Linux NAT HOWTO : http://www.linux-france.org/prj/inetdoc/guides/NAT-HOWTO/
Linux Packet Filtering HOWTO : http://www.linux-france.org/prj/inetdoc/guides/packet-filtering-HOWTO/
Linux inetdoc : http://www.linux-france.org/prj/
Linux IPv6 HOWTO : http://cvs.tldp.org/go.to/LDP/LDP/users/Peter-Bieringer/Linux+IPv6-HOWTO.fr.pdf
Nisnet (network emulator) : http://www-x.antd.nist.gov/nistnet/
TCPStackPerformance : http://www.gelato.unsw.edu.au/IA64wiki/TCPStackPerformance
Anatomy of the Linux networking stack :
http://www.ibm.com/developerworks/linux/library/l-linux-networking-stack/
Guide pratique du multicast sur les réseaux TCP/IP :
http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/fr/pdf/Multicast-HOWTO.pdf
Historique de la stack IP :
http://www.linuxfranch-county.org/docs/guideLLLinux/implementation_reseau_5-2.pdf
Fonctions réseau du noyau Linux : http://www.linux-france.org/prj/inetdoc/telechargement/interco.noyau.pdf
Understanding Linux Network Internals :
http://book.chinaunix.net/special/ebook/oreilly/Understanding_Linux_Network_Internals/
Algorithmic Complexity Attacks and the Linux Networking Code :
http://www.enyo.de/fw/security/notes/linux-dst-cache-dos.html
Linux Network Stack Walkthrough :
http://gicl.cs.drexel.edu/people/sevy/network/Linux_network_stack_walkthrough.html
Data Link Layer : http://lion.cs.uiuc.edu/courses/cs498hou_spring05/lectures/lecture8.pdf
skb - Linux network buffers : http://ftp.gnumonks.org/pub/doc/skb-doc.html
74 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom
MERCI DE VOTRE ATTENTION
DES QUESTIONS ?
75 Projet Open STB / Orange Labs - R&D – Présentation pile réseau sous GNU Linux interne Groupe France Télécom