NOM¶
raw - Sockets brutes (raw) IPv4 sous Linux
SYNOPSIS¶
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, int protocole);
DESCRIPTION¶
Les sockets brutes (raw) permettent d'implémenter des protocoles IPv4 dans
l'espace utilisateur. Une socket raw reçoit ou envoie des datagrammes
sans les en-têtes de la couche de liaison.
La couche IPv4 génère des en-têtes IP lorsqu'elle envoie un
paquet à moins que l'option
IP_HDRINCL soit activée sur la
socket. Lorsqu'elle est activée, la socket doit contenir l'en-tête
IP. Pour la réception, l'en-tête IP est toujours inclus dans le
paquet.
Seuls les processus avec un UID effectif nul ou une capacité
CAP_NET_RAW sont autorisés à ouvrir des sockets raw.
Tous les paquets ou les erreurs correspondant au numéro de
protocole
spécifié pour la socket raw sont transmis à cette socket. Pour
voir une liste des protocoles autorisés, consultez les numéros
assignés dans la RFC 1700 et
getprotobyname(3).
Un protocole
IPPROTO_RAW implique l'activation de
IP_HDRINCL et
autorise l'émission suivant n'importe quel protocole IP indiquée
dans l'en-tête. La réception de tous les protocoles IP avec
IPPROTO_RAW n'est pas possible avec les sockets raw.
IP Champs d'en-tête modifiés en émission par
IP_HDRINCL |
|
Checksum IP |
Toujours rempli. |
Adresse source |
Rempli si contient des zéros. |
ID Paquet |
Rempli si contient des zéros. |
Longueur totale |
Toujours rempli. |
Si
IP_HDRINCL est spécifié et si l'en-tête IP à une
adresse non-nulle, alors l'adresse destination de la socket est utilisée
pour router le paquet. Quand
MSG_DONTROUTE est spécifié,
l'adresse de destination devrait toujours viser une interface locale. Sinon,
un examen de la table de routage a quand même lieu, mais les routes avec
une passerelle sont ignorées.
Si
IP_HDRINCL n'est pas spécifié, les options d'en-tête IP
peuvent être définies sur les sockets raw avec
setsockopt(2) ; consultez
ip(7) pour plus d'informations.
Dans Linux 2.2 tous les champs d'en-tête et les options peuvent
être définis en utilisant les options IP. Ceci signifie que les
sockets raw ne servent en général que pour les nouveaux protocoles
ou les protocoles sans interface utilisateur (comme ICMP).
Lorsqu'un paquet est reçu, il est passé à toutes les sockets raw
qui ont été attachées à son protocole avant d'être
transmis aux gestionnaires des autres protocoles (par exemple les modules des
protocoles du noyau).
Les sockets raw utilisent la structure d'adresse
sockaddr_in standard,
définie dans
ip(7). Le champ
sin_port pourrait être
utilisé pour spécifier un numéro de protocole IP, mais il est
ignoré pour l'émission dans Linux 2.2 et devrait être
toujours mis à zéro (voir paragraphe BOGUES). Pour les paquets
entrants
sin_port est rempli avec le protocole du paquet. Consultez le
fichier d'en-tête
<netinet/in.h> pour les protocoles IP
valides.
Options de sockets¶
Les options des sockets raw peuvent être écrites avec
setsockopt(2) et lues avec
getsockopt(2) en passant l'attribut
de famille
IPPROTO_RAW.
- ICMP_FILTER
- Active un filtre spécial sur les sockets raw
attachées au protocole IPPROTO_ICMP. La valeur a un bit pour
chaque type de message ICMP qui doit être rejeté. La valeur par
défaut est de ne filtrer aucun messages ICMP.
De plus, toutes les options
IPPROTO_IP de
ip(7) valides pour les
sockets datagrammes sont prises en charge.
Traitement des erreurs¶
Les erreurs provenant du réseau ne sont transmises à l'utilisateur que
lorsque la socket est connectée ou si le drapeau
IP_RECVERR est
actif. Pour les sockets connectées, seules
EMSGSIZE et
EPROTO sont transmises, pour compatibilité. Avec
IP_RECVERR, toutes les erreurs réseau sont sauvegardées dans
la file d'erreurs.
ERREURS¶
- EACCES
- L'utilisateur essaye d'envoyer sur une adresse broadcast
sans avoir le drapeau broadcast sur la socket.
- EFAULT
- Une adresse mémoire invalide a été
fournie.
- EINVAL
- Argument invalide.
- EMSGSIZE
- Paquet trop grand. Soit la recherche du MTU des chemins est
active (voir l'attribut IP_MTU_DISCOVER de socket), soit la taille
du paquet dépasse le maximum autorisé par IPv4
(64 Ko).
- EOPNOTSUPP
- Un attribut invalide a été transmis à un
appel sur la socket (comme MSG_OOB).
- EPERM
- L'utilisateur n'a pas la permission d'ouvrir des sockets
raw. Seuls les processus avec un UID effectif nul ou la capacité
CAP_NET_RAW peuvent le faire.
- EPROTO
- Une erreur ICMP est arrivée, indiquant un
problème de paramétrage.
VERSIONS¶
IP_RECVERR et
ICMP_FILTER sont nouveaux dans Linux 2.2. Ce
sont des extensions Linux et ne doivent pas être employés dans des
programmes portables.
Linux 2.0 assurait une compatibilité bogue-à-bogue avec le code
des sockets raw de BSD lorsque l'attribut
SO_BSDCOMPAT était
utilisé. Ceci a été supprimé dans 2.2.
NOTES¶
Par défaut, les sockets brutes utilisent la détection du MTU
(« Maximum Transmission Unit ») pour le chemin. Cela
signifie que le noyau garde en mémoire le MTU vers une adresse IP cible
spécifique, et renvoie
EMSGSIZE lorsqu'un paquet brut dépasse
cette taille. Dans ce cas, l'application doit diminuer la taille du paquet. La
détection du MTU par chemin peut aussi être désactivée 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
détails. Lorsque cette option est désactivée, les sockets
brutes fragmenteront les paquets sortants qui dépassent le MTU de
l'interface. Ceci est cependant découragé, pour des raisons de
performance et de fiabilité.
Une socket raw peut être attachée à une adresse locale
spécifique en utilisant l'appel
bind(2). Si elle n'est pas
attachée, tous les paquets du protocole IP spécifié sont
reçus. De plus, une socket raw peut être attachée à un
périphérique réseau particulier avec
SO_BINDTODEVICE ; consultez
socket(7).
Une socket
IPPROTO_RAW ne fonctionne qu'en émission. Si vous
désirez vraiment recevoir tous les paquets IP, utilisez une socket
packet(7) avec le protocole
ETH_P_IP. Notez que les sockets
packet ne réassemblent pas les fragments IP contrairement aux sockets
raw.
Si vous voulez recevoir tous les paquets ICMP pour une socket datagramme, il est
souvent préférable d'utiliser
IP_RECVERR sur cette socket
particulière, consultez
ip(7).
Les sockets raw peuvent capturer tous les protocoles IP sous Linux, même
les protocoles comme ICMP ou TCP qui ont un module dans le noyau. Dans ce cas,
le paquet est passé simultanément au module du noyau et à la
socket raw. Ce comportement n'est pas portable, de nombreuses autres
implémentations des sockets BSD ont des limitations ici.
Linux ne modifie jamais les en-têtes fournis par l'utilisateur (sauf pour
remplir les champs ne contenant que des zéros comme cela est décrit
pour
IP_HDRINCL). Ceci diffère de nombreuses autres
implémentations des sockets raw.
Les sockets raw sont en général peu portables et devrait être
évitées dans les programmes destinés à être
portables.
L'émission sur les sockets raw devrait employer le protocole dans
sin_port ; ceci a été perdu dans Linux 2.2. Un
remède est d'utiliser
IP_HDRINCL.
BOGUES¶
Les extensions de Proxy transparent ne sont pas décrites.
Lorsque l'option
IP_HDRINCL est active, les datagrammes ne seront pas
fragmentés et sont limités au MTU de l'interface.
Utiliser en émission le protocole IP indiqué dans
sin_port a
été supprimé dans Linux 2.2. On utilise toujours le
protocole auquel la socket a été attachée avec
bind(2)
ou celui de l'appel
socket(2) initial.
VOIR AUSSI¶
recvmsg(2),
sendmsg(2),
capabilities(7),
ip(7),
socket(7).
RFC 1191 pour la recherche du MTU du chemin.
RFC 791 et
le fichier d'en-tête
<linux/ip.h> pour le protocole IP.
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
<
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et
l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande «
man -L C
<section> <page_de_man> ».