ip(7) Miscellaneous Information Manual ip(7) NOM ip - Implementation Linux du protocole IPv4 SYNOPSIS #include #include #include /* Surensemble des precedents */ tcp_socket = socket(AF_INET, SOCK_STREAM, 0); udp_socket = socket(AF_INET, SOCK_DGRAM, 0); raw_socket = socket(AF_INET, SOCK_RAW, protocole); DESCRIPTION Linux implemente le protocole Internet (IP) version 4 decrit dans les RFC 791 et RFC 1122. ip contient une implementation de la diffusion multiple niveau 2 conforme a la RFC 1112. Cette implementation inclut un routeur IP comprenant un filtre de paquets. L'interface de programmation est compatible avec les sockets BSD. Pour plus d'informations sur les sockets, consultez socket(7). Un socket IP est cree en utilisant socket(2) : socket(AF_INET, socket_type, protocol); Les sockets autorises incluent SOCK_STREAM pour ouvrir un socket flux, SOCK_DGRAM pour ouvrir un socket datagramme et SOCK_RAW pour ouvrir un socket raw(7) pour acceder directement au protocole IP. protocole est le protocole IP dans les en-tetes IP recus ou envoyes. Les valeurs autorisees pour protocole incluent : - 0 et IPPROTO_TCP pour les sockets flux tcp(7) ; - 0 et IPPROTO_UDP pour les sockets datagramme udp(7) ; - IPPROTO_SCTP pour les sockets flux sctp(7) ; - IPPROTO_UDPLITE pour les sockets datagramme udplite(7). Pour SOCK_RAW un protocole IP IANA autorise, defini dans les numeros assignes de la RFC 1700, peut etre indique. Lorsqu'un processus veut recevoir de nouveaux paquets entrants ou des connexions, il doit attacher un socket a une adresse d'interface locale en utilisant bind(2). Un seul socket IP peut etre attache a une paire (adresse, port) locale donnee. Lorsque INADDR_ANY est indique au moment de l'attachement, le socket sera affecte a toutes les interfaces locales. Si listen(2) est appelee sur un socket non affecte, celui-ci est automatiquement attache a un port libre aleatoire, avec l'adresse locale definie a INADDR_ANY. Si connect(2) est appelee sur un socket non affecte, celui-ci est automatiquement attache a un port libre aleatoire ou un port partage utilisable avec l'adresse locale definie a INADDR_ANY. L'adresse locale d'un socket TCP qui a ete attache est indisponible pendant quelques instants apres sa fermeture, a moins que l'attribut SO_REUSEADDR ait ete active. Il faut etre prudent en utilisant cet attribut, car il rend le protocole TCP moins fiable. Formats d'adresse Une adresse de socket IP est definie comme la combinaison d'une adresse IP d'interface et d'un numero de port de 16 bits. Le protocole IP de base ne fournit pas de numeros de port, ils sont implementes par les protocoles de plus haut niveau comme udp(7) et tcp(7). Sur les sockets raw, le champ sin_port contient le protocole IP. struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address */ }; /* Internet address */ struct in_addr { uint32_t s_addr; /* address in network byte order */ }; sin_family est toujours defini a AF_INET. C'est indispensable : sous Linux 2.2, la plupart des fonctions reseau renvoient EINVAL lorsque cette definition est absente. sin_port contient le numero de port, dans l'ordre des octets du reseau. Les numeros de ports inferieurs a 1024 sont dits privilegies (ou parfois reserves). Seuls les processus privilegies (sur Linux, ceux qui ont la capacite CAP_NET_BIND_SERVICE dans l'espace de noms utilisateur gouvernant son espace de noms reseau) peuvent appeler bind(2) pour ces sockets. Le protocole IPv4 brut en tant que tel n'a pas le concept de ports, ceux-ci etant seulement implementes par des protocoles de plus haut niveau comme tcp(7) et udp(7). sin_addr est l'adresse IP de l'hote. Le membre s_addr de la structure in_addr contient l'adresse de l'interface de l'hote, dans l'ordre des octets du reseau. in_addr devrait recevoir l'une des valeurs INADDR_* (par exemple, INADDR_LOOPBACK) en utilisant htonl(3) ou etre defini a l'aide des fonctions de bibliotheque inet_aton(3), inet_addr(3), inet_makeaddr(3) ou directement par le systeme de resolution des noms (consultez gethostbyname(3)). Les adresses IPv4 sont divisees en adresses de diffusion individuelle (unicast), de diffusion generale (broadcast) et de diffusion multiple (multicast). Les adresses de diffusion individuelle decrivent une interface unique d'un hote, les adresses de diffusion generale correspondent a tous les hotes d'un reseau et les adresses de diffusion multiple representent tous les hotes d'un groupe de diffusion multiple. Les datagrammes vers des adresses de diffusion generale ne peuvent etre emis et recus que si l'attribut de socket SO_BROADCAST est active. Dans l'implementation actuelle, les sockets orientes connexion ne sont autorises que sur des adresses de diffusion individuelle. Remarquez que l'adresse et le port sont toujours stockes dans l'ordre des octets du reseau. Cela signifie en particulier qu'il faut invoquer htons(3) sur le numero attribue a un port. Toutes les fonctions de manipulation d'adresses et de ports de la bibliotheque standard fonctionnent dans l'ordre des octets du reseau. Special and reserved addresses There are several special addresses: INADDR_LOOPBACK (127.0.0.1) always refers to the local host via the loopback device; INADDR_ANY (0.0.0.0) means any address for socket binding; INADDR_BROADCAST (255.255.255.255) has the same effect on bind(2) as INADDR_ANY for historical reasons. A packet addressed to INADDR_BROADCAST through a socket which has SO_BROADCAST set will be broadcast to all hosts on the local network segment, as long as the link is broadcast-capable. Highest-numbered address Lowest-numbered address On any locally-attached non-point-to-point IP subnet with a link type that supports broadcasts, the highest-numbered address (e.g., the .255 address on a subnet with netmask 255.255.255.0) is designated as a broadcast address. It cannot usefully be assigned to an individual interface, and can only be addressed with a socket on which the SO_BROADCAST option has been set. Internet standards have historically also reserved the lowest-numbered address (e.g., the .0 address on a subnet with netmask 255.255.255.0) for broadcast, though they call it "obsolete" for this purpose. (Some sources also refer to this as the "network address.") Since Linux 5.14, it is treated as an ordinary unicast address and can be assigned to an interface. Internet standards have traditionally also reserved various addresses for particular uses, though Linux no longer treats some of these specially. [0.0.0.1, 0.255.255.255] [240.0.0.0, 255.255.255.254] Addresses in these ranges (0/8 and 240/4) are reserved globally. Since Linux 5.3 and Linux 2.6.25, respectively, the 0/8 and 240/4 addresses, other than INADDR_ANY and INADDR_BROADCAST, are treated as ordinary unicast addresses. Systems that follow the traditional behaviors may not interoperate with these historically reserved addresses. [127.0.0.1, 127.255.255.254] Addresses in this range (127/8) are treated as loopback addresses akin to the standardized local loopback address INADDR_LOOPBACK (127.0.0.1); [224.0.0.0, 239.255.255.255] Addresses in this range (224/4) are dedicated to multicast use. Options de socket IP gere quelques options de sockets specifiques au protocole qui peuvent etre definies avec setsockopt(2) et consultees avec getsockopt(2). Le niveau d'option de sockets pour IP est IPPROTO_IP. Un attribut entier booleen est faux quand il vaut zero et vrai sinon. Quand une option non autorisee de socket est specifiee, getsockopt(2) et setsockopt(2) echouent avec l'erreur ENOPROTOOPT. IP_ADD_MEMBERSHIP (depuis Linux 1.2) Rejoindre un groupe de diffusion multiple. L'argument est une structure ip_mreqn. struct ip_mreqn { struct in_addr imr_multiaddr; /* Adresse IP du groupe de diffusion multiple */ struct in_addr imr_address; /* Adresse IP de l'interface locale */ int imr_ifindex; /* Numero d'interface */ }; imr_multiaddr contient l'adresse du groupe de diffusion multiple que l'application veut rejoindre ou quitter. Il doit s'agir d'une adresse de diffusion multiple valable (sinon setsockopt(2) echoue avec l'erreur EINVAL). imr_address est l'adresse de l'interface locale avec laquelle le systeme doit joindre le groupe de diffusion multiple. Si elle est egale a INADDR_ANY, une interface appropriee est choisie par le systeme. imr_ifindex est le numero de l'interface qui doit rejoindre ou quitter le groupe imr_multiaddr, ou zero pour indiquer n'importe quelle interface. La structure ip_mreqn n'est disponible que depuis Linux 2.2. Pour la compatibilite, l'ancienne structure ip_mreq (presente depuis Linux 1.2) est encore geree. Elle ne differe de ip_mreqn que par l'absence du champ imr_ifindex. Le noyau determine quelle structure est passee en se basant sur la taille passee a optlen. IP_ADD_MEMBERSHIP est autorise seulement pour setsockopt(2). IP_ADD_SOURCE_MEMBERSHIP (since Linux 2.4.22 / Linux 2.5.68) Rejoindre un groupe de diffusion multiple et autoriser la reception de donnees uniquement depuis une source indiquee. L'argument est une structure ip_mreq_source. struct ip_mreq_source { struct in_addr imr_multiaddr; /* Adresse IP du groupe de diffusion multiple */ struct in_addr imr_interface; /* Adresse IP de l'interface locale */ struct in_addr imr_sourceaddr; /* Adresse IP de la source de diffusion multiple */ }; La structure ip_mreq_source est similaire a ip_mreqn decrite sous IP_ADD_MEMBERSIP. Le champ imr_multiaddr contient l'adresse du groupe de diffusion multiple que l'application veut rejoindre ou quitter. Le champ imr_interface est l'adresse de l'interface locale avec laquelle le systeme doit rejoindre le groupe de diffusion multiple. Le champ imr_sourceaddr contient l'adresse de la source depuis laquelle l'application veut recevoir des donnees. Cette option peut etre utilisee plusieurs fois pour autoriser la reception depuis plusieurs sources. IP_BIND_ADDRESS_NO_PORT (depuis Linux 4.2) Informer le noyau de ne pas reserver un port ephemere lors de l'utilisation de bind(2) avec un numero de port egal a zero. Le port sera choisi plus tard automatiquement au moment de connect(2) de facon a permettre de partager un port source aussi longtemps que le quadruplet est unique. IP_BLOCK_SOURCE (depuis Linux 2.4.22 et 2.5.68) Bloquer la reception de donnees en diffusion multiple depuis une source specifique pour un groupe donne. Cela n'est possible qu'apres que l'application s'est abonnee au groupe de diffusion multiple en utilisant IP_ADD_MEMBERSHIP ou IP_ADD_SOURCE_MEMBERSHIP. L'argument est une structure ip_mreq_source comme decrite pour IP_ADD_SOURCE_MEMBERSHIP. IP_DROP_MEMBERSHIP (depuis Linux 1.2) Quitter un groupe de diffusion multiple. L'argument est une structure ip_mreqn ou ip_mreq similaire a IP_ADD_MEMBERSHIP. IP_DROP_SOURCE_MEMBERSHIP (since Linux 2.4.22 et 2.5.68) Leave a source-specific group--that is, stop receiving data from a given multicast group that come from a given source. If the application has subscribed to multiple sources within the same group, data from the remaining sources will still be delivered. To stop receiving data from all sources at once, use IP_DROP_MEMBERSHIP. L'argument est une structure ip_mreq_source comme decrite pour IP_ADD_SOURCE_MEMBERSHIP. IP_FREEBIND (depuis Linux 2.4) Si cette option est activee, cet attribut booleen permet l'attachement a une adresse IP non locale ou qui n'existe pas (encore). Cela permet d'ecouter sur un socket, sans que l'interface reseau sous-jacente ou l'adresse IP dynamique indiquee ne soit operationnelle au moment ou l'application essaie de s'y attacher. Cette option est l'equivalent specifique au socket de l'interface ip_nonlocal_bind de /proc decrite plus bas. IP_HDRINCL (depuis Linux 2.0) Si cette option est activee, l'utilisateur fournit un en-tete IP avant les donnees utilisateur. Cette option n'est valable que pour les sockets SOCK_RAW. Consultez raw(7) pour plus de details. Lorsque cet attribut est active, les valeurs definies pour IP_OPTIONS, IP_TTL et IP_TOS sont ignorees. IP_LOCAL_PORT_RANGE (since Linux 6.3) Set or get the per-socket default local port range. This option can be used to clamp down the global local port range, defined by the ip_local_port_range /proc interface described below, for a given socket. The option takes an uint32_t value with the high 16 bits set to the upper range bound, and the low 16 bits set to the lower range bound. Range bounds are inclusive. The 16-bit values should be in host byte order. The lower bound has to be less than the upper bound when both bounds are not zero. Otherwise, setting the option fails with EINVAL. If either bound is outside of the global local port range, or is zero, then that bound has no effect. To reset the setting, pass zero as both the upper and the lower bound. IP_MSFILTER (depuis Linux 2.4.22 et 2.5.68) Cette option permet d'acceder a l'API de filtrage d'etats avancee. L'argument est une structure ip_msfilter. struct ip_msfilter { struct in_addr imsf_multiaddr; /* IP multicast group address */ struct in_addr imsf_interface; /* IP address of local interface */ uint32_t imsf_fmode; /* Filter-mode */ uint32_t imsf_numsrc; /* Number of sources in the following array */ struct in_addr imsf_slist[1]; /* Array of source addresses */ }; Les deux macros MCAST_INCLUDE et MCAST_EXCLUDE permettent d'identifier le mode de filtrage. De plus, la macro IP_MSFILTER_SIZE(n) permet de determiner la quantite de memoire necessaire pour stocker une structure ip_msfilter contenant n sources. Pour une description complete du filtrage des sources de diffusion multiple, consultez la RFC 3376. IP_MTU (depuis Linux 2.2) Recuperer la MTU du chemin actuellement determinee pour le socket. Renvoi d'un entier. IP_MTU est valable seulement pour getsockopt(2) et peut etre seulement employe quand le socket est connecte. IP_MTU_DISCOVER (depuis Linux 2.2) Definir ou recuperer la definition de decouverte de MTU de chemin (Path MTU discovery -- PMTUd) pour un socket. Lorsqu'elle est activee, Linux effectuera la decouverte de la MTU d'un chemin conformement a la RFC 1191 sur les sockets SOCK_STREAM. Pour les sockets autres que SOCK_STREAM, IP_PMTUDISC_DO force l'activation de l'attribut interdisant la fragmentation sur tous les paquets sortants (bit DF -- Don't Fragment). L'utilisateur est responsable de l'empaquetage des donnees dans des blocs inferieurs a la MTU et doit assurer la retransmission si besoin. Le noyau rejettera (avec l'erreur EMSGSIZE) les datagrammes qui sont plus gros que la MTU du chemin determinee. IP_PMTUDISC_WANT fragmentera un datagramme si necessaire d'apres la MTU du chemin, ou sinon activera l'attribut interdisant la fragmentation. Les valeurs par defaut du systeme peuvent etre basculees entre IP_PMTUDISC_WANT et IP_PMTUDISC_DONT en ecrivant (respectivement la valeur zero et une valeur differente de zero) dans le fichier /proc/sys/net/ipv4/ip_no_pmtu_disc. Valeur de decouverte de MTU de chemin Signification IP_PMTUDISC_WANT Utiliser une configuration par route IP_PMTUDISC_DONT Aucune decouverte de MTU de chemin IP_PMTUDISC_DO Toujours decouvrir la MTU de chemin IP_PMTUDISC_PROBE Activer DF mais ignorer la MTU de chemin Lorsque la decouverte de la MTU de chemin est activee, le noyau garde automatiquement une trace des MTU de chemin par hote de destination. Lorsqu'il est connecte a un correspondant specifique avec connect(2), la MTU du chemin actuel determinee peut etre consultee en utilisant l'option IP_MTU du socket (par exemple, si une erreur EMSGSIZE se produit). La MTU de chemin peut changer au cours du temps. Pour les sockets sans connexion avec plusieurs destinations, la nouvelle MTU pour une destination donnee peut egalement etre obtenue en utilisant la file d'erreurs (consultez IP_RECVERR). Une nouvelle erreur sera mise en file d'attente pour chaque mise a jour de la MTU. Durant la recherche de la MTU, les paquets initiaux des sockets datagramme peuvent etre perdus. Les applications utilisant UDP doivent en etre informees et ne pas en tenir compte dans leur strategie de retransmission de paquet. Pour demarrer le processus de recherche de la MTU du chemin sur les sockets non connectes, il est possible de demarrer avec une grande taille de datagramme (jusqu'a 64 ko d'en-tete) et la diminuer au fur et a mesure des mises a jours de la MTU du chemin. Afin d'obtenir une estimation initiale de la MTU du chemin, il faut connecter un socket datagramme a l'adresse de destination en utilisant connect(2) et consulter la MTU en appelant getsockopt(2) avec l'option IP_MTU. Il est possible d'implementer la RFC 4821 pour les recherches de MTU avec des sockets SOCK_DGRAM ou SOCK_RAW en utilisant la valeur IP_PMTUDISC_PROBE (disponible depuis Linux 2.6.22). C'est aussi particulierement utile pour les outils de diagnostic comme tracepath(8) qui veulent deliberement envoyer des paquets sonde plus larges que la MTU observee du chemin. IP_MULTICAST_ALL (depuis Linux 2.6.31) This option can be used to modify the delivery policy of multicast messages. The argument is a boolean integer (defaults to 1). If set to 1, the socket will receive messages from all the groups that have been joined globally on the whole system. Otherwise, it will deliver messages only from the groups that have been explicitly joined (for example via the IP_ADD_MEMBERSHIP option) on this particular socket. IP_MULTICAST_IF (depuis Linux 1.2) Regler le peripherique local pour un socket de diffusion multiple. L'argument pour setsockopt(2) est une structure ip_mreqn ou (depuis Linux 3.5) ip_mreq similaire a IP_ADD_MEMBERSHIP, ou une structure in_addr. Le noyau determine quelle structure est passee en se basant sur la taille passee dans optlen. Pour getsockopt(2), l'argument est une structure in_addr. IP_MULTICAST_LOOP (depuis Linux 1.2) Definir ou lire un entier booleen indiquant si les paquets de diffusion multiple doivent etre renvoyes aux sockets locaux. IP_MULTICAST_TTL (depuis Linux 1.2) Definir ou lire la valeur du champ Time-to-Live des paquets de diffusion multiple sortants sur ce socket. Il est tres important pour les paquets de diffusion multiple de definir ce champ le plus petit possible. La valeur par defaut est 1, ce qui signifie que les paquets de diffusion multiple ne quittent pas le reseau local a moins que le programme de l'utilisateur ne le reclame explicitement. L'argument est un entier. IP_NODEFRAG (depuis Linux 2.6.36) Si active (argument different de zero), le reassemblage des paquets sortants est desactive dans la couche netfilter. L'argument est un entier. Cette option est valable seulement pour les sockets SOCK_RAW. IP_OPTIONS (depuis Linux 2.0) Definir ou lire les options IP a envoyer avec chaque paquet de ce socket. Les arguments sont un pointeur sur un tampon memoire contenant les options et la longueur des options. L'appel a setsockopt(2) definit les options IP associees a un socket. La taille maximale des options pour IPv4 vaut 40 octets. Consultez la RFC 791 pour les options autorisees. Lorsque le paquet de requete de connexion initiale d'un socket SOCK_STREAM contient des options IP, celles-ci seront automatiquement reglees aux options du paquet initial avec les en-tetes de routage inverses. Les paquets entrants ne peuvent pas modifier les options apres que la connexion a ete etablie. Le traitement des options de routage des paquets entrants est desactive par defaut et peut etre active en utilisant l'interface accept_source_route de /proc. Les autres options, comme les horodatages, sont toujours traitees. Pour les sockets datagramme, les options IP ne peuvent etre definies que par l'utilisateur local. L'appel de getsockopt(2) avec IP_OPTIONS remplit le tampon fourni avec les options IP actuelles. IP_PASSSEC (depuis Linux 2.6.17) Si Labeled IPsec ou si NetLabel est configure sur les hotes emetteur et recepteur, cette option autorise la reception du contexte de securite du socket pair dans un message de service de type SCM_SECURITY recupere en utilisant recvmsg(2). Cette option est uniquement geree pour les sockets UDP. Pour les sockets TCP ou SCTP, consultez la description de l'option SO_PEERSEC ci-dessous. La valeur donnee comme argument pour setsockopt(2) et renvoyee comme resultat de getsockopt(2) est un indicateur booleen entier. Le contexte de securite renvoye dans le message de service SCM_SECURITY est du meme format que celui decrit dans l'option SO_PEERSEC ci-dessous. Remarque : la reutilisation du type SCM_SECURITY de message pour l'option de socket IP_PASSSEC etait probablement une erreur, puisque d'autres messages de controle IP utilisent leur propre schema de numerotation dans l'espace de noms IP et utilisent la valeur d'option de socket comme type de message. Il n'y a pas de conflit actuellement puisque l'option IP avec la meme valeur que SCM_SECURITY est IP_HDRINCL et cela n'est jamais utilise pour un type de message de controle. IP_PKTINFO (depuis Linux 2.2) Fournir un message IP_PKTINFO de service qui contient une structure pktinfo fournissant quelques informations sur le paquet entrant. Cela ne fonctionne que pour les sockets orientes datagramme. L'argument est un attribut indiquant au socket si le message IP_PKTINFO doit etre passe ou non. Le message lui-meme ne peut etre ecrit ou lu que comme message de controle avec un paquet en utilisant recvmsg(2) ou sendmsg(2). struct in_pktinfo { unsigned int ipi_ifindex; /* Numero d'interface */ struct in_addr ipi_spec_dst; /* Adresse locale */ struct in_addr ipi_addr; /* Adresse de destination dans l'en-tete*/ }; ipi_ifindex est le numero unique de l'interface sur laquelle le paquet a ete recu. ipi_spec_dst est l'adresse locale du paquet et ipi_addr est l'adresse de destination dans l'en-tete du paquet. Si IP_PKTINFO est passe a sendmsg(2) et ipi_spec_dst est different de zero, alors il sera utilise comme adresse source pour la recherche dans la table de routage et pour definir les options de routage IP. Si ipi_ifindex est different de zero, l'adresse locale principale de l'interface indiquee par ce numero remplace ipi_spec_dst pour la recherche dans la table de routage. IP_RECVERR (depuis Linux 2.2) Activer le passage ameliore des messages d'erreur. Lorsque cette option est activee pour un socket datagramme, toutes les erreurs generees seront envoyees dans une file d'erreurs propre au socket. Quand l'utilisateur detecte une erreur d'operation sur le socket, celle-ci peut etre examinee en invoquant recvmsg(2) avec l'attribut MSG_ERRQUEUE defini. La structure sock_extended_err decrivant l'erreur sera passee comme message de service ayant le type IP_RECVERR et le niveau IPPROTO_IP. Cela permet une gestion d'erreur fiable sur les sockets non connectes. La partie comprenant les donnees recues de la file d'erreurs contient le paquet ayant rencontre un probleme. Le message de controle IP_RECVERR contient une structure sock_extended_err : #define SO_EE_ORIGIN_NONE 0 #define SO_EE_ORIGIN_LOCAL 1 #define SO_EE_ORIGIN_ICMP 2 #define SO_EE_ORIGIN_ICMP6 3 struct sock_extended_err { uint32_t ee_errno; /* error number */ uint8_t ee_origin; /* where the error originated */ uint8_t ee_type; /* type */ uint8_t ee_code; /* code */ uint8_t ee_pad; uint32_t ee_info; /* additional information */ uint32_t ee_data; /* other data */ /* More data may follow */ }; struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *); ee_errno contient le numero de l'erreur errno mise en file d'attente. ee_origin est le code de l'origine de l'erreur. Les autres champs sont specifiques au protocole. La macro SO_EE_OFFENDER renvoie un pointeur sur l'adresse d'un objet reseau d'ou l'erreur provient en prenant en argument un pointeur sur le message de service. Si cette adresse n'est pas connue, le membre sa_family de la structure sockaddr contient AF_UNSPEC et les autres champs de sockaddr ne sont pas definis. IP utilise la structure sock_extended_err comme suit : ee_origin contient SO_EE_ORIGIN_ICMP pour les erreurs recues sous forme de paquet ICMP ou SO_EE_ORIGIN_LOCAL pour les erreurs locales. Les valeurs inconnues doivent etre ignorees. ee_type et ee_code sont definis a partir des champs type et code de l'en-tete ICMP. ee_info contient la MTU determinee pour les erreurs EMSGSIZE. Le message contient aussi l'adresse sockaddr_in du noeud ayant cause l'erreur, qui peut etre obtenu avec la macro SO_EE_OFFENDER. Le champ sin_family de l'adresse fournie par SO_EE_OFFENDER vaut AF_UNSPEC si la source etait inconnue. Lorsque les erreurs proviennent du reseau, toutes les options IP (IP_OPTIONS, IP_TTL, etc.) valables pour le socket et contenues dans le paquet d'erreur sont transmises comme messages de controle. La charge utile du paquet causant l'erreur est renvoyee comme charge normale. TCP n'a pas de file d'erreurs et MSG_ERRQUEUE n'est pas permis sur les sockets SOCK_STREAM. IP_RECVERR est valable pour TCP, mais toutes les erreurs sont renvoyees par des fonctions de socket ou seulement SO_ERROR. Pour les sockets raw, IP_RECVERR active le passage de toutes les erreurs ICMP recues a l'application, sinon les erreurs sont seulement renvoyees sur les sockets connectes. Il definit ou recupere un attribut booleen entier. IP_RECVERR est desactivee par defaut. IP_RECVOPTS (depuis Linux 2.2) Passer a l'utilisateur toutes les options IP entrantes dans un message de controle IP_OPTIONS. L'en-tete de routage et les autres options sont deja remplies pour l'hote local. Cela n'est pas gere pour les sockets SOCK_STREAM. IP_RECVORIGDSTADDR (depuis Linux 2.6.29) Cet attribut booleen active le message IP_ORIGDSTADDR de service dans recvmsg(2), dans lequel le noyau renvoie l'adresse de destination originelle du datagramme en train d'etre recu. Le message de service contient une structure sockaddr_in. IP_RECVTOS (depuis Linux 2.2) Le message de service IP_TOS est passe avec les paquets entrants si cette option est activee. Il contient un octet qui decrit le champ Type-Of-Service/Precedence de l'en-tete du paquet. Il s'agit d'un attribut entier booleen. IP_RECVTTL (depuis Linux 2.2) Lorsque cet attribut est defini, passer un message de controle IP_TTL avec le champ Time-to-Live du paquet recu, sous forme d'entier 32 bits. Cela n'est pas gere pour les sockets SOCK_STREAM. IP_RETOPTS (depuis Linux 2.2) Identique a IP_RECVOPTS, mais renvoyer les options raw non traitees, avec les options d'enregistrement des horodatages et du routage non remplies pour ce pas (hop). IP_ROUTER_ALERT (depuis Linux 2.2) Passer tous les paquets a transferer avec l'option IP Router Alert activee sur ce socket. Ce n'est valable que pour les sockets raw et sert par exemple pour les demons RSVP de l'espace utilisateur. Les paquets enregistres ne sont pas rediriges par le noyau, l'utilisateur est responsable de leur reacheminement. La liaison du socket est ignoree et de tels paquets ne sont filtres que par le protocole. L'attribut est un entier. IP_TOS (depuis Linux 1.0) Definir ou recuperer le champ Type-Of-Service (TOS) envoye avec chaque paquet IP sortant de ce socket. Cela sert a gerer sur le reseau les priorites entre paquets. TOS est un octet. Quelques attributs TOS standards sont definis : IPTOS_LOWDELAY pour minimiser les delais pour le trafic interactif, IPTOS_THROUGHPUT pour optimiser le debit, IPTOS_RELIABILITY pour optimiser la fiabilite, IPTOS_MINCOST qui doit etre utilise pour les donnees de remplissage ou la lenteur de transmission importe peu. Une au maximum de ces valeurs TOS peut etre indiquee. Les autres bits ne sont pas valables et doivent etre effaces. Linux envoie d'abord des datagrammes IPTOS_LOWDELAY par defaut, mais le comportement exact depend de la politique configuree pour la file d'attente. Quelques niveaux de haute priorite peuvent reclamer les privileges du superutilisateur (la capacite CAP_NET_ADMIN). IP_TRANSPARENT (depuis Linux 2.6.24) Cet attribut booleen active le mandataire transparent sur ce socket. Cette option de socket permet a l'application appelante de s'attacher a une adresse IP non locale et de fonctionner a la fois comme un client et un serveur avec l'adresse exterieure comme point de terminaison local. Remarque : le routage doit etre configure pour que les paquets envoyes vers l'adresse exterieure soient routes a travers la boite TProxy (c'est-a-dire le systeme hebergeant l'application utilisant l'option de socket IP_TRANSPARENT). Les privileges du superutilisateur sont necessaires pour l'activation de cette option de socket (la capacite CAP_NET_ADMIN). Cette option doit egalement etre configuree sur le socket redirige pour la redirection TProxy avec la cible iptables TPROXY. IP_TTL (depuis Linux 1.0) Definir ou recuperer le contenu actuel du champ Time-to-Live utilise avec chaque paquet envoye depuis ce socket. IP_UNBLOCK_SOURCE (depuis Linux 2.4.22 et 2.5.68) Debloquer une source de diffusion multiple precedemment bloquee. Renvoi de EADDRNOTAVAIL si la source indiquee n'etait pas bloquee. L'argument est une structure ip_mreq_source comme decrite pour IP_ADD_SOURCE_MEMBERSHIP. SO_PEERSEC (depuis Linux 2.6.17) Si Labeled IPsec ou si NetLabel est configure sur les hotes emetteur et recepteur, cette option de socket en lecture seule autorise la reception du contexte de securite du socket pair connecte a ce socket. Par defaut, cela sera le meme contexte que celui du processus qui a cree le socket pair a moins qu'il soit outrepasse par la politique ou par un processus ayant les permissions requises. L'argument de getsockopt(2) est un pointeur vers un tampon de la longueur indiquee en octets dans lequel la chaine de contexte de securite sera copiee. Si la taille du tampon est inferieure a celle de la chaine du contexte de securite, alors getsockopt(2) renvoie -1, definit errno a ERANGE et renvoie la taille requise a l'aide de optlen. L'appelant doit allouer initialement au moins NAME_MAX octets pour le tampon, bien que cela ne soit pas garanti d'etre suffisant. Redimensionner le tampon a la taille renvoyee et reessayer peuvent etre necessaires. La chaine de contexte de securite peut inclure un octet NULL final dans la taille renvoyee, mais il n'est pas garanti que ce soit fait : un contexte de securite << abc >> peut etre represente soit par {'a','b','c'} de taille 3, ou {'a','b','c','\0'} de taille 4, qui sont consideres comme interchangeables. La chaine peut etre affichee, mais ne contient pas d'octet NULL final, et elle est dans un encodage non precise (en particulier, il n'est pas garanti que ce soit ASCII ou UTF-8). L'utilisation de cette option pour les sockets de la famille d'adresses AF_INET est prise en charge depuis Linux 2.6.17 pour les sockets TCP et depuis Linux 4.17 pour les sockets SCTP. Pour SELinux, NetLabel transmet uniquement la portion MLS du contexte de securite du pair sur le reseau, laissant par defaut le reste du contexte de securite aux valeurs definies dans la politique pour l'identifiant de securite initial netmsg (SID). Cependant, NetLabel peut etre configure pour passer les contextes de securite en entier sur la boucle locale. Labeled IPSEC passe toujours les contextes de securite comme partie de l'association de securite (security association -- SA) et les recherche en se basant sur l'association de chaque paquet. /proc interfaces Le protocole IP prend en charge une serie d'interfaces /proc pour configurer certaines options globales. Les parametres peuvent etre accedes en lisant ou ecrivant dans les fichiers du repertoire /proc/sys/net/ipv4/. Les interfaces decrites comme des booleens prennent une valeur entiere. Celle-ci signifie que l'option correspondante est activee si elle est differente de zero (<< true >>) et desactivee si elle vaut zero (<< false >>). ip_always_defrag (booleen ; depuis Linux 2.2.13) [New with Linux 2.2.13; in earlier kernel versions this feature was controlled at compile time by the CONFIG_IP_ALWAYS_DEFRAG option; this option is not present in Linux 2.4.x and later] Lorsque cet attribut booleen est active (different de zero), les fragments entrants (morceaux de paquets IP obtenus quand un hote entre l'origine et la destination a decide que les paquets etaient trop grands et les a coupes en morceaux) seront reassembles (defragmentes) avant d'etre traites, meme s'ils doivent etre transferes. Cette option n'est a utiliser que pour un pare-feu qui est le seul lien d'entree du reseau ou pour un mandataire transparent. Il ne faut jamais l'utiliser pour un routeur ou un hote normal. Sinon, les communications fragmentees peuvent etre perturbees si les fragments circulent dans des liaisons differentes. La defragmentation a egalement un cout memoire et processeur important. C'est automatiquement active lorsque le camouflage des connexions (masquerading) ou le mandataire transparent sont configures. ip_autoconfig (since Linux 2.2 to Linux 2.6.17) Non documente. ip_default_ttl (entier ; defaut : 64 ; depuis Linux 2.2) Definir la valeur par defaut du champ Time-to-Live des paquets sortants. Cela peut etre modifie individuellement pour chaque socket avec l'option IP_TTL. ip_dynaddr (booleen ; desactive par defaut ; depuis Linux 2.0.31) Activer la reecriture dynamique des adresses de socket et du masquerading lors du changement d'adresse d'interface. Cela sert pour les liaisons telephoniques avec des adresses IP changeantes. 0 signifie aucune reecriture, 1 les autorise et 2 demande un mode bavard. ip_forward (booleen ; desactive par defaut) ; depuis Linux 1.2 Activer le transfert d'IP avec un attribut booleen. Le transfert d'IP peut aussi etre configure interface par interface. ip_local_port_range (depuis Linux 2.2) This file contains two integers that define the default local port range allocated to sockets that are not explicitly bound to a port number--that is, the range used for ephemeral ports. An ephemeral port is allocated to a socket in the following circumstances: - le numero de port dans une adresse de socket est defini a 0 en appelant bind(2) ; - listen(2) est appele sur un socket de flux qui n'etait pas attache auparavant ; - connect(2) a ete appelee sur un socket qui n'etait pas attache auparavant ; - sendto(2) est appelee sur un socket datagramme qui n'etait pas attache auparavant. L'allocation de ports ephemeres commence avec le premier numero de ip_local_port_range et se termine avec le second. Si l'intervalle de ports ephemeres est epuise, alors l'appel systeme associe renvoie une erreur (mais consultez BOGUES). Remarquez que l'intervalle de ports dans ip_local_port_range ne devrait pas entrer en conflit avec les ports utilises pour le masquerading (bien que cela soit traite). De meme, des choix arbitraires peuvent poser des problemes avec certains filtrages de pare-feu qui font des suppositions sur les ports locaux utilises. Le premier nombre doit etre au moins superieur a 1024 et, de preference, a 4096 pour eviter les collisions avec les ports officiels et minimiser les problemes de pare-feu. ip_no_pmtu_disc (booleen ; desactive par defaut) ; depuis Linux 2.2 Si active, supprimer la decouverte par defaut des MTU des chemins pour les sockets TCP. La decouverte de la MTU d'un chemin peut echouer avec des pare-feu mal configures (qui rejettent tous les paquets ICMP) ou des interfaces mal configurees (par exemple, une liaison point-a-point ou les deux extremites n'ont pas la meme MTU). Il vaut mieux corriger le routeur defectueux que supprimer globalement la decouverte des MTU des chemins, car cette derniere option entraine un cout eleve pour le reseau. ip_nonlocal_bind (booleen ; desactive par defaut ; depuis Linux 2.4) Si defini, permettre aux processus de s'attacher avec bind(2) a des adresses IP non locales, ce qui peut etre utile mais peut faire planter certaines applications. ip6frag_time (entier ; defaut : 30) Definir le temps en secondes de conservation d'un fragment IPv6 en memoire. ip6frag_secret_interval (entier ; defaut : 600) Definir l'intervalle de regeneration (en secondes) du secret de hachage (ou sa duree de vie) pour les fragments IPv6. ipfrag_high_thresh (integer) ipfrag_low_thresh (integer) Si le nombre de fragments IP en attente atteint ipfrag_high_thresh, la file est restreinte a ipfrag_low_thresh. Contient un entier avec le nombre d'octets. neigh/* Consultez arp(7). Ioctls Tous les ioctls decrits dans socket(7) s'appliquent a ip. Les ioctls pour configurer les parametres generiques des peripheriques sont decrits dans netdevice(7). ERREURS EACCES L'utilisateur a essaye de realiser une operation sans avoir les permissions necessaires. Cela inclut : l'envoi d'un paquet vers une adresse de diffusion generale sans avoir active l'attribut SO_BROADCAST, l'envoi d'un paquet par une route interdite, la modification du parametrage du pare-feu sans les privileges du superutilisateur (la capacite CAP_NET_ADMIN) et l'attachement a un port privilegie sans les privileges du superutilisateur (la capacite CAP_NET_BIND_SERVICE). EADDRINUSE Tentative d'attachement a une adresse deja utilisee. EADDRNOTAVAIL Une interface inexistante a ete demandee ou l'adresse d'emission demandee n'etait pas locale. EAGAIN L'operation sur un socket non bloquant devrait bloquer. EALREADY Une connexion est deja en cours sur un socket non bloquant. ECONNABORTED Une connexion a ete fermee durant un appel a accept(2). EHOSTUNREACH Aucune table de routage valable ne correspond a l'adresse de destination. Cette erreur peut etre due a un message ICMP d'un routeur distant ou dans la table de routage interne. EINVAL Un argument non valable a ete fourni. Pour les operations d'envoi, cela peut etre cause par un envoi vers une route trou noir. EISCONN connect(2) a ete appelee sur un socket deja connecte. EMSGSIZE Un datagramme est plus grand qu'une MTU sur le chemin et ne peut pas etre fragmente. ENOBUFS ENOMEM La memoire libre est insuffisante. Cela signifie souvent que l'allocation memoire est contrainte par les limites du tampon de socket, pas par la memoire du systeme, mais ce n'est pas toujours le cas. ENOENT SIOCGSTAMP a ete appele sur un socket qu'aucun paquet n'a atteint. ENOPKG Un sous-systeme du noyau n'est pas configure. ENOPROTOOPT et EOPNOTSUPP Passage d'une option de socket non valable. ENOTCONN L'operation n'est definie que pour un socket connecte, mais ce socket n'etait pas connecte. EPERM L'utilisateur n'a pas la permission de definir une priorite haute, de changer la configuration ou d'envoyer des signaux au groupe ou au processus demande. EPIPE La connexion a ete fermee prematurement ou volontairement par l'autre extremite. ESOCKTNOSUPPORT Le socket n'est pas configure ou un type de socket inconnu a ete demande. D'autres erreurs peuvent etre declenchees par les protocoles des couches superieures. Consultez tcp(7), raw(7), udp(7) et socket(7). NOTES IP_FREEBIND, IP_MSFILTER, IP_MTU, IP_MTU_DISCOVER, IP_RECVORIGDSTADDR, IP_PASSSEC, IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT et IP_TRANSPARENT sont specifiques a Linux. Be very careful with the SO_BROADCAST option - it is not privileged in Linux. It is easy to overload the network with careless broadcasts. For new application protocols it is better to use a multicast group instead of broadcasting. Broadcasting is discouraged. See RFC 6762 for an example of a protocol (mDNS) using the more modern multicast approach to communicating with an open-ended group of hosts on the local network. Certaines autres implementations des sockets BSD fournissent les options de socket IP_RCVDSTADDR et IP_RECVIF pour obtenir l'adresse de destination et l'interface des datagrammes recus. Linux propose l'option IP_PKTINFO plus generale pour effectuer ce travail. Certaines implementations BSD des sockets fournissent egalement l'option IP_RECVTTL, mais un message de service ayant le type IP_RECVTTL est fourni avec le paquet entrant. C'est different de l'option IP_TTL utilisee sous Linux. L'utilisation du niveau des options de socket SOL_IP n'est pas portable, les piles basees sur BSD utilisent le niveau IPPROTO_IP. INADDR_ANY (0.0.0.0) and INADDR_BROADCAST (255.255.255.255) are byte-order-neutral. This means htonl(3) has no effect on them. Compatibilite Pour la compatibilite avec Linux 2.0, la syntaxe obsolete socket(AF_INET, SOCK_PACKET, protocole) est encore geree pour ouvrir un socket packet(7). Cela est deconseille et doit etre remplace par socket(AF_PACKET, SOCK_RAW, protocole). La principale difference est la nouvelle structure d'adresse sockaddr_ll pour les informations generiques de la couche de liaison a la place de l'ancienne sockaddr_pkt. BOGUES Il y a trop de valeurs d'erreurs heterogenes. L'erreur utilisee pour diagnostiquer l'epuisement de l'intervalle de ports ephemeres varie suivant les appels systemes (connect(2), bind(2), listen(2), sendto(2)) qui peuvent assigner des ports ephemeres. Les ioctls pour configurer les options d'interface specifiques a IP et les tables ARP ne sont pas decrites. Receiving the original destination address with MSG_ERRQUEUE in msg_name by recvmsg(2) does not work in some Linux 2.2 kernels. VOIR AUSSI recvmsg(2), sendmsg(2), byteorder(3), capabilities(7), icmp(7), ipv6(7), netdevice(7), netlink(7), raw(7), socket(7), tcp(7), udp(7), ip(8) Le fichier source du noyau Documentation/networking/ip-sysctl.txt. RFC 791 pour les specifications IP d'origine. RFC 1122 pour les exigences IPv4 des hotes. RFC 1812 pour les exigences IPv4 des routeurs. 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 ip(7)