RAW(7)

NOMBRE
raw - Conectores directos (raw) IPv4 de Linux

SINOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, int protocol);

DESCRIPCIÓN
Los conectores directos permiten implementar nuevos protocolos IPv4 en el espacio de usuario. Un conector directo recibe o envía el datagrama crudo sin incluir cabeceras del nivel de enlace.

La capa IPv4 genera una cabecera IP cuando se envía un paquete, a menos que se active la opción IP_HDRINCL en el conector. Cuando se activa, el paquete debe contener una cabecera IP. En la recepción, la cabecera IP siempre está incluida en el paquete.

In order to create a raw socket, a process must have the CAP_NET_RAW capability in the user namespace that governs its network namespace.

All packets or errors matching the protocol number specified for the raw socket are passed to this socket. For a list of the allowed protocols, see the IANA list of assigned protocol numbers at http://www.iana.org/assignments/protocol-numbers/ and getprotobyname(3).

Un protocolo IPPROTO_RAW implica que IP_HDRINCL está activa y preparada para enviar cualquier protocolo IP especificado en la cabecera pasada. Recibir todos los protocolos IP via IPPROTO_RAW no es posible con conectores directos.
    Campos de cabecera IP modificados en el envío por IP_HDRINCL
    Suma de comprobación IP | Siempre se rellena
    Dirección fuente | Se rellena cuando es cero
    Identificador del paquete | Se rellena cuando es cero
    Longitud total | Siempre se rellena

Si se especifica IP_HDRINCL y la cabecera IP tiene una dirección de destino distinta de cero, la dirección de destino del conector se utiliza para enrutar el paquete. Cuando se especifica MSG_DONTROUTE, la dirección de destino debe referirse a una interfaz local, de lo contrario, se realiza una búsqueda en la tabla de enrutamiento, aunque se ignoran las rutas que se dirigen a enrutadores.

Si no se activa IP_HDRINCL, se pueden configurar las opciones de la cabecera IP de los conectores directos con setsockopt(2). Vea ip(7) para más información.

Starting with Linux 2.2, all IP header fields and options can be set using IP socket options. This means raw sockets are usually needed only for new protocols or protocols with no user interface (like ICMP).

Cuando se recibe un paquete, se pasa a cualquier conector directo que haya sido asociado a su protocolo antes de que sea pasado al manejador de cualquier otro protocolo (por ejemplo, los módulos de protocolo del núcleo).

  Address format
For sending and receiving datagrams (sendto(2), recvfrom(2), and similar), raw sockets use the standard sockaddr_in address structure defined in ip(7). The sin_port field could be used to specify the IP protocol number, but it is ignored for sending in Linux 2.2 and later, and should be always set to 0 (see BUGS). For incoming packets, sin_port is set to zero.

  Socket options
Las opciones de los conectores directos se pueden configurar con setsockopt(2) y leer con getsockopt(2), pasando la opción de familia IPPROTO_RAW.

ICMP_FILTER
    Activa un filtro especial para los conectores directos asociados al protocolo IPPROTO_ICMP. El valor tiene un bit activo para cada tipo de mensaje ICMP que debe filtrarse. Por defecto, no se filtra ningún mensaje ICMP.

In addition, all ip(7) IPPROTO_IP socket options valid for datagram sockets are supported.

  Error handling
Sólo se pasan al usuario los errores generados por la red cuando el conector está conectado o está activa la opción IP_RECVERR. Para conectores conectados, sólo se pasan EMSGSIZE y EPROTO por compatibilidad. Con IP_RECVERR todos los errores de red se guardan en la cola de errores.

ERRORES

EACCES
    El usuario ha intentado enviar a una dirección de difusión sin tener activa la opción de difusión en el conector.

EFAULT
    Se ha pasado una dirección de memoria inválida.

EINVAL
    Argumento inválido.

EMSGSIZE
    Paquete demasiado grande. O bien el descubrimiento del MTU de la ruta está activo (la opción IP_MTU_DISCOVER de los conectores) o bien el tamaño del paquete excede el máximo tamaño de 64 kB permitido por IPv4.

EOPNOTSUPP
    Se ha pasado a la llamada socket una opción inválida (como MSG_OOB).

EPERM
    El usuario no tiene permiso para abrir conectores directos. Sólo los procesos con un identificador de usuario efectivo de 0 o el atributo CAP_NET_RAW pueden hacerlo.

EPROTO
    Ha llegado un error ICMP informando de un problema de parámetros.

VERSIONES
IP_RECVERR y ICMP_FILTER son nuevos en la versión 2.2 de Linux. Ambos son extensiones de Linux y no deberían usarse en programas transportables.

Linux 2.0 enabled some bug-to-bug compatibility with BSD in the raw socket code when the SO_BSDCOMPAT socket option was set; since Linux 2.2, this option no longer has that effect.

NOTAS
By default, raw sockets do path MTU (Maximum Transmission Unit) discovery. This means the kernel will keep track of the MTU to a specific target IP address and return EMSGSIZE when a raw packet write exceeds it. When this happens, the application should decrease the packet size. Path MTU discovery can be also turned off using the IP_MTU_DISCOVER socket option or the /proc/sys/net/ipv4/ip_no_pmtu_disc file, see ip(7) for details. When turned off, raw sockets will fragment outgoing packets that exceed the interface MTU. However, disabling it is not recommended for performance and reliability reasons.

A raw socket can be bound to a specific local address using the bind(2) call. If it isn't bound, all packets with the specified IP protocol are received. In addition, a raw socket can be bound to a specific network device using SO_BINDTODEVICE; see socket(7).

Un conector IPPROTO_RAW es sólo de envío. Si verdaderamente quiere recibir todos los paquetes IP, use un conector packet(7) con el protocolo ETH_P_IP. Dése cuenta que, a diferencia de los conectores directos, los conectores de paquete no reensamblan fragmentos IP.

Si quiere recibir todos los paquetes ICMP para un conector de datagramas, normalmente es mejor usar IP_RECVERR en ese conector particular. Vea ip(7).

Los conectores directos pueden interceptar todos los protocolos IP de Linux, incluso protocolos como ICMP o TCP que poseen un módulo de protocolo dentro del núcleo. En este caso, los paquetes se pasan tanto al módulo del núcleo como al conector (o conectores) directo. No se debería confiar en esto en programas transportables ya que muchas otras implementaciones de conectores BSD tienen limitaciones aquí.

Linux nunca cambia las cabeceras pasadas por el usuario (salvo para rellenar algunos campos de valor 0 como se ha descrito en IP_HDRINCL). Esto es diferente de muchas otras implementaciones de conectores directos.

Raw sockets are generally rather unportable and should be avoided in programs intended to be portable.

Sending on raw sockets should take the IP protocol from sin_port; this ability was lost in Linux 2.2. The workaround is to use IP_HDRINCL.

ERRORES
No se han descrito las extensiones de proxy transparente.

Cuando se activa la opción IP_HDRINCL, los datagramas no se fragmentan y están limitados por la MTU de la interfaz.

La posibilidad de especificar el protocolo IP en sin_port durante el envío desapareció en Linux 2.2. Siempre se usa el protocolo al que se enlazó el conector o el que se especificó en la llamada inicial a socket(2).

VÉASE TAMBIÉN
recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7)

RFC 1191 para el descubrimiento del MTU de la ruta. RFC 791 y el fichero cabecera <linux/ip.h> para el protocolo IP.

COLOFÓN
Esta página es parte de la versión 5.10 del proyecto Linux man-pages. Puede encontrar una descripción del proyecto, información sobre cómo informar errores y la última versión de esta página en https://www.kernel.org/doc/man-pages/.

TRADUCCIÓN
La traducción al español de esta página del manual fue creada por Juan Piernas <piernas@ditec.um.es> Esta traducción es documentación libre; lea la GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD. Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org>..