Sockets & programmation réseau POSIX

Documents pareils
1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

Travaux Pratiques Introduction aux réseaux IP

LA COUCHE TRANSPORT CONTRÔLE LE FLOT DE DONNEES TRANSMISES par la couche Réseau

Programmation Réseau. Anthony Busson IUT Info Lyon 1

FILTRAGE de PAQUETS NetFilter

TP2 - Conguration réseau et commandes utiles. 1 Généralités. 2 Conguration de la machine. 2.1 Commande hostname

Université Pierre Mendès France U.F.R. Sciences de l Homme et de la Société Master IC²A. TP réseau firewall

Fonctionnement Kiwi Syslog + WhatsUP Gold

Communication par sockets

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

Programmation Réseau. ! UFR Informatique ! Jean-Baptiste.Yunes@univ-paris-diderot.fr

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Capture, Filtrage et Analyse de trames ETHERNET avec le logiciel Wireshark. Etape 1 : Lancement des machines virtuelles VMWARE et de Wireshark

Formation Iptables : Correction TP

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Plan. Programmation Internet Cours 3. Organismes de standardisation

Internet Protocol. «La couche IP du réseau Internet»

Mise en place d'un Réseau Privé Virtuel

Intérêt du NAT (Network Address Translation) Administration Réseau Niveau routage. Exemple d Intranet. Principe NAT

Sécurité et Firewall

Plan. École Supérieure d Économie Électronique. Plan. Chap 9: Composants et systèmes de sécurité. Rhouma Rhouma. 21 Juillet 2014

TCP/IP, NAT/PAT et Firewall

Introduction. Adresses

Netfilter & Iptables. Théorie Firewall. Autoriser le trafic entrant d'une connexion déjà établie. Permettre le trafic entrant sur un port spécifique

Administration Réseaux

Sécurité des réseaux Firewalls

Programmation Réseau en C sous Unix

Alexis Lechervy Université de Caen. M1 Informatique. Réseaux. Filtrage. Bureau S3-203

Outils d'analyse de la sécurité des réseaux. HADJALI Anis VESA Vlad

Configuration réseau Basique

Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.

Figure 1a. Réseau intranet avec pare feu et NAT.

TP Déploiement de réseaux IP sous Linux et MS Windows sur une infrastructure virtualisée

TP : Introduction à TCP/IP sous UNIX

UFR de Mathématiques et Informatique Année 2009/2010. Réseaux Locaux TP 04 : ICMP, ARP, IP

Administration réseau Firewall

Année Universitaire session 1 d automne Parcours : CSB5 Licence 3 STS Informatique

Licence 3 Systèmes et Réseaux II. Chapitre V : Filtrage

Chapitre I. La couche réseau. 1. Couche réseau 1. Historique de l Internet

Administration UNIX. Le réseau

Iptables. Table of Contents

TP réseaux Translation d adresse, firewalls, zonage

CONVERTISSEUR RS 232/485 NOTICE

Linux Firewalling - IPTABLES

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Filtrage IP MacOS X, Windows NT/2000/XP et Unix

Analyse du réseau local

EPREUVE PRATIQUE DES TECHNIQUES INFORMATIQUES ACTIVITE N 1. Thème de l activité : Configuration d un firewall

Le Tunneling DNS. P.Bienaimé X.Delot P.Mazon K.Tagourti A.Yahi A.Zerrouki. Université de Rouen - M2SSI. 24 février 2011

Sécurité d IPv6. Sécurité d IPv6. Stéphane Bortzmeyer AFNIC bortzmeyer@nic.fr. Stéphane Bortzmeyer AFNIC bortzmeyer@nic.fr

TP Linux : Firewall. Conditions de réalisation : travail en binôme. Fonctionnement du parefeu Netfilter. I Qu est ce qu'un firewall?

Les firewalls libres : netfilter, IP Filter et Packet Filter

DIFF AVANCÉE. Samy.

Protocoles réseaux. Abréviation de Binary Digit. C'est la plus petite unité d'information (0, 1).

Les ACL Cisco. F. Nolot Master 2 Professionnel STIC-Informatique 1

Présentation du modèle OSI(Open Systems Interconnection)

Windows Vista, Windows Server 2008, IPv6 et les applications. Bernard Ourghanlian Chief Technology & Security Officer Microsoft France

Les systèmes pare-feu (firewall)

Réseau - VirtualBox. Sommaire

TP SECU NAT ARS IRT ( CORRECTION )

Le modèle client-serveur

pare - feu généralités et iptables

1.Introduction - Modèle en couches - OSI TCP/IP

Sécuriser son réseau. Sécuriser son réseau Philippe Weill (IPSL/LATMOS) Frédéric Bongat (SSI/GOUV/FR)

RESEAUX TCP/IP: NOTIONS AVANCEES. Preparé par Alberto EscuderoPascual

Réseaux IUP2 / 2005 IPv6

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

7.3 : Ce qu IPv6 peut faire pour moi

II/ Le modèle OSI II.1/ Présentation du modèle OSI(Open Systems Interconnection)

Table des matières GNU/Linux Services Serveurs Éléments de cours sur TCP/IP Fichiers de configuration et commandes de base ...

ROUTAGE. Répondez aux questions suivantes : (A chaque fois pour XP et pour Debian)

Connexion à un réseau local: Configuration et dépannage

Réseaux. Moyens de sécurisation. Plan. Evolutions topologiques des réseaux locaux

Systèmes et Réseaux (ASR 2) - Notes de cours Cours 14

Préparation LPI. Exam Securité. Document sous licence Creative commons «by nc sa» nc sa/2.

Communication sous UNIX les sockets

Environnements informatiques

Travaux pratiques IPv6

ASR4 Réseaux Département Informatique, IUT Bordeaux 1. DHCP Prénom : Nom : Groupe :

Administration Réseau sous Ubuntu SERVER Serveur DHCP

Programmation Internet en Java

Réseau : Interconnexion de réseaux, routage et application de règles de filtrage.

TP 1 : LES COMMANDES RESEAUX Matière: RESEAUX LOCAUX

Security and privacy in network - TP

Couche application. La couche application est la plus élevée du modèle de référence.

CONFIGURATION FIREWALL

Cisco Certified Network Associate

TP Wireshark. Première approche de Wireshark. 1 ) Lancer Wireshark (double clic sur l icône sur le bureau). La fenêtre

Polux Développement d'une maquette pour implémenter des tests de sécurité

acpro SEN TR firewall IPTABLES

Conférence Starinux Introduction à IPTABLES

avec Netfilter et GNU/Linux

Procédure d utilisation et de paramétrage (filtrage) avec IPFIRE

Fonctionnement de Iptables. Exercices sécurité. Exercice 1

ETI/Domo. Français. ETI-Domo Config FR

TP 3 Réseaux : Subnetting IP et Firewall

TP4 : Firewall IPTABLES

Le protocole TCP. Services de TCP

Partie 1 : Architecture et communications Client/Serveur

Transcription:

Sockets & programmation réseau POSIX

Sockets Socket : point de communication bidirectionnel La communication peut être : une communication réseau entre deux processus de la même machine entre un processus et le noyau... Une connexion réseau : 2 sockets = les deux points naux de la connexion Attention : une socket n'est pas forcement pour une communication réseau une communication réseau n'est pas forcement une communication par le protocole IP

Vue générale créer une socket : socket associer une socket : bind TCP / Côté "serveur" : écouter sur une socket : listen accepter une connexion : accept TCP Côté "client" : se connecter : connect Côté "client" et "serveur" : envoyer un message : write, send, sento recevoir un message : read, recv, recvfrom fermer une socket : shutdown et close

Créer une socket : int socket(int domain, int type, int protocol) Renvoie un descripteur de chier (-1 si erreur) Domaine : ("domaine de communication", familles de protocoles) AF_UNIX : socket local (voir chapitre tubes) AF_INET : Internet IPV4 AF_INET6 : internet IPV6 AF_PACKET : paquets liaison (ethernet...) autres réseaux ou réseaux obsolètes (IPX, X25, AppleTalk...)

Créer une socket : int socket(int domain, int type, int protocol) Type : SOCK_STREAM : par ot, connecté, bidirectonnel, able pour AF_INET(6), c'est TCP SOCK_DGRAM : par paquets, non connecté, non able pour AF_INET(6), c'est UDP SOCK_RAW : accès réseau "brut" SOCK_SEQPACKET : paquets, connecté, bidirectonnel, able pour AF_INET(6), protocole SCTP (en cours de déploiement) Protocole : Pour AF_INET ou AF_INET6, c'est le numéro du protocole dans le paquet IP (TCP=6, UDP=17) Si un unique protocole existe dans le domaine/type, protocole peut être à zéro

Créer une socket : int socket(int domain, int type, int protocol) Si domaine = AF_INET (IPv4) ou AF_INET6 (IPv6) TCP : type = SOCK_STREAM, protocole = 0 ou IPPROTO_TCP (=6) UDP : type = SOCK_DGRAM, protocole = 0 ou IPPROTO_UDP (=17) pour construire un paquet IP "brut" : type = SOCK_RAW, protocole > 0 (champ "protocol" dans le paquet IP) (et il faut les droits qui vont avec...)

Créer une socket : int socket(int domain, int type, int protocol) Erreurs possibles EPERM : opération non permise (exemple : AF_INET/SOCK_RAW pour utilisateur lambda) ESOCKTNOSUPPORT : type non supporté (exemple : AF_INET/SOCK_SEQPACKET) EPROTONOSUPPORT : protocole non supporté...

RAPPEL : Mode "ot" (STREAM) Mode ot : les envois successifs d'informations s'additionnent. Il n'y a pas de "séparations" entre elles. Exemple : write(in,"abc",3) le tube contient "ABC" write(in,"123",3) le tube contient "ABC123" read(out,bf,4) renvoie 4, et bf contient "ABC1" le tube contient "23" read(out,bf,4) renvoie 2, et bf contient "23" le tube est vide read(out,bf,4) bloque jusqu'à ce qu'un processus écrive dans la socket...

RAPPEL : Mode paquet (DGRAM) Au contraire du mode ot (STREAM), chaque information envoyée constitue une entité indivisible. Exemple : write(in,"abc",3) la le de messages contient "ABC" write(in,"123",3) la le contient "ABC","123" read(out,bf,10) renvoie 3, et bf contient "ABC" la le contient "123" read(out,bf,10) renvoie 3, et bf contient "123" la le vide read(out,bf,4) bloque jusqu'à ce qu'un processus écrive dans la socket... Attention : si le tampon n'est pas assez grand, la n du datagramme est perdue!

Attacher une socket socket() permet de créer une socket, mais elle n'est par défaut associée à rien (ni adresse, ni port). Pour l'associer, il faut utiliser : int bind(int fd, struct sockaddr *addr, int addrlen) fd : descripteur de chier associé à une socket addr : pointeur sur une structure sockaddr_*, qui contient l'adresse et le port de la machine locale addrlen : taille de la structure addr renvoie 0 (OK), ou -1 (erreur)

Attacher une socket addr dépend du domaine de communication. Chaque domaine à sa structure sockaddr (et sa taille). D'où l'intérêt de addrlen. AF_INET : sockaddr_in AF_INET6 : sockaddr_in6

Attacher une socket s t r u c t s o c kaddr_in { sa_family_t s i n _ f a m i l y ; / AF_INET / in_port_t s i n _ p o r t ; / p o r t / s t r u c t in_addr sin_addr ; / a d r e s s e I P v 4 / } ; / A d r e s s e I n t e r n e t / s t r u c t in_addr { uint32_t s_addr ; / a d r e s s e / } ;

Attacher une socket s t r u c t sockaddr_in6 { sa_family_t s i n 6 _ f a m i l y ; / AF_INET6 / in_port_t s i n 6 _ p o r t ; / p o r t / uint32_t s i n 6 _ f l o w i n f o ; / i n f o f l u x / s t r u c t in6_addr sin6_addr ; / a d r e s s e I P v 6 / uint32_t sin6_scope_id ; / Scope ID / } ; s t r u c t in6_addr { unsigned char s6_addr [ 1 6 ] ; / a d r e s s e / } ;

Attacher une socket sin_family : le domaine de communication de la socket sin_port : le port (TCP ou UDP) si 0 : attachée à un port libre. (Rappel : un machine peut avoir plusieurs adresses!) sin_addr : l'adresse de la machine INADDR_ANY : toutes les adresses possibles de la machine Note : bind() est optionnel. Si on eectue un listen() ou un connect() sur une socket non aectée, elle sera aectée automatiquement sur un port libre. OK pour les clients, mais problématique pour les serveurs...

Connexion (TCP / initiateur de connexion) int connect(int fd, struct sockaddr *addr, int addrlen) fd : descripteur de chier associé à une socket addr : pointeur sur une structure sockaddr_*, qui contient l'adresse et le port de la machine distante addrlen : taille de la structure addr renvoie 0 (OK), ou -1 (erreur)

Connexion (TCP / initiateur de connexion) Exemple client simple (web)

Écouter un port (TCP / receveur de connexion, "serveur") Rappel : il peut y avoir plusieurs connexions sur un même port : C'est la paire (adresse/port hôte 1, adresse/port hôte 2) qui identie une connexion Pour écouter un port : int listen(int fd, int backlog) fd : descripteur de chier associé à une socket backlog : nombre maximum de connexions en attente

Accepter une connexion (TCP / receveur, "serveur") int accept(int fd, struct sockaddr *addr, int *addrlen) Permet de prendre connaissance des nouvelles connexions fd : descripteur de chier associé à une socket addr : pointeur vers une structure sockaddr_* où sera copié l'adresse de l'initiateur de la connexion. addrlen : est un pointeur sur un entier elle contient la taille maximum de la structure pointée par addr au retour de la fonction, elle contiendra sa taille eective renvoie un nouveau descripteur de chier (ou -1 si erreur) c'est sur ce nouveau descripteur qu'on fera nos opérations d'envoi et d'écoute Par défaut, accept est bloquant. Pour avoir le caractère non bloquant : fcntl+o_nonblock, select ou poll.

Accepter une connexion (TCP / receveur, "serveur") Si on veut gérer plusieurs connexions en même temps, il faut faire attention au caractère bloquant Solutions possibles : utiliser plusieurs threads : un thread par connexion utiliser select ou poll passer le descripteur de chier en mode non bloquant (et trouver une solution pour éviter les attentes actives...)

Exemple serveur simple (web)

Envoi/réception (TCP) Les opérations d'envoi de message et de lecture peuvent se faire comme à l'accoutumé avec write et read. Mais il existe des commandes spéciques, avec des options en plus : int send(int fd, void *buffer, size_t len, int options) fd, buer, len, retour : comme dans write options : MSG_MORE : "more to come". ne pas envoyer directement le paquet, attendre la suite. MSG_OOB : Out-of-band (données "urgentes") MSG_DONTWAIT : non bloquant MSG_DONTROUTE : ne pas router le paquet MSG_NOSIGNAL : pas de signal SIGPIPE si la connexion est fermée MSG_CONFIRM... Note : write(fd,buff,len) est équivalent à send(fd,buff,len,0)

Envoi/réception (TCP) int recv(int fd, void *buffer, size_t len, int options) fd, buer, len, retour : comme dans read options : MSG_PEEK : ne pas enlever les données du tampon de réception MSG_OOB : récupère les données Out-of-band (données "urgentes") MSG_ERRQUEUE : récupérer les données de la queue d'erreurs MSG_DONTWAIT : non bloquant... Note : read(fd,buff,len) est équivalent à recv(fd,buff,len,0)

Envoi/réception (UDP) connect() sur une socket UDP (DGRAM) dénit l'adresse/port où les datagrammes sont envoyés par défaut, et la seule adresse d'où les datagrammes sont acceptés. (pas de listen()/accept() en UDP!) Méthode alternative : s s i z e _ t s e n d t o ( i n t s o c k f d, const void buf, s i z e _ t l e n, i n t f l a g s, const s t r u c t s o c k a d d r dest_addr, s o c k l e n _ t a d d r l e n ) ; Permet d'envoyer directement un datagramme l'adresse dest_addr, sans faire de connect préalable.

Envoi/réception (UDP) s s i z e _ t r e c v f r o m ( i n t s o c k f d, void buf, s i z e _ t l e n, i n t f l a g s, s t r u c t s o c k a d d r src_addr, s o c k l e n _ t a d d r l e n ) ; Comme recv(), et l'adresse source du datagramme sera copiée dans src_addr. send(sockfd, buf, len, flags) est équivalent à : sendto(sockfd, buf, len, flags, NULL, 0)

SOCK_RAW, AF_PACKET... Pour construire un paquet "brut" : par exemple ICMP (utilisé par ping) s o c k e t (AF_INET, SOCK_RAW, IPPROTO_ICMP) un packet IP brut : s o c k e t (AF_INET, SOCK_RAW, IPPROTO_RAW) un paquet Ethernet : s o c k e t (AF_PACKET,SOCK_DGRAM, h t o n s (ETH_P_IP) ) Attention, il faut des droits particuliers : $ g e t c a p / b i n / p i n g / b i n / p i n g = cap_net_raw+ep

Fermer une socket int shutdown(int sockfd, int how) Rappel : dans une socket TCP, chaque hôte peut indépendamment signaler la n de ses envois. how : SHUT_RD : fermeture de la réception SHUT_WR : fermeture de l'émission SHUT_RDWR : fermeture des deux directions Puis close() pour fermer la socket!

htons... La représentation des entiers n'est pas forcément la même sur la machine et sur internet : Par exemple, les x86 ont une représentation en Little endian (petit-boutiste) La représentation dans les packets internet est en Big endian (grand-boutiste) Il existe des fonctions de conversion : htons() (Host TO Network Short) : entier 16 bits : représentation machine représentation réseau htonl() (Host TO Network Long) : entier 32 bits : représentation machine représentation réseau ntohs() (Network TO Host Short) : entier 16 bits : représentation réseau représentation machine ntohl() (Network TO Host Long) : entier 32 bits : représentation réseau représentation machine

inet_pton #i n c l u d e <a rpa / i n e t. h> i n t i n e t _ p t o n ( i n t af, const char s r c, void d s t ) ; Converti une adresse (IPv4 ou IPv6) du format texte au format binaire af : AF_INET ou AF_INET6 src : la chaîne de caractère de l'adresse dst : un pointeur sur struct in_addr ou struct in6_addr (Remplace inet_aton(), qui fonctionne que pour IPv4) Opération inverse : inet_ntop()

Résolution de noms DNS #i n c l u d e <s y s / t y p e s. h> #i n c l u d e <s y s / s o c k e t. h> #i n c l u d e <netdb. h> i n t g e t a d d r i n f o ( const char node, const char s e r v i c e, const s t r u c t a d d r i n f o h i n t s, s t r u c t a d d r i n f o r e s ) ; void f r e e a d d r i n f o ( s t r u c t a d d r i n f o r e s ) ; const char g a i _ s t r e r r o r ( i n t e r r c o d e ) ; Traduit les noms et/ou services.

Résolution de noms DNS Paramètres de getaddrinfo : node : (si non NULL) le nom de la machine (DNS) service : (si non NULL) le nom du service (voir /etc/services) hints : (si non NULL) pointe sure une structure addrinfo qui contient les critères de la recherche res : où sera copiée la liste chaînée des résultats. Pourquoi une liste? Un nom peut avoir plusieurs translations. Par exemple IPv4 et IPv6...

Résolution de noms DNS getaddrinfo renvoie 0 si OK, sinon il renvoie un code d'erreur qui peut être transformé en texte par gai_strerror() freeaddrinfo() détruit la liste chaînée des résultats Fonction inverse : getnameinfo() Ancienne fonction (obsolète) : gethostbyname()

Résolution de noms DNS s t r u c t a d d r i n f o { i n t a i _ f l a g s ; // o p t i o n s i n t a i _ f a m i l y ; // AF_ i n t a i _ s o c k t y p e ; // SOCK_ i n t a i _ p r o t o c o l ; // 0, 6, 1 7... s o c k l e n _ t a i _ a d d r l e n ; s t r u c t s o c k a d d r ai_addr ; c h a r ai_canonname ; s t r u c t a d d r i n f o a i _ n e x t ; } ;

Résolution de noms DNS s t r u c t a d d r i n f o r e s, p ; i n t e r r=g e t a d d r i n f o ( av [ 1 ], NULL, NULL,& r e s ) ; i f ( e r r ) p r i n t f ( " e r r e u r %s \n", g a i _ s t r e r r o r ( e r r ) ) ; p=r e s ; w h i l e ( p ) { c h a r hostname [NI_MAXHOST ] ; e r r=g e t n a m e i n f o ( p >ai_addr, p >a i _ a d d r l e n, hostname, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) ; i f ( e r r ) p r i n t f ( " e r r e u r %s \n", g a i _ s t r e r r o r ( e r r ) ) ; e l s e p r i n t f ( " hostname : %s \n", hostname ) ; p=p >a i _ n e x t ; } f r e e a d d r i n f o ( r e s ) ;

Option des sockets i n t g e t s o c k o p t ( i n t s o c k f d, i n t l e v e l, i n t optname, void o p t v a l, s o c k l e n _ t o p t l e n ) i n t s e t s o c k o p t ( i n t s o c k f d, i n t l e v e l, i n t optname, const void o p t v a l, s o c k l e n _ t o p t l e n ) Permet de lire/modier les options d'une socket Par exemple, pour désactiver l'"algorithme de Nagle", qui fait attendre qu'il y ait assez de données avant d'envoyer un packet : i n t one = 1 ; s e t s o c k o p t ( fd, SOL_TCP, TCP_NODELAY, &one, s i z e o f ( one ) ) ; voir man 7 socket, man 7 ip, man 7 tcp...

Administration réseau sous Linux (vue rapide)

ifconfig Liste et congure les interfaces réseau. Exemples : Acher toutes les interfaces i f c o n f i g a Dénir l'adresse IP de eth0 (ethernet) i f c o n f i g eth0 up 1 9 2. 1 6 8. 0. 1 / 2 4 Changer l'adresse MAC d'une interface : i f c o n f i g eth0 hw e t h e r e f : 4 2 : 0 3 : 1 7 : a5 : 6 f

iwlist/iwconfig Liste les informations et congure les interfaces réseau sans-l. Exemples : Lister les réseaux sans l : i w l i s t wlan0 s c a n n i n g Connexion à un point d'accès ouvert i w c o n f i g wlan0 e s s i d nom_reseau

route Liste et administre la table de routage statique Acher les routes : r o u t e Ajout d'une route vers un hôte : r o u t e add 1 9 2. 1 6 8. 2. 4 gw 1 9 2. 1 6 8. 1. 2 Ajout d'une route vers un sous-réseau : r o u t e add n e t 1 9 2. 1 6 8. 3. 0. 2 4 gw 1 9 2. 1 6 8. 1. 5

Acher les connexions, voir les paquets... netstat : Ache les connexions réseau, statistiques... iptraf : Ache les connexions réseau, statistiques... en interactif wireshark : Analyseur de paquets interactif ngrep : Fait une recherche (grep) sur les paquets réseau

autres commandes utiles Vérication du réseau : ping traceroute DNS host nslookup Utilitaires nc : "TCP/IP swiss army knife" (attention : informations transitent en clair) ssh : copies de chier par le réseau, proxy, redirection de port entre diérentes machines (chiré)

iptables Outil d'administration du ltrage de paquets IP Acher les ltres : i p t a b l e s L v n Ajouter un ltre (ignorer de tout paquet reçu d'un sous réseau) i p t a b l e s A INPUT s 1 4 2. 1 7. 0. 0. 0 / 1 6 j DROP rejet de tout paquet TCP reçu avec port de destination 22 i p t a b l e s D INPUT p t c p d p o r t 22 j REJECT Énormément de ltres possibles Fonctionne avec des listes. On peut choisir de rejeter tout par défaut, sauf les paquets qui matchent...