Next: Recherche des ports
Up: Noyau
Previous: Une fois le principe
  Contents
Avant tout, nous avons dû apprendre ce qu'est exactement un entête
d'un paquet. Celui-ci dispose de nombreuses informations qui sont
rangées dans un ordre bien précis. Chaque protocole dispose d'un
type d'entête.
Ici, nous allons nous occuper des entêtes des sept
protocoles suivants: Ethernet, IP, TCP, UDP, ICMP, ARP, IPX.
Dès qu'un paquet arrive de l'internet, nous lisons, tout d'abord,
l'entête Ethernet. Celui-ci nous indique le type de protocole
encapsulé dans Ethernet, notamment ARP ou IP. Aussi, IP
une fois extrait, nous pouvons y trouver encapsuler
l'entête TCP, UDP, ou ICMP
selon le protocole indiqué dans l'entête IP. En effet, notre
Firewall devra agir sur ces deux étapes. C'est à ce point précis
que nous pourrons filtrer les paquets.
C'est-à-dire que nous allons vérifier si le paquet est bien
conforme aux normes (par exemple, le TCP est défini dans la RFC
793). Étant valide, le paquet passera donc à travers le Firewall.
Sinon, le Firewall renverra une liste exhaustive de toutes les
malformations du paquet. Dans ce cas, le paquet sera donc refusé,
puis rejeté.
Connaissant la composition d'un datagramme IP, nous avons
classé toutes les informations dans nos structures. De là, nous
avons créé un sélecteur qui va déterminer le protocole utilisé et
aiguillera vers une analyse TCP, UDP, ou ICMP. Cette analyse sera
la même que celle de l'entête IP, c'est-à-dire de mettre chaque
information dans une structure appropriée. Une fois toutes ces informations
recueillies, nous allons pouvoir passer au filtrage des paquets.
Au niveau de l'entête IP, nous allons vérifier les conditions
suivantes :
- La version de l'IP : celle-ci devra être la version 4
- La longueur du paquet reçu : elle devra être supérieure ou égale à 20
octets (taille habituelle d'un entête IP)
- Le protocole utilisé par la suite, ce qui nous permettra
d'aiguiller l'analyse (si le protocole est inconnu, le paquet est
refusé)
- l'IP de l'expéditeur devra être différente de celle du
destinataire
Structure d'un datagramme IP
Maintenant, au niveau de l'entête TCP, nous allons vérifier la
condition suivante : la position des drapeaux : certaines
combinaisons de positions de drapeaux sont autorisées (exemple :
SYN + ACK). En effet, dans l'entête TCP il existe 6 champs bits de
code qui permettent de spécifier le rôle et le contenu du segment
TCP pour pouvoir interpréter correctement certains champs de
l'entête. La signification de chaque bit quand il est fixé à 1 est
disposé dans l'ordre suivant :
- URG (le pointeur de données urgentes est valide)
- ACK (Le champ d'accusé de réception est valide)
- PSH (Ce segment requiert un push)
- RST (Réinitialiser la connection)
- SYN (Synchroniser les numéros de séquences pour initialiser
une connection)
- FIN (L'émetteur a atteint la fin de son flot de données).
Exemple : 010010 : seule SYN et ACK sont actifs.
port source |
port
destination |
|
numéro de séquence |
numéro
d'accusé de réception |
longueur
d'en-tête |
réservé |
URG |
ACK |
PSH |
RST |
SYN |
FIN |
|
taille de la fenêtre |
|
checksum |
pointeur
d'urgence |
|
Format du segment TCP
Seule les ports sont vérifiés dans l'entête UDP.
port UDP source |
port UDP destination |
longueur |
checksum |
Structure d'un datagramme UDP
Pour l'entête ICMP, on vérifie:
- si on autorise le protocole ICMP ou non
- le broadcast add request (type = 11)
- l'erreur "fragmentation demandée mais Don't fragment
sélectionné" (type,code = 3,4)
- l'attaque "loki" (type = 0 ou 4 et commentaire =
01f0)
Structure d'un datagramme ICMP
Toutes ces conditions vont permettre d'autoriser le passage d'un
paquet. Si le paquet ne vérifie pas toutes ces conditions, le
paquet sera rejeté et nous retournerons toutes les informations que
nous avons recueillis des entêtes, dans une fenêtre. Il s'agit
d'un journal d'erreurs affiché dans un arbre (TreeView).
Le filtre est une fonction qui renverra l'action à effectuer pour
indiquer si le paquet doit être rejeté ou si il doit passer à
travers le Firewall ou même s'arrêter là. Le filtre prend comme argument
un pointeur sur une zone mémoire contenant le paquet à l'état brut.
Auparavant, nous avions fait une fonction qui testera si le port
utilisé par un paquet est autorisé ou non. Elle prendra comme
paramètres le port du paquet et la liste des ports (autorisés ou
non selon le mode sélectionné, la liste étant choisie dans la
configuration) qui seront alors comparés et elle renverra ainsi un booléen.
Aussi, nous avions conçu une fonction qui indiquera à l'aide
d'un booléen si la combinaison des drapeaux de l'entête TCP est
correcte. Pour cela, nous avons étudié toutes les combinaisons
possibles. Cette fonction utilise exclusivement le masquage de
bits, ce qui lui permet une grande efficacité.
Le filtre vérifiera toutes les données d'un entête de paquet
susceptibles d'être erronées ou interdites. Si les données de
l'entête ne vérifient aucune des conditions imposées par le
filtre, la où les erreurs trouvées seront référencées dans un
tableau avec lequel la fonction filtre pourra renvoyer un booléen
pour dire si le paquet passe ou non.
Subsections
Next: Recherche des ports
Up: Noyau
Previous: Une fois le principe
  Contents
root
2002-06-23