ip(7) Miscellaneous Information Manual ip(7) NOMBRE ip - Implementacion del protocolo IPv4 en Linux SINOPSIS #include #include #include /* contiene a los anteriores */ tcp_socket = socket(AF_INET, SOCK_STREAM, 0); udp_socket = socket(AF_INET, SOCK_DGRAM, 0); raw_socket = socket(AF_INET, SOCK_RAW, protocolo); DESCRIPCION Linux implementa el Protocolo de Internet (Internet Protocol, IP), version 4, descrito en RFC 791 y RFC 1122. ip contiene una implementacion de multidestino del Nivel 2 segun el RFC 1112. Tambien contiene un enrutador IP incluyendo un filtro de paquetes. La interfaz del programador es compatible con la de los conectores BSD. Consulte socket(7) para mas informacion sobre conectores. Los conectores IP se generan mediante socket(2): socket(AF_INET, socket_type, protocolo); Los tipos de conector validos serian SOCK_STREAM para un conector de flujo, SOCK_DGRAM para abrir un conector de datagrama y SOCK_RAW para abrir un conector raw(7) que accede al protocolo IP directamente. protocol representa el protocolo IP en el encabezado IP que se envia o recibe. Valores validos para protocol serian: o 0 y IPPROTO_TCP para conectores de flujo tcp(7); o 0 y IPPROTO_UDP para conectores de datagrama udp(7); o IPPROTO_SCTP para conectores de flujo sctp(7); y o IPPROTO_UDPLITE para conectores de datagrama udplite(7). Para SOCK_RAW puede definir un protocolo IP valido segun el IANA tal como se define en el RFC 1700. Cuando un proceso quiere recibir nuevos paquetes de entrada o conexiones, debe enlazar un conector a una direccion de la interfaz local usando bind(2). Solo se puede ligar un conector IP a un par (direccion, puerto) dado. Cuando en la llamada a bind se especifica INADDR_ANY, el conector sera ligado a todas las interfaces locales. Cuando se llama a connect(2) con un conector no enlazado, el conector sera automaticamente ligado a un puerto aleatorio libre cuya direccion local sea INADDR_ANY. Una direccion local de conector TCP que haya sido enlazada, no estara disponible durante un cierto tiempo despues de que se cierre, a menos que se haya activado la opcion SO_REUSEADDR. Se debe tener cuidado al usar esta opcion ya que hace que TCP sea menos fiable. Formato de las direcciones Una direccion de conector IP se define como una combinacion de una direccion de interfaz IP y un numero de puerto 16-bit. El protocolo IP basico no proporciona numeros de puerto. Estos son implementados por protocolos de un nivel mas alto como udp(7) y tcp(7). En los conectores directos, a sin_port se le asigna el protocolo IP. struct sockaddr_in { sa_family_t sin_family; /* familia de direcciones: AF_INET */ in_port_t sin_port; /* puerto en el orden de bytes de la red */ struct in_addr sin_addr; /* direccion de internet */ }; /* Ireccion de internet */ struct in_addr { uint32_t s_addr; /* Direccion de red en bytes */ }; A sin_family siempre se le asigna el valor AF_INET. Este valor es necesario. En Linux 2.2, la mayoria de las funciones de red devuelven EINVAL cuando se ha omitido este valor. sin_port contiene el puerto con los bytes en orden de red. Los numeros de puerto por debajo de 1024 se llaman puertos privilegiados (algunas veces puertos reservados). Solo los procesos privilegiados o con la capacidad CAP_NET_BIND_SERVICE pueden realizar enlaces mediante bind(2) a estos conectores. Observer que el protocolo IPv4 puro no posee como tal el concepto de puerto. Estos son implementados por protocolos de capas superiores como tcp(7) y udp(7). sin_addr es la direccion IP del equipo. El miembro s_addr de struct in_addr contiene la direccion de la interfaz del equipo con los bytes en orden de red. Solo se deberia acceder a in_addr usando las funciones de biblioteca inet_aton(3), inet_addr(3) y inet_makeaddr(3), o directamente mediante el mecanismo de resolucion de nombres (vea gethostbyname(3)). Las direcciones IPv4 se dividen en direcciones unidestino, de difusion y multidestino. Las direcciones unidestino especifican una unica interfaz de un anfitrion, las direcciones de difusion especifican todos los anfitriones de una red y las direcciones multidestino identifican a todos los anfitriones de un grupo multidestino. Solo se pueden enviar datagramas a o recibir datagramas de direcciones de difusion cuando esta activa la opcion de conector SO_BROADCAST. En la implementacion actual, los conectores orientados a conexion solo pueden usar direcciones unidestino. Dese cuenta que la direccion y el puerto se almacenan siempre en orden de red. En particular, esto significa que necesita llamar a htons(3) con el numero que se ha asignado al puerto. Todas las funciones de manipulacion de direccion/puerto en la biblioteca estandar trabajan en orden de red. Direcciones especiales y reservadas Hay varias direcciones especiales: INADDR_LOOPBACK (127.0.0.1) siempre hace referencia al equipo local a traves del dispositivo loopback; INADDR_ANY (0.0.0.0) representa direccion para vinculacion de sockets; INADDR_BROADCAST (255.255.255.255) Por razones historicas, tiene el mismo efecto en bind(2) que INADDR_ANY. Un paquete dirigido a INADDR_BROADCAST a traves de un socket con SO_BROADCAST configurado se transmitira a todos los equipos en el segmento de la red local, siempre que el enlace sea apto para esta transmision. Direccion con el numero mas alto Direccion con el numero mas bajo En cualquier subred IP conectada localmente no punto a punto con un tipo de enlace que admita transmisiones, la direccion con el numero mas alto (por ejemplo, la direccion .255 en una subred con mascara de red 255.255.255.0) se designara como direccion de transmision. No es practica asignarla a una interfaz individual y solo se podra direccionar con un socket en el que se haya configurado la opcion SO_BROADCAST. Historicamente, los estandares de Internet tambien han reservado la direccion con el numero mas bajo (por ejemplo, la direccion .0 en una subred con mascara de red 255.255.255.0) para transmision, aunque suele considerarse 'obsoleta' para este proposito. Algunas fuentes tambien se refieren a esto como 'direccion de red'. A partir de la version 5.14 de Linux , se trata como una direccion de unidifusion ordinaria y se puede asignar a una interfaz. Los estandares de Internet tradicionalmente tambien han reservado varias direcciones para usos particulares, aunque Linux ya no las trata de manera especial. [0.0.0.1, 0.255.255.255] [240.0.0.0, 255.255.255.254] Las direcciones en estos intervalos (0/8 y 240/4) estan reservadas globalmente. Desde Linux 5.3 y Linux 2.6.25, respectivamente, las direcciones 0/8 y 240/4, distintas de INADDR_ANY y INADDR_BROADCAST, se tratan como direcciones de unidifusion ordinarias. Estas direcciones se consideraron siempre reservadas y, tradicionalmente, los equipos no pueden interoperar con ellas. [127.0.0.1, 127.255.255.254] Las direcciones en este intervalo (127/8) se tratan como direcciones de loopback similares a la direccion loopback local estandarizada INADDR_LOOPBACK (127.0.0.1); [224.0.0.0, 239.255.255.255] Las direcciones en este rango (224/4) estan dedicadas al uso de multidifusion. Opciones de los conectores IP soporta algunas opciones de conector especificas del protocolo que se pueden configurar con setsockopt(2) y leer con getsockopt(2). El nivel de opciones de conector para IP es IPPROTO_IP. Una opcion entera booleana es cero cuando es falsa y cualquier otra cosa cuando es cierta. Si se define una opcion no valida, getsockopt(2) y setsockopt(2) emiten el error ENOPROTOOPT. IP_ADD_MEMBERSHIP (desde Linux 1.2) Unirse a un grupo multidestino. El argumento es una estructura ip_mreqn. struct ip_mreqn { struct in_addr imr_multiaddr; /* Direccion IP del grupo multidestino */ struct in_addr imr_address; /* Direccion IP de la interfaz local */ int imr_ifindex; /* Indice de la interfaz */ }; imr_multiaddr contiene la direccion del grupo multidestino al que la aplicacion se quiere unir o quiere dejar (setsockopt(2) falla con un error EINVAL). Debe ser una direccion multidestino valida. imr_address es la direccion de la interfaz local con la que el sistema debe unirse al grupo multidestino. Si es igual a INADDR_ANY el sistema elige una interfaz adecuada. imr_ifindex es el indice de la interfaz que debe unirse a o dejar el grupo imr_multiaddr, o 0 para indicar cualquier interfaz. La estructura ip_mreqn esta disponible desde la version 2.2 de Linux. Para preservar la compatibilidad, la antigua estructura ip_mreq (existente desde la version 1.2) sigue teniendo soporte. Solo difiere de ip_mreqn en que no incluye el campo imr_ifindex. El nucleo identifica que estructura se esta empleando en base al tamano de optlen. IP_ADD_MEMBERSHIP solo es valido para setsockopt(2). IP_ADD_SOURCE_MEMBERSHIP (desde Linux 2.4.22 hasta Linux 2.5.68) Se une a un grupo multidestino permitiendo recibir datos de una unica fuente. El argumento es una estructura ip_mreq_source. struct ip_mreq_source { struct in_addr imr_multiaddr; /* Direccion IP del grupo de multidifusion struct in_addr imr_interface; /* Direccion IP de la interfaz local */ struct in_addr imr_sourceaddr; /* Direccion IP multidifusion del origen */ }; La estructura ip_mreq_source es similar a ip_mreqn descrita en IP_ADD_MEMBERSHIP. El campo imr_multiaddr contiene la direccion del grupo de multidifusion al que la aplicacion se desea unir o abandonar. El campo imr_interface es la direccion de la interfaz local con la que el sistema debe unirse al grupo de multidifusion. Finalmente, el campo imr_sourceaddr contiene la direccion de la fuente de la que la aplicacion desea recibir datos. Es posible emplear esta opcion varias veces para recibir datos de varias fuentes. IP_BIND_ADDRESS_NO_PORT (desde Linux 4.2) Indica al nucleo que no se reserve brevemente un puerto al usar bind(2) con el cero como numero de puerto. Dicho puerto se seleccionara posteriormente durante connect(2) de forma que se puede compartir un puerto origen mientras la tupla de 4 sea unica. IP_BLOCK_SOURCE (desde Linux 2.4.22 / 2.5.68) Dejar de recibir datos de multidifusion de una fuente especifica en un grupo determinado. Esto es valido solo despues de que la aplicacion se haya suscrito al grupo de multidifusion utilizando IP_ADD_MEMBERSHIP o IP_ADD_SOURCE_MEMBERSHIP. El argumento es una estructura ip_mreq_source tal como se describe en IP_ADD_MEMBERSHIP. IP_DROP_MEMBERSHIP (desde Linux 1.2) Dejar un grupo multidestino. El argumento es una estructura ip_mreqn o ip_mreq similar a la de IP_ADD_MEMBERSHIP. IP_DROP_SOURCE_MEMBERSHIP (desde Linux 2.4.22 / 2.5.68) Abandona un grupo de fuente especifica--es decir, dejar de recibir datos de un grupo de multidifusion determinado que provenga de una fuente concreta. Si la aplicacion se ha suscrito a varias fuentes dentro del mismo grupo, se seguiran entregando datos de las fuentes restantes. Para dejar de recibir datos de todas las fuentes a la vez, use IP_DROP_MEMBERSHIP. El argumento es una estructura ip_mreq_source tal como se describe en IP_ADD_MEMBERSHIP. IP_FREEBIND (desde Linux 2.4) Si esta habilitada, esta opcion booleana permite vincularse a una direccion IP no local o que (todavia) no existe. Esto permite estar a la escucha en un socket, sin necesidad de que la interfaz de red subyacente o la direccion IP dinamica especificada esten activas en el momento en que la aplicacion intenta conectarse a ella. Esta opcion es la equivalente por socket de la interfaz ip_nonlocal_bind /proc que se describe a continuacion. IP_HDRINCL (desde Linux 2.0) Cuando esta activa, el usuario proporciona una cabecera IP delante de los datos de usuario. Solo valida para conectores SOCK_RAW; vea raw(7) para mas informacion. Cuando esta opcion esta activa los valores configurados mediante IP_OPTIONS, IP_TTL y IP_TOS se ignoran. IP_LOCAL_PORT_RANGE (desde Linux 6.31) Establezca u obtenga el rango de puertos locales predeterminado por socket. Esta opcion se puede utilizar para limitar el intervalo de puertos locales globales, definido por la interfaz ip_local_port_range /proc descrita a continuacion, para un socket determinado. La opcion toma un valor uint32_t con los 16 bits superiores establecidos en el limite superior del intervalo y los 16 bits inferiores establecidos en el limite inferior. Los limites de intervalo son inclusivos. Los valores de 16 bits deben estar en orden de bytes del equipo. El limite inferior tiene que ser menor que el limite superior cuando ambos limites son distintos de cero. De lo contrario, la configuracion de la opcion falla con EINVAL. Si alguno de los limites esta fuera del intervalo de puertos locales globales o es cero, no tendra efecto. Para resetear la configuracion, defina los limites superior e inferior a cero. IP_MSFILTER (desde Linux 2.4.22 / 2.5.68) Esta opcion proporciona acceso a la API de filtrado avanzado de estado. El argumento es una estructura ip_msfilter. struct ip_msfilter { struct in_addr imsf_multiaddr; /* Direccion IP del grupo multidestino */ struct in_addr imsf_interface; /* Direccion IP de la interfaz local */ uint32_t imsf_fmode; /* Modo de filtrado */ uint32_t imsf_numsrc; /* Cantidad de fuentes en el siguiente vector */ struct in_addr imsf_slist[1]; /* Vector de direcciones de fuente */ }; Hay dos macros, MCAST_INCLUDE y MCAST_EXCLUDE, que se pueden utilizar para especificar el modo de filtrado. Ademas, la macro IP_MSFILTER_SIZE(n) existe para determinar cuanta memoria se necesita para almacenar la estructura ip_msfilter con n fuentes en la lista de fuentes. Para completa descripcion del filtrado de fuentes de multidifusion, consulte el RFC 3376. IP_MTU (desde Linux 2.2) Obtiene la MTU de la ruta conocida actualmente para el conector actual. Devuelve un entero. IP_MTU solo es valido para getsockopt(2) y solo puede emplearse cuando el conector se ha conectado. IP_MTU_DISCOVER (desde Linux 2.2) Establece o recibe la configuracion del descubrimiento de la MTU de la rutapara el conector. Cuando se activa, Linux realizara el descubrimiento de la MTU de la ruta en este conector tal y como se define en RFC 1191 para los conectores SOCK_STREAM. Para los conectores SOCK_STREAM, IP_PMTUDISC_DO fuerza la opcion de no fragmentar en todos los datagramas de salida. Es responsabilidad del usuario enpaquetar los datos en fragmentos de tamano MTU y realizar la retransmision si es necesario. El nucleo rechazara aquellos paquetes que sean mas grandes que la MTU de ruta conocida si esta opcion esta activa (con EMSGSIZE). IP_PMTUDISC_WANT fragmentara un datagrama si necesario, en base al MTU, o activara la opcion de no fragmentar. El valor predeterminado en todo el sistema se puede alternar entre IP_PMTUDISC_WANT y IP_PMTUDISC_DONT escribiendo (respectivamente, cero y distintos de cero) en el archivo /proc/sys/net/ipv4/ip_no_pmtu_disc. Opciones del descubrimiento del MTU de la ruta Significado IP_PMTUDISC_WANT Usar configuraciones por ruta. IP_PMTUDISC_DONT Nunca realizar el descubrimiento de la MTU de la ruta. IP_PMTUDISC_DO Realizar siempre el descubrimiento de la MTU de la ruta. IP_PMTUDISC_PROBE Define DF pero ignora el MTU de la ruta. Cuando se activa el descubrimiento de la MTU de la ruta, el nucleo automaticamente memoriza la MTU de la ruta por anfitrion de destino. Cuando se esta conectado a un extremo especifico mediante connect(2), se puede obtener convenientemente la MTU de la ruta conocida actualmente usando la opcion de conector IP_MTU (por ejemplo, despues de que haya ocurrido un error EMSGSIZE). La MTU puede cambiar con el tiempo. Para conectores no orientados a conexion con muchos destinos, tambien se puede acceder a la nueva MTU usando la cola de errores (vea IP_RECVERR). Se encolara un nuevo error para cada actualizacion que llegue de la MTU. Mientras se esta realizando el descubrimiento de la MTU, se pueden perder paquetes iniciales de los conectores de datagramas. Las aplicaciones que usan UDP deben se conscientes de esto y no tenerlo en cuenta para sus estrategias de retransmision de paquetes. Para iniciar el proceso de descubrimiento de la MTU de la ruta en conectores no orientados a conexion, es posible comenzar con un tamano grande de datagramas (con longitudes de bytes de hasta 64KB en las cabeceras) y dejar que se reduzca mediante actualizaciones de la MTU de la ruta. Para obtener una estimacion inicial de la MTU de la ruta, conecte un conector de datagramas a una direccion de destino usando connect(2) y obtenga la MTU llamando a getsockopt(2) con la opcion IP_MTU. Es posible implementar el sondeo MTU RFC 4821 con sockets SOCK_DGRAM o SOCK_RAW estableciendo un valor de IP_PMTUDISC_PROBE (disponible desde Linux 2.6.22). Esto tambien es particularmente util para herramientas de diagnostico como tracepath(8) que envian deliberadamente paquetes de sondeo mas grandes que la MTU de ruta observada. IP_MULTICAST_ALL (desde Linux 2.6.31) Esta opcion se puede utilizar para modificar la normativa de entrega de mensajes de multidifusion. El argumento es un numero entero booleano (el valor predeterminado es 1). Si se establece en 1, el socket recibira mensajes de todos los grupos que se hayan unido globalmente en todo el sistema, sino entregara mensajes solo de los grupos a los que se haya unido explicitamente (por ejemplo, mediante la opcion IP_ADD_MEMBERSHIP) en este socket en particular. IP_MULTICAST_IF (desde Linux 1.2) Configura el dispositivo local para un socket de multidifusion. El argumento para setsockopt(2) es una estructura ip_mreqn o (desde Linux 3.5) ip_mreq similar a IP_ADD_MEMBERSHIP, o una estructura in_addr. El nucleo determinara que estructura se pasa segun el tamano pasado en optlen.) Para getsockopt(2), el argumento es una estructura in_addr. IP_MULTICAST_LOOP (desde Linux 1.2) Establece o lee un argumento entero booleano que indica si los paquetes multidestino enviados deben o no ser devueltos a los conectores locales. IP_MULTICAST_TTL (desde Linux 1.2) Establece o lee el valor "tiempo de vida" (time-to-live, TTL) de los paquetes multidestino de salida para este conector. Es muy importante para los paquetes multidestino utilizar el TTL mas pequeno posible. El valor por defecto es 1 lo que significa que los paquetes multidestino no abandonaran la red local a menos que el programa de usuario lo solicite explicitamente. El argumento es un entero. IP_NODEFRAG (desde Linux 2.6.36) si esta activo (el argumento es distinto de cero), el reensamblado de los paquetes salientes esta desactivado en la capa de netfilter. El argumento es un numero entero. Esta opcion solo es valida para los conectores SOCK_RAW IP_OPTIONS (desde Linux 2.0) Establece u obtiene las opciones IP a enviar con cada paquete desde este conector. Los argumentos son punteros a un buffer de memoria que contiene las opciones y la longitud de las opciones. La llamada setsockopt(2) establece las opciones IP asociadas a un conector. El tamano maximo de opcion para IPv4 es de 40 bytes. Vea RFC 791 para las opciones permitidas. Cuando el paquete inicial de peticion de conexion para un conector SOCK_STREAM contiene opciones IP, las opciones IP se configuraran automaticamente al valor de las opciones del paquete inicial con las cabeceras de enrutamiento invertidas. No se permite que los paquetes de entrada cambien las opciones despues de que la conexion se haya establecido. El procesamiento de todas las opciones de enrutamiento de la fuente de entrada esta desactivado por defecto y se puede activar mediante la interfaz en /proc accept_source_route. Otras opciones, como las marcas de tiempo, todavia se siguen manejando. Para los conectores de datagramas, las opciones IP solo pueden ser configuradas por el usuario local. Llamar a getsockopt(2) con IP_OPTIONS coloca en el buffer proporcionado las opciones IP actuales usadas para enviar. IP_PASSSEC (desde Linux 2.6.17) Si se configura IPSEC o NetLabel con etiqueta en los equipos de envio y recepcion, esta opcion permite recibir el contexto de seguridad del socket del mismo nivel en un mensaje auxiliar de tipo SCM_SECURITY recuperado mediante recvmsg(2). Esta opcion solo se admite para sockets UDP; para sockets TCP o SCTP, consulte la descripcion de la opcion SO_PEERSEC a continuacion. El valor dado como argumento para setsockopt(2) y devuelto como resultado de getsockopt(2) es un indicador booleano entero. El contexto de seguridad devuelto en el mensaje auxiliar SCM_SECURITY tiene el mismo formato que el que se describe a continuacion en la opcion SO_PEERSEC. Obervacion: seguramente haya sido un error la reutilizacion del tipo de mensaje SCM_SECURITY para la opcion de socket IP_PASSSEC. Otros mensajes de control de IP usan su propio esquema de numeracion en el espacio de nombres de IP y a menudo usan el valor de la opcion de socket como tipo de mensaje. Actualmente no hay ningun conflicto ya que la opcion IP con el mismo valor que SCM_SECURITY es IP_HDRINCL y nunca se usa para un tipo de mensaje de control. IP_PKTINFO (desde Linux 2.2) Pasa un mensaje auxiliar IP_PKTINFO que contiene una estructura pktinfo que proporciona alguna informacion sobre los paquetes de entrada. Esto solo funciona para conectores orientados a datagramas. El argumento es un indicador que le dice al conector si deberia pasar el mensaje IP_PKTINFO. El mensaje en si mismo solo puede ser enviado/obtenido como un mensaje de control con un paquete usando recvmsg(2) o sendmsg(2). struct in_pktinfo { unsigned int ipi_ifindex; /* Indice de la interfaz */ struct in_addr ipi_spec_dst; /* Direccion local */ struct in_addr ipi_addr; /* Direccion de destino en la cabecera */ }; ipi_ifindex es el indice unico de la interfaz en la que se recibio el paquete. ipi_spec_dst es la direccion local del paquete y ipi_addr es la direccion de destino en el encabezado del paquete. Si IP_PKTINFO se pasa a sendmsg(2) y ipi_spec_dst no es cero, entonces se utiliza como direccion de origen local para la busqueda de la tabla de enrutamiento y para configurar las opciones de ruta de origen IP. Cuando ipi_ifindex no es cero, la direccion local principal de la interfaz especificada por el indice sobrescribe ipi_spec_dst para la busqueda de la tabla de enrutamiento. No compatible con sockets SOCK_STREAM. IP_RECVERR (desde Linux 2.2) Habilita el paso adicional fiable de mensajes de error. Cuando se activa en un conector de datagramas todos los errores generados se encolaran en una cola de errores por conector. Cuando el usuario recibe un errore procedente de una operacion con un conector, se pueden recibir el errore llamando a recvmsg(2) con la opcion MSG_ERRQUEUE activa. La estructura sock_extended_err que describe el error se pasara en un mensaje auxiliar con el tipo IP_RECVERR y el nivel IPPROTO_IP. Esto es util para el manejo fiable de errores en conectores no conectados. La parte de datos recibida de la cola de errores contiene el paquete de error. El mensaje de control IP_RECVERR contiene una estructura 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; /* numero de error */ uint8_t ee_origin; /* donde sucedio */ uint8_t ee_type; /* tipo */ uint8_t ee_code; /* codigo */ uint8_t ee_pad; uint32_t ee_info; /* informacion adicional */ uint32_t ee_data; /* otros datos */ /* Puede haber mas info a continuacion */ }; struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *); ee_errno contiene el numero de errno del error puesto en cola. ee_origin es el codigo de origen que identifica al origen del error. Los otros campos son especificos del protocolo. La macro SO_EE_OFFENDER devuelve un puntero a la direccion del objeto de red donde se origino el error dado un puntero al mensaje auxiliar. Si la direccion no es conocida, el miembro sa_family de sockaddr valdra AF_UNSPEC y los otros campos de sockaddr seran indefinidos. IP usa la estructura sock_extended_err como sigue: a ee_origin se le asigna el valor SO_EE_ORIGIN_ICMP para errores recibidos en un paquete ICMP o SO_EE_ORIGIN_LOCAL para errores generados localmente. Los valores desconocidos deben ser ignorados. A ee_type y ee_code se les asignan los campos tipo y codigo de la cabecera ICMP. ee_info contiene la MTU descubierta para errores EMSGSIZE. El mensaje contiene tambien la estructura sockaddr_in del nodo que provoco el error, a la cual se puede acceder con la macro SO_EE_OFFENDER. El campo sin_family de la direccion devuelta por SO_EE_OFFENDER valdra AF_UNSPEC cuando la fuente sea desconocida. Cuando el error se origino en la red, todas las opciones IP(IP_OPTIONS, IP_TTL etc.) activas en el conector y contenidas en el paquete de error, se pasan como mensajes de control. El contenido util del paquete que ha provocado el error se devuelve como datos normales. Observe que TCP no posee una cola de errores. MSG_ERRQUEUE es ilegal en conectores SOCK_STREAM. IP_RECERR si es valido en TCP pero todos los errores son devueltos unicamente mediante funciones de conector o a traves de SO_ERROR. Para conectores directos (raw), IP_RECVERR activa el paso de todos los errores ICMP recibidos a la aplicacion. En cualquier otro caso, solo se informa de los errores que se producen en conectores conectados. Esta opcion establece u obtiene un valor booleano entero. Por defecto, IP_RECVERR esta desactivada. IP_RECVOPTS (desde Linux 2.2) Pasa todas las opciones IP de entrada al usuario en un mensaje de control IP_OPTIONS. La cabecera de enrutamiento y otras opciones ya las completa el anfitrion local. No soportada para conectores SOCK_STREAM. IP_RECVORIGDSTADDR (desde Linux 2.6.29) Esta opcion booleana habilita el mensaje auxiliar IP_ORIGDSTADDR en recvmsg(2), en el que el nucleo retorna la direccion de destino original del datagrama que se recibe. El mensaje auxiliar contiene una struct sockaddr_in. No es compatible con sockets SOCK_STREAM. IP_RECVTOS (desde Linux 2.2) Si esta habilitado, el mensaje auxiliar IP_TOS se pasa con los paquetes entrantes. Contiene un byte que especifica el campo Tipo de servicio/precedencia del encabezado del paquete. Espera un indicador de numero entero booleano. No es compatible con sockets SOCK_STREAM. IP_RECVTTL (desde Linux 2.2) Cuando esta opcion esta activa, pasa un mensaje de control IP_TTL con el campo "tiempo de vida" (time to live) del paquete recibido en forma de entero de 32 bits. Los conectores SOCK_STREAM no lo implementan. IP_RETOPTS (desde Linux 2.2) Identico a IP_RECVOPTS, pero devuelve opciones sin procesar con opciones de marca temporal y registro de ruta no completadas para este transito. No compatible con sockets SOCK_STREAM. IP_ROUTER_ALERT (desde Linux 2.2) Pasar a este conector todos los paquetes a reenviar que tengan activa la opcion alarma del enrutador IP (IP Router Alert). Solo valida para conectores directos. Esto es util, por ejemplo, para demonios RSVP en el espacio de usuario. Los paquetes interceptados no son reenviados por el nucleo, es responsabilidad de los usuarios envilarlos de nuevo. Se ignora el enlace del conector, tales paquetes solo son filtrados por el protocolo. Espera una opcion entera. IP_TOS (desde Linux 1.0) Establece o devuelve el campo Tipo de Servicio (Type-Of-Service, TOS) a enviar con cada paquete IP creado desde este conector. Se usa para priorizar los paquetes en la red. TOS es un byte. Existen algunas opciones TOS estandares definidas: IPTOS_LOWDELAY para minizar los retrasos en el caso de trafico interactivo, IPTOS_THROUGHPUT para optimizar el rendimiento, IPTOS_RELIABILITY para optimizar la fiabilidad e IPTOS_MINCOST, que se deberia usar para "datos de relleno" donde no tenga sentido una transmision lenta. Como mucho, se puede especificar uno de estos valores TOS. Los otros bits son invalidos y se limpiaran. Por defecto, Linux envia primero datagramas IPTOS_LOWDELAY pero el comportamiento exacto depende de la configuracion de la cola. Algunos niveles de prioridad alta pueden necesitar privilegios de administrador (consulte la capacidad CAP_NET_ADMIN. IP_TRANSPARENT (desde Linux 2.6.24) Establecer esta opcion booleana permite el proxy transparente en este socket. Esta opcion de socket permite que la aplicacion que realiza la llamada se vincule a una direccion IP no local y funcione como cliente y servidor con la direccion externa como punto final local. OBSERVACION: esto requiere que el enrutamiento se configure de manera que los paquetes que van a la direccion externa se enruten a traves del cuadro TProxy (es decir, el sistema que aloja la aplicacion que emplea la opcion de socket IP_TRANSPARENT). Habilitar esta opcion de socket requiere privilegios de administrador (la capacidad CAP_NET_ADMIN). La redireccion de TProxy con el destino TPROXY de iptables tambien requiere que esta opcion este configurada en el socket redirigido. IP_TTL (desde Linux 1.0) Establece u obtiene el campo "tiempo de vida" actual que se envia en cada paquete enviado desde este conector. IP_UNBLOCK_SOURCE (desde Linux 2.4.22 / 2.5.68) Desbloquea fuentes multidifusion bloqueadas con anterioridad. Devuelve EADDRNOTAVAIL cuando no se esta bloqueando la fuente. El argumento es una estructura ip_mreq_source tal como se describe en IP_ADD_MEMBERSHIP. SO_PEERSEC (desde Linux 2.6.17) Si IPSEC o NetLabel estan configurados en los equipos de envio y recepcion, esta opcion de socket de solo lectura devuelve el contexto de seguridad del socket del mismo nivel conectado a el. Por defecto, sera el mismo que el contexto de seguridad del proceso que creo el socket del mismo nivel, salvo que sea anulado por normativa o por un proceso con los permisos necesarios. El argumento de getsockopt(2) es un puntero a un bufer de la longitud especificada en bytes en el que se copiara la cadena contextual de seguridad. Si la longitud del bufer es menor que la longitud de la cadena de contexto de seguridad, entonces getsockopt(2) devuelve -1, establece errno en ERANGE y devuelve la longitud requerida mediante optlen. El invocante debe asignar al menos NAME_MAX bytes para el bufer inicialmente, aunque no se garantiza que esto sea suficiente. Es posible que sea necesario cambiar el tamano del bufer a la longitud devuelta y volver a intentarlo. La cadena contextual de seguridad puede incluir un caracter nulo de terminacion en la longitud devuelta, pero no se garantiza que asi sea: un contexto de seguridad 'foo'podria representarse como {'f','o','o'} de longitud 3 o {'f','o','o','\0'} de longitud 4, que se consideran intercambiables. La cadena es imprimible, no contiene caracteres nulos no terminantes y tiene una codificacion no especificada (no se garantiza que sea ASCII o UTF-8). El empleo de esta opcion para conectores de la familia AF_INET esta implementado desde la version 2.6.17 para conectores TCP y desde la 4.17 para los SCTP. Para SELinux, NetLabel transmite solo la parte MLS del contexto de seguridad a traves del cable, y establece de forma predeterminada el resto del contexto de seguridad en los valores definidos en la normativa para el identificador de seguridad inicial (SID) de netmsg. Sin embargo, NetLabel se puede configurar para pasar contextos de seguridad completos a traves de loopback. IPSEC siempre pasa contextos de seguridad completos como parte del establecimiento de la asociacion de seguridad (SA) y los busca en funcion de la asociacion para cada paquete. Interfaces /proc El protocolo IP admite un conjunto de interfaces /proc para configurar algunos parametros globales. Se puede acceder a los parametros leyendo o escribiendo archivos en el directorio /proc/sys/net/ipv4/. Las interfaces descritas como Boolean toman un valor entero, con un valor distinto de cero ('true') que significa que la opcion correspondiente esta habilitada y un valor cero ('false') que significa que la opcion esta deshabilitada. ip_always_defrag (Booleano; desde Linux 2.2.13) [Nueva con la version 2.2.13 del nucleo. En anteriores versiones del nucleo esta caracteristica se activaba durante la compilacion del nucleo mediante la opcion CONFIG_IP_ALWAYS_DEFRAG] que ya no esta presente en versiones 2.4.x y posteriores. Cuanda esta opcion booleana se habilita (es distinta de 0) los fragmentos de entrada (partes de paquetes IP que aparecen cuando algun anfitrion entre el origen y el destino decidio que los paquetes eran demasiado grandes y los dividio en pedazos) se reensamblaran (desfragmentaran) antes de ser procesados, incluso aunque vayan a ser reenviados. Habilitelo solo cuando tenga en funcionamiento un cortafuegos que sea el unico enlace de su red o un proxy transparente. Nunca lo active para un router o un equipo. Podria perturbarse la comunicacion fragmentada cuando los fragmentos viajen a traves de diferentes enlaces. La desfragmentacion tambien tiene un alto coste de tiempo de CPU y de memoria. Esto se activa 'automagicamente' cuando se configura un enmascaramiento o un proxy transparente. ip_autoconfig (desde Linux 2.2 hasta Linux 2.6.17) No documentado. ip_default_ttl (entero; por defecto: 64; a partir de la version 2.2) Establece el valor "tiempo de vida" (TTL) por defecto de los paquetes de salida. Este se puede cambiar para cada conector con la opcion IP_TTL. ip_dynaddr (Booleano; por defecto: deshabilitado; a partir de Linux 2.0.31) Activa la reescritura dinamica de la direccion del conector y de las entradas de enmascaramiento (masquerading) para cuando cambie la direccion de la interfaz. Esto es util para interfaces dialup (como las telefonicas) con direcciones IP cambiantes. 0 significa no reescritura, 1 la activa y 2 activa el modo verboso. ip_forward (Booleano; por defecto: dehabilitado; a partir de la version 1.2) Activa el reenvio IP con una opcion booleana. Tambien se puede configurar el reenvio IP interfaz a interfaz. ip_local_port_range (desde Linux 2.2) Este archivo contiene dos numeros enteros que definen el intervalo de puertos locales predeterminado asignado a sockets que no estan vinculados explicitamente a un numero de puerto--es decir, el intervalo utilizado para puertos efimeros. Se asignara un puerto efimero a un socket en las siguientes circunstancias: o el numero de puerto aparece como 0 en una direccion de conector al invocar bind(2); o se invoca listen(2) en un conector de flujo sin enlzar previamente; o Se ha invocado connect(2) en un conector no conectado previamente. o se invoca sendto(2) en un conector de datagrama no conectado previamente. La asignacion de puertos efimeros comienza con el primer numero en ip_local_port_range y termina con el segundo numero. Si se agota el intervalo de puertos efimeros, la llamada al sistema correspondiente devuelve un error (pero consulte ERRORES). Debe tenerse en cuenta que el intervalo de puertos en ip_local_port_range no debe entrar en conflicto con los puertos utilizados por el enmascaramiento (aunque a veces se maneje). Ademas, las elecciones arbitrarias pueden causar problemas con filtros de paquetes del firewall que hacen suposiciones sobre los puertos locales en uso. El primer numero deberia ser al menos mayor que 1024, o mejor, mayor que 4096, para evitar conflictos con puertos conocidos y minimizar los problemas del firewall. ip_no_pmtu_disc (booleano; predeterminado: deshabilitado; desde Linux 2.2) Si esta activa, por defecto no realiza el descubrimiento de la MTU de la ruta para los conectores TCP. El descubrimiento de la MTU de la ruta puede fallar si se encuentran en la ruta cortafuegos mal configurados (como los que pierden todos los paquetes ICMP) o interfaces mal configuradas (por ejemplo, un enlace punto a punto en donde ambos extremos no se ponen de acuerdo en la MTU). Es mejor arreglar los enrutadores defectuosos de la ruta que desactivar globalmente el descubrimiento de la MTU de la ruta ya que el no realizarlo incurre en un alto coste para la red. ip_nonlocal_bind (booleano; predeterminado: deshabilitado; desde Linux 2.4) Si se establece, permite que los procesos bind(2) (se enlacen) a direcciones IP no locales, lo que puede ser bastante util, pero puede danar algunas aplicaciones. ip6frag_time (entero; predeterminado: 30) Tiempo en segundos para mantener un fragmento de IPv6 en memoria. ip6frag_secret_interval (entero; predeterminado: 600) Intervalo de regeneracion (en segundos) del secreto hash (o vida util del secreto hash) para fragmentos de IPv6. ipfrag_high_thresh (entero) ipfrag_low_thresh (entero) Si el numero de fragmentos IP encolados alcanza el valor ipfrag_high_thresh, la cola se recorta al valor ipfrag_low_thresh. Contiene un entero con el numero de bytes. neigh/* Vea arp(7). Ioctls Todas las ioctls descritas en socket(7) se aplican a ip. Las ioctls para configurar los parametros de los dispositivos genericos se describen en netdevice(7). ERRORES EACCES El usuario intento ejecutar una operacion sin los permisos necesarios. Estos incluyen: enviar un paquete a una direccion de transmision sin tener configurado el indicador SO_BROADCAST; enviar un paquete a traves de una ruta prohibida; modificar la configuracion del firewall sin privilegios de administrador (la capacidad CAP_NET_ADMIN); enlazar a un puerto privilegiado sin privilegios de administrador (la capacidad CAP_NET_BIND_SERVICE). EADDRINUSE Se ha intentado el enlace a una direccion ya en uso. EADDRNOTAVAIL Se ha solicitado una interfaz inexistente o la direccion fuente solicitada no es local. EAGAIN La operacion se bloquearia sobre un conector bloqueante. EALREADY Ya se esta realizando una operacion de conexion sobre un conector no bloqueante. ECONNABORTED Se ha cerrado la conexion durante un accept(2). EHOSTUNREACH Ninguna entrada valida de la tabla de enrutamiento coincide con la direccion de destino. Este error puede ser provocado por un mensaje ICMP procedente de un enrutador remoto o por la tabla local de enrutamiento. EINVAL Se ha pasado un argumento invalido. Para las operaciones de envio, este se puede producir al enviar a una ruta blackhole. EISCONN Se ha llamado a connect(2) sobre un conector ya conectado. EMSGSIZE El datagrama es mayor que una MTU de la ruta y no puede ser fragmentado. ENOBUFS ENOMEM No hay suficiente memoria libre. Esto a menudo significa que la reserva de memoria esta limitada por los limites del bufer de conectores, no por la memoria del sistema, aunque esto no es coherente al 100%. ENOENT Se ha llamado a SIOCGSTAMP sobre un conector en donde no han llegado paquetes. ENOPKG No se ha configurado un subsistema del nucleo. ENOPROTOOPT y EOPNOTSUPP Se han pasado opciones de conector invalidas. ENOTCONN La operacion solo esta definida en un conector conectado pero el conector no esta conectado. EPERM El usuario no tiene permiso para establecer una prioridad alta, cambiar la configuracion o enviar senales al proceso o grupo solicitado. EPIPE La conexion ha sido cerrada o cancelada por el otro extremo. ESOCKTNOSUPPORT El conector no esta configurado o se ha solicitado un tipo de conector desconocido. Los protocolos superpuestos pueden generar otros errores. Vea tcp(7), raw(7), udp(7) y socket(7). NOTAS IP_FREEBIND, IP_MSFILTER, IP_MTU, IP_MTU_DISCOVER, IP_RECVORIGDSTADDR, IP_PASSSEC, IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT y IP_TRANSPARENT son especificas de Linux. Debe tenerse especial precaucion con la opcion SO_BROADCAST: no tiene privilegios en Linux y es facil sobrecargar la red con transmisiones descuidadas. Para nuevos protocolos de aplicacion, es preferible utilizar un grupo de multidifusion en lugar de transmision. Se desaconseja la radiodifusion. Consulte RFC 6762 para ver un ejemplo de un protocolo (mDNS) que utiliza el enfoque de multidifusion mas moderno para comunicarse con un grupo abierto de hosts en la red local. Otras implementaciones de conectores BSD proporcionan las opciones de conector IP_RCVDSTADDR y IP_RECVIF para obtener la direccion de destino y la interfaz de los datagramas recibidos. Linux posee la opcion mas general IP_PKTINFO para la misma tarea. Algunas implementaciones de conectores de BSD tambien proporcionan una opcion IP_RECVTTL, pasando un mensaje auxiliar con el tipo IP_RECVTTL en el paquete entrante. Esta opcion es diferente de IP_TTL empleada en Linux. El empleo de la opcion de nivel SOL_IP en conectores no es portable. Las pilas basadas en BSD emplean el nivel IPPROTO_IP INADDR_ANY (0.0.0.0) y INADDR_BROADCAST (255.255.255.255) son neutrales en el orden de bytes. Esto hace que htonl(3) no tenga ningun efecto sobre ellos. Compatibilidad Por compatibilidad con Linux 2.0, todavia se soporta la sintaxis obsoleta socket(AF_INET, SOCK_PACKET, protocol) para abrir un conector de paquetes (packet(7)). Se recomienda no usar esta sintaxis y deberia reemplazarse por socket(AF_PACKET, SOCK_RAW, protocol). La principal diferencia es la nueva estructura de direcciones sockaddr_ll para la informacion generica de la capa de enlace en lugar de la antigua sockaddr_pkt. ERRORES Hay demasiados valores de error inconsistentes. El error utilizado para diagnosticar el agotamiento del intervalo de puertos efimeros difiere entre las distintas llamadas al sistema que pueden asignar puertos efimeros (connect(2), bind(2), listen(2), sendto(2). No se han descrito las ioctls para configurar las opciones de interfaz especificas de IP y las tablas ARP. Recibir la direccion de destino original con MSG_ERRQUEUE en msg_name mediante recvmsg(2) no funciona en algunos nucleos de Linux 2.2. VEASE TAMBIEN 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) Documentacion del codigo fuente del nucleo Documentation/networking/ip-sysctl.txt. RFC 791 para la especificacion IP original. RFC1122 para los requerimientos IPv4 para lo anfitriones. RFC 1812 para los requeremientos IPv4 para los enrutadores. TRADUCCION La traduccion al espanol de esta pagina del manual fue creada por Juan Piernas , Miguel Perez Ibars y Marcos Fouces Esta traduccion es documentacion libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD. Si encuentra algun error en la traduccion de esta pagina del manual, envie un correo electronico a . Paginas de Manual de Linux 6.9.1 2 Mayo 2024 ip(7)