• Aucun résultat trouvé

1 Le protocole UDP. TP Réseaux : Interrogation d un serveur DNS

N/A
N/A
Protected

Academic year: 2022

Partager "1 Le protocole UDP. TP Réseaux : Interrogation d un serveur DNS"

Copied!
6
0
0

Texte intégral

(1)

Licence Informatique Gilles Grimaud - J´er´emie Dequidt - Laurent No´e

TP R´eseaux : Interrogation d’un serveur DNS

L’objectif de ce TP est de manipuler le protocole UDP en C et d’interroger un r´esolver DNS (serveur qui traduit les adresses symboliques en adresses IP).

1 Le protocole UDP

On rappelle qu’UDP est un protocole de transport (couche 4 du mod`ele OSI) sans connexion qui fonctionne au dessus du protocole de r´eseau IP (couche 3 du mod`ele OSI). C’est un protocole simple `a mettre en oeuvre, cependant il n’est pas fiable (perte de messages, messages non ordonn´es, . . .). Les messages qu’envoit UDP sont appel´es datagrammes.

Il s’agit ici de cr´eer un message et l’´echanger entre deux machines (ou sur la mˆeme machine) en utilisant le proto- cole UDP. Pour d´efinir une adresse r´eseau en C, on utilise la structuresockaddr_ind´efinie dans<netinet/in.h>

Cette structure est d´efinie comme suit :

struct sockaddr_in {

short sin_family; /* famille d’adresse = AF_INET */

u_short sin_port; /* port UDP ou TCP `a utiliser */

struct in_addr sin_addr; /* 4 octets de l’adresse internet */

char sin_zero[8]; /* doit valoir 0 */

};

Le champsin_addrpeut facilement ˆetre obtenu avec la fonctioninet_addr(const char *);qui `a partir d’une adresse IP stock´ee dans une chaˆıne de caract`eres retourne la structurein_addrcorrespondante.

Pour pouvoir ´echanger des messages avec le protocole UDP, vous avez besoin des fonctions suivantes (consulter les pages dumanpour obtenir les informations sur les diff´erents param`etres) :

/* Cr´eation de la socket */

int socket(int domain, int type, int protocol);

/* Liaison de la socket `a une adresse et un port */

int bind(int socket,

const struct sockaddr *address, socklen_t address_len);

/* Envoi d’un message */

int sendto(int s, const void * msg, size_t len, int flags,

const struct sockaddr * dest_addr, socklen_t dest_addr_len);

/* Reception d’un message */

int recv(int s, void * buf, size_t len, int flags);

int recvfrom(int s, void * buf, size_t len, int flags,

struct sockaddr * from_addr, socklen_t * from_addr_len);

Question 1:Ecrire deux programmes en C qui emmettent/rec¸oivent un datagramme UDP, en suivant les mˆemes principes que lors du TP UDP - Q1 du cours de RSX1.

(2)

2 DNS : Domain Name Server

2.1 Introduction

DNS est un syst`eme hi´erarchique distribu´e permettant de traduire des adresses symboliques en adresses IP. Les informations sont stock´ees sur des serveurs organis´es en domaines hi´erarchiques. Ainsi, un serveur peut d´eleguer une partie des noms du domaine `a un serveur subalterne.

On dit d’un serveur de noms responsable de la mise `a jour des correspondances nom / adresse IP des machines de son domaine qu’il est serveur d’autorit´e pour le domaine (Authorative Serveur).

Pour contacter un serveur DNS, les messages doivent ˆetre envoy´es, avec le protocole UDP en g´en´eral, sur le port 53.

2.2 Les messages du protocole DNS

Les messages (requˆete ou r´eponse) du protocole DNS sont definis dans le RFC1035 disponible `a cette adresse https://www.ietf.org/rfc/rfc1035.txt.

La structure d’un message est la suivante (RFC1035 partie 4.1) :

En-tˆete sp´ecifie le type du message (taille fixe : 12 octets) Question question pos´ee au serveur de nom

R´eponse(s) r´eponse(s) `a la requˆete

Autorit´e(s) information(s) sur les serveurs d’autorit´e Additionnel(s) information(s) compl´ementaire(s)

2.2.1 Champs d’en-tˆete d’un datagramme UDP pour une r´esolution DNS

Chacun des 6 champs del’En-tˆeted’un message DNS (RFC1035 partie 4.1.1) est cod´e sur 16 bits. Il y aura donc toujours 12 octets d’entˆete en d´ebut de message DNS.

Identifiant Param`etres QDcount ANcount NScount ARcount

— identifiantest un entier permettant d’identifier la requˆete.

— param`etrescontient les champs suivants :

— QR (1 bit) : indique si le message est une question (0) ou une r´eponse (1).

— OPCODE (4 bits) : type de la requˆete (0000 pour une requˆete simple).

— AA (1 bit) : le serveur qui a fourni la r´eponse a-t’il autorit´e sur le domaine ?

— TC (1 bit) : indique si le message est tronqu´e.

— RD (1 bit) : demande d’une requˆete r´ecursive.

— RA (1 bit) : indique que le serveur peut faire une demande r´ecursive.

— UNUSED, AD, CD (1 bit chacun) : non utilis´es.

— RCODE (4 bits) : code de retour. 0 : OK, 1 : erreur sur le format de la requˆete, 2 : probl`eme du serveur, 3 : nom de domaine non trouv´e (valide seulement si AA), 4 : requˆete non support´ee, 5 : le serveur refuse de r´epondre (raisons de s´ecurit´e ou autres).

— QDCount: nombre d’entr´ees dans la sectionQuestion(valeur00 01).

— ANCount,NSCount,ARCount: nombre d’entr´ees dans les sectionsR´eponse(s),Autorit´e(s),Additionnel(s).

(3)

2.2.2 Champ de requˆete DNS dans un datagramme UDP

La sectionQuestionest compos´ed’une seule question, qui suitl’En-tˆetedans une message DNS.

Cette question est repr´esent´ee par les trois champs suivants (RFC1035 partie 4.1.2) : (1) Q-Name (taille variable) indique unechaˆıne DNS: c’est une suite de labels,

par exemplewww.lifl.frdonne0377 7777 046c 6966 6c02 6672 00.

Les points ne sont pas cod´es, par contre on utilise des s´eparateurs (01 02 03. . .39) qui indiquent la longueur du label suivant. Ainsi, le premier octet03indique qu’il y a 3 octets dans le label qui suit, avant le nouveau s´eparateur (i.e.77 77 77soitwww), de mˆeme04indique qu’il y a 4 octets dans le prochain label, avant le nouveau s´eparateur (6c 69 66 6csoitlifl) et02indique qu’il y a 2 octets dans le label suivant : 66 72soitfr. Le dernier octet `a00indique la fin de lachaˆıne DNS.

(2) Q-Type (16 bits) indique le type de requˆete (RFC1035 partie 3.2.2) : vous trouverez par exemple la valeur 00 01lorque l’on demande la r´esolution duQ-Nameen adresse IPv4 (ce qui est demand´e pour ce TP).

(3) Q-Class (16 bits) indique le type du protocole (RFC1035 partie 3.2.4) : vous trouverez uniquement la valeur 00 01pour des adresses Internet.

Exemple de requˆete (trame ´emise en faisantnslookup www.lifl.froudig www.lifl.fr) : 08bb 0100 : identifiant 08bb - parametre 0100 (requˆete r´ecursive) 0001 0000 : 1 question, 0 r´eponse

0000 0000 : 0 autorit´e, 0 additionel 0377 7777 : .w ww

046c 6966 : .l if 6c02 6672 : l. fr 00

00 01 : type (host address) 00 01 : class (internet)

Question 2 : Ecrire une fonction qui permet de cr´eer une requˆete DNS et envoyez l`a `a votre serveur DNS (adresse dans /etc/resolv.conf) ou tout autre serveur DNS disponible (1.1.1.1, 9.9.9.9, fnd dns, 193.49.225.15, 193.49.225.90)

2.2.3 Autres champs d’un paquet DNS

Les sectionsR´eponse(s), Autorit´e(s), Additionnel(s)sont toutes repr´esent´ees par une suite d’enregistrement(s), dont les nombres respectifs sont pr´ecis´es dansl’En-tˆete.

Un enregistrement est repr´esent´e par les six champs suivants (RFC1035 partie 4.1.3) :

(1) Name (taille variable) : voir le champ Q-Name de la sectionQuestion. Il s’agit d’unechaˆıne DNS.

Cependant, pour ´eviter de recopier la totalit´e ou une partie d’unechaˆıne DNSd´eja pr´esente dans les donn´ees pr´ec´edentes, il est possible de remplacer unS´eparateur(par exemple le tout premier s´eparateur de la chaˆıne) par unPointeur. Ce pointeur remplace ou termine lachaˆıne DNS, en indiquant la position du suffixe de cette chaˆıne `a lire (RFC1035 partie 4.1.4). Il indique ce que l’on appelle unOffsetque nous d´etaillons ci-dessous.

— Pour distinguer unS´eparateurd’unPointeur, il suffit de lire l’octet en cours : si les deux premiers bits de poids fort de cet octet sont `a11, il ne s’agit alors pas d’une longueur (et donc d’unS´eparateur sur un octet) mais d’unPointeur(sur deux octets).

— Pour d´ecoder unOffset, il faut d’abord lireDeux Octetssoit un bloc de 16 bits ; Par exemple :C0 0C, ou respectivement D2 34. La partie codante, l’Offset est sur les 14 derniers bits : elle donne un d´ecalage par rapport au d´ebut des donn´ees ; Par exemple : 12 octets, ou respectivement 4660 octets : cela signifierait que le suffixe (la suite `a lire) pour lachaˆıne DNS, se trouverait au 13`eme octet (soit dans l’exemple pr´ec´edent, seraitwww.lifl.fr) ou respectivement au 4661`eme octet du message.

(2) Type (16 bits) : voir le champ Q-Type de la sectionQuestion. Il arrive souvent que ce Type (RFC1035 partie 3.2.2) prenne, dans le cas d’une r´eponse `a une requˆete de r´esolution d’adresse IPv4, les valeurs suivantes :

(4)

— 00 05 = CNAME: RDData donnera alors unnom cannonique(soit une chaˆıne DNS)

— 00 01 = A: RDData donnera alors une adresse IPv4 encod´ee sur 32 bits.

(3) Class (16 bits) : voir le champ Q-Class de la sectionQuestion.

(4) TTL (32 bits) : dur´ee de vie de l’entr´ee en secondes.

(5) RDLength (16 bits) : nombre d’octets de la zone RDData. Cet element permet d’ignorer la zone RDData (pour passer `a d’autres entr´ees), si le type et la classe ne sont pas connus.

(6) RDData (RDLength octets) : contenu informatif de cette entr´ee.

Question 3:R´ecup´erer le datagramme de retour fournie par le serveur, l’afficher `a l’´ecran, l’analyser et isoler l’adresse IPv4.

Question 4:Ecrire une fonction capable de r´ealiser une analyse DNS du datagramme de retour, et de retourner une adresse IPv4.

(5)

Voici un exemple d’analyse r´ealis´e il y a quelques ann´ees, pour vous aider dans le d´ecodage :

-- Entete -- // voir partie 4.1.1 de la RFC 1035 //

08 bb : IDENTIFIANT

85 80 : FLAGS = 1 0000 1 0 1 1 000 0000

{ QR:1 // = Reponse // ; Opcode:0000 // = Standard Query // ; AA:1 // Authoritative Answer //; TC:0 // TrunCation // ; RD:1 // Recursion Desired // ; RA:1 // Recursion Available // ; Z:000 // ... //; RCODE:0000 //No error condition// }

00 01 : QDCOUNT (Nombre de questions) 00 02 : ANCOUNT (Nombre de reponses) 00 02 : NSCOUNT (Nombre d’authorites) 00 02 : ARCOUNT (Nombre d’additionnels))

-- Question 1 -- // voir partie 4.2.1 de la RFC 1035 //

03 77 77 77 04 6c 69 66 6c 02 66 72 00 : "www.lifl.fr"

00 01 QTYPE = A (Host Address) // voir partie 3.2.2 de la RFC 1035 //

00 01 QCLASS = IN (Internet) // voir partie 3.2.4 de la RFC 1035 //

*** QUESTION 1 : quel est l’adresse IP de la machine de nom "www.lifl.fr" ***

-- Reponse 1 -- // voir partie 4.2.2 de la RFC 1035 //

c0 0c : "www.lifl.fr" // compression : voir partie 4.1.4 de la RFC 1035 //

00 05 : TYPE = CNAME (Cannonial Name For An Alias) // voir partie 3.2.2 de la RFC 1035 //

00 01 : CLASS = IN (Internet) // voir partie 3.2.4 de la RFC 1035 //

00 00 54 60 : TTL

00 08 : RDLENGTH (Taille des donnees qui suivent en nombre d’octets) 05 6c 6f 75 69 73 c0 10 : "louis.lifl.fr"

*** REPONSE 1 : "louis.lifl.fr" EST LE NOM CANONIQUE (VRAI NOM) DE LA MACHINE "www.lifl.fr" (ALIAS) ***

-- Reponse 2 --

c0 29 : "louis.lifl.fr"

00 01 : TYPE = A (Host Address) // voir partie 3.2.2 de la RFC 1035 //

00 01 : CLASS = IN (Internet) // voir partie 3.2.4 de la RFC 1035 //

00 00 54 60 : TTL

00 04 : RDLENGTH (Taille des donnees qui suivent en nombre d’octets) 86 ce 0b 65 : ’134.206.11.101’

*** REPONSE 2 : ’134.206.11.101’ EST L’ADRESSE IP DE "louis.lifl.fr" (et donc de "www.lifl.fr") ***

-- Authorite 1 --

c0 10 : lifl.fr // Autorit´e du Domaine "lifl.fr" //

00 02 : TYPE = NS (an authoritative name server) // voir partie 3.2.2 de la RFC 1035 //

00 01 : CLASS = IN (Internet) // voir partie 3.2.4 de la RFC 1035 //

00 02 a3 00 : TTL

00 16 : RDLENGTH (Taille des donnees qui suivent en nombre d’octets)

07 72 65 73 65 72 76 31 0b 75 6e 69 76 2d 6c 69 6c 6c 65 31 c0 15 : NS RDATA format = "reserv1.univ-lille1.fr" //voir partie 3.3.11 //

*** AUTHORITE 1 : "reserv1.univ-lille1.fr" EST UN SERVEUR DE NOM FAISANT AUTHORITE SUR LE DOMAINE "lifl.fr" ***

-- Authorite 2 --

c0 10 : "lifl.fr" // Autorit´e du Domaine "lifl.fr" //

00 02 : TYPE = NS (an authoritative name server) // voir partie 3.2.2 de la RFC 1035 //

00 01 : CLASS = IN (Internet) // voir partie 3.2.4 de la RFC 1035 //

00 02 a3 00 : TTL

00 0a : RDLENGTH (Taille des donnees qui suivent en nombre d’octets)

07 72 65 73 65 72 76 32 c0 55 : NS RDATA format = "reserv2.univ-lille1.fr" //voir partie 3.3.11 //

*** AUTHORITE 2 : "reserv2.univ-lille1.fr" EST UN SERVEUR DE NOM FAISANT AUTHORITE SUR LE DOMAINE "lifl.fr" ***

-- Additionel 1 --

c0 4d : "reserv1.univ-lille1.fr"

00 01 : TYPE = A (Host Address) // voir partie 3.2.2 de la RFC 1035 //

00 01 : CLASS = IN (Internet) // voir partie 3.2.4 de la RFC 1035 //

00 00 54 60 : TTL

00 04 : RDLENGTH (Taille des donnees qui suivent en nombre d’octets) c1 31 e1 0f : ’193.49.225.15’

*** ADDITIONEL 1 : "reserv1.univ-lille1.fr" A POUR ADRESSE IP ’193.49.225.15’ ***

-- Additionel 2 --

c0 6f : "reserv2.univ-lille1.fr"

00 01 : TYPE = A (Host Address) // voir partie 3.2.2 de la RFC 1035 //

00 01 : CLASS = IN (Internet) // voir partie 3.2.4 de la RFC 1035 //

00 00 54 60 : TTL

00 04 : RDLENGTH (Taille des donnees qui suivent en nombre d’octets) c1 31 e1 5a : ’193.49.225.90’

*** ADDITIONEL 2 : "reserv2.univ-lille1.fr" A POUR ADRESSE IP ’193.49.225.90’ ***

(6)

Références

Documents relatifs

L'informatique construit des mots binaires de 32 ou 64 éléments binaires suivant la génération du processeur pour communiquer avec les périphériques.. - En moyenne 3 MO pour

Sur une disquette, combien pourrez vous stocker de fichiers traitement de texte environ sachant qu’ils font en moyenne 30 kilo octets. Vous possédez une clef USB de

(Photo credits: KZ Gedenkstatte Dachau, courtesy of USHMM Photo Archives ).. Marche en faveur de la présidence

To evaluate most of the physical quantities which are functions of the matrix elements of the currents on vectors of the adjoint representation, one.. has to compute

Prendre du recul c'est pouvoir comparer et donc disposer dans son expérience, d'au moins deux systèmes différents à confronter.. Ce qui signifie que, par exemple, la

Écrivez en Java un programme qui reçoit sur un port des datagrammes UDP et qui en affiche le contenu précédé de l’adresse de la socket émettrice, c’est-à-dire l’adresse IP de

– à la réception de chaque message, il le réexpédie, précédé de l’adresse de la socket émettrice comme avant, à toutes les adresses dans cette

1) Non, les trajectoires ne sont pas identiques et ne sont pas de même longueur (preuve facile si on prend une ficelle et que l'on mesure la trajet effectué).. Mouvement de