raw(7) Miscellaneous Information Manual raw(7) NOM raw - Sockets raw IPv4 sous Linux SYNOPSIS #include #include raw_socket = socket(AF_INET, SOCK_RAW, int protocole); DESCRIPTION Les sockets raw (bruts, sans protocole) permettent d'implementer de nouveaux protocoles IPv4 dans l'espace utilisateur. Un socket raw recoit ou envoie des datagrammes bruts sans les en-tetes de couche de liaison. La couche IPv4 genere des en-tetes IP lorsqu'elle envoie un paquet, a moins que l'option IP_HDRINCL de socket ne soit activee sur le socket. Lorsqu'elle est activee, le socket doit contenir l'en-tete IP. Pour la reception, l'en-tete IP est toujours inclus dans le paquet. Dans le but de creer un socket raw, un processus doit avoir la capacite CAP_NET_RAW dans l'espace de noms utilisateur qui regit son espace de noms reseau. Tous les paquets ou les erreurs correspondant au numero de protocole indique pour le socket raw sont transmis a ce socket. Pour voir une liste des protocoles autorises, consultez les numeros assignes dans et getprotobyname(3). Un protocole IPPROTO_RAW implique l'activation de IP_HDRINCL et autorise l'emission suivant n'importe quel protocole IP indique dans l'en-tete. La reception de tous les protocoles IP avec IPPROTO_RAW n'est pas possible avec les sockets raw. +--------------------------------------------------------------+ |Champs d'en-tete IP modifies en emission par IP_HDRINCL | +-----------------------------+--------------------------------+ |Somme de controle d'IP | Toujours rempli | +-----------------------------+--------------------------------+ |Adresse de socket | Rempli si compose de zeros | +-----------------------------+--------------------------------+ |ID de paquet | Rempli si compose de zeros | +-----------------------------+--------------------------------+ |Longueur totale | Toujours rempli | +-----------------------------+--------------------------------+ Si IP_HDRINCL est indique et si l'en-tete IP a une adresse de destination differente de zero, alors l'adresse de destination du socket est utilisee pour router le paquet. Quand MSG_DONTROUTE est indique, l'adresse de destination devrait toujours viser une interface locale. Sinon, un examen de la table de routage a quand meme lieu, mais les routes avec une passerelle sont ignorees. Si IP_HDRINCL n'est pas indique, les options d'en-tete IP peuvent etre definies sur les sockets raw avec setsockopt(2) ; consultez ip(7) pour plus d'informations. Depuis Linux 2.2 tous les champs d'en-tete IP et les options peuvent etre definis en utilisant les options IP de socket. Cela signifie que les sockets raw ne servent en general que pour les nouveaux protocoles ou les protocoles sans interface utilisateur (comme ICMP). Lorsqu'un paquet est recu, il est passe a tous les sockets raw qui ont ete attaches a son protocole avant d'etre transmis aux gestionnaires des autres protocoles (par exemple les modules des protocoles du noyau). Formats d'adresse Pour envoyer et recevoir des datagrammes (sendto(2), recvfrom(2) et similaires), les sockets raw utilisent la structure d'adresse sockaddr_in standard, definie dans ip(7). Le champ sin_port pourrait etre utilise pour indiquer un numero de protocole IP, mais il est ignore pour l'emission dans Linux 2.2 et les versions suivantes et devrait etre toujours mis a zero (voir paragraphe BOGUES). Pour les paquets entrants sin_port est regle a zero. Options de socket Les options des sockets raw peuvent etre ecrites avec setsockopt(2) et lues avec getsockopt(2) en passant l'attribut de famille IPPROTO_RAW. ICMP_FILTER Activer un filtre special sur les sockets raw lies au protocole IPPROTO_ICMP. La valeur a un bit defini pour chaque type de message ICMP qui doit etre rejete. La valeur par defaut est de ne filtrer aucun message ICMP. De plus, toutes les options IPPROTO_IP de ip(7) valables pour les sockets datagrammes sont prises en charge. Traitement des erreurs Les erreurs provenant du reseau ne sont transmises a l'utilisateur que lorsque le socket est connecte ou si le drapeau IP_RECVERR est actif. Pour les sockets connectes, seules EMSGSIZE et EPROTO sont transmises pour compatibilite. Avec IP_RECVERR, toutes les erreurs reseau sont sauvegardees dans la file d'erreurs. ERREURS EACCES L'utilisateur essaye d'envoyer sur une adresse broadcast sans avoir le drapeau broadcast sur le socket. EFAULT Une adresse memoire incorrecte a ete fournie. EINVAL Argument incorrect. EMSGSIZE Paquet trop grand. Soit la recherche du MTU d'un chemin donne (Path MTU discovery -- PMTUd)) est active (voir l'attribut IP_MTU_DISCOVER de socket), soit la taille du paquet depasse le maximum autorise par IPv4 (64 Ko). EOPNOTSUPP Un attribut incorrect a ete transmis a un appel de socket (comme MSG_OOB). EPERM L'utilisateur n'a pas la permission d'ouvrir des sockets raw. Seuls les processus avec un UID effectif egal a zero ou ayant la capacite CAP_NET_RAW peuvent le faire. EPROTO Une erreur ICMP est arrivee, indiquant un probleme de parametrage. VERSIONS IP_RECVERR et ICMP_FILTER sont nouveaux dans Linux 2.2. Ce sont des extensions Linux qui ne doivent pas etre employees dans des programmes portables. Linux 2.0 assurait une compatibilite bogue-a-bogue avec le code des sockets raw de BSD lorsque l'option SO_BSDCOMPAT de socket etait utilisee. Cela a ete supprime depuis Linux 2.2. NOTES Par defaut, les sockets bruts utilisent la detection du MTU (<< Maximum Transmission Unit >>) pour le chemin. Cela signifie que le noyau garde en memoire le MTU vers une adresse IP cible specifique et renvoie EMSGSIZE lorsqu'un paquet raw depasse cette taille. Dans ce cas, l'application doit diminuer la taille du paquet. La detection du MTU d'un chemin peut aussi etre desactivee en utilisant l'option de socket IP_MTU_DISCOVER ou le fichier /proc/sys/net/ipv4/ip_no_pmtu_disc, consultez ip(7) pour plus de details. Lorsque cette option est desactivee, les sockets raw fragmenteront les paquets sortants qui depassent le MTU de l'interface. C'est cependant decourage, pour des raisons de performance et de fiabilite. Un socket raw peut etre attache a une adresse locale specifique en utilisant l'appel bind(2). S'il n'est pas attache, tous les paquets du protocole IP indique sont recus. De plus, un socket raw peut etre attache a un peripherique reseau particulier avec SO_BINDTODEVICE ; consultez socket(7). Un socket IPPROTO_RAW ne fonctionne qu'en emission. Si vous desirez vraiment recevoir tous les paquets IP, utilisez un socket packet(7) avec le protocole ETH_P_IP. Notez que les sockets packet ne reassemblent pas les fragments IP contrairement aux sockets raw. Si vous voulez recevoir tous les paquets ICMP pour un socket datagram, il est souvent preferable d'utiliser IP_RECVERR sur ce socket particulier, consultez ip(7). Les sockets raw peuvent exploiter tous les protocoles IP sous Linux, meme les protocoles comme ICMP ou TCP qui ont un module de protocole dans le noyau. Dans ce cas, les paquets sont passes a la fois au module du noyau et au(x) socket(s) raw. Ce comportement n'est pas portable, de nombreuses autres implementations des sockets BSD ont leurs propres limites a ce sujet. Linux ne modifie jamais les en-tetes fournis par l'utilisateur (sauf pour remplir les champs ne contenant que des zeros comme cela est decrit pour IP_HDRINCL). Ca differe de nombreuses autres implementations des sockets raw. Les sockets raw sont en general peu portables et devraient etre evites dans les programmes destines a etre portables. L'emission sur les sockets raw devrait employer le protocole IP dans sin_port ; cette possibilite a ete perdue dans Linux 2.2. Une solution est d'utiliser IP_HDRINCL. BOGUES Les extensions de mandataire transparent ne sont pas decrites. Lorsque l'option IP_HDRINCL est active, les datagrammes ne seront pas fragmentes et sont limites au MTU de l'interface. Utiliser le protocole IP indique dans sin_port en emission a ete supprime dans Linux 2.2. Le protocole auquel le socket a ete lie ou celui indique dans l'appel socket(2) initial est toujours utilise. VOIR AUSSI recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7) RFC 1191 pour la recherche du MTU de chemin. RFC 791 et le fichier d'en-tete pour le protocole IP. TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Paul Guillonneau Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 raw(7)