raw(7) Miscellaneous Information Manual raw(7) NOMBRE raw - Conectores directos (raw) IPv4 de Linux SINOPSIS #include #include raw_socket = socket(AF_INET, SOCK_RAW, int protocolo); DESCRIPCION Los conectores directos permiten implementar nuevos protocolos IPv4 en el espacio de usuario. Un conector directo recibe o envia el datagrama crudo sin incluir cabeceras del nivel de enlace. La capa IPv4 genera una cabecera IP cuando se envia un paquete, a menos que se active la opcion IP_HDRINCL en el conector. Cuando se activa, el paquete debe contener una cabecera IP. En la recepcion, la cabecera IP siempre esta incluida en el paquete. Para crea un conector directo, un proceso tiene que poseer la capacidad CAP_NET_RAW en la red y con el usuario que lo ejecute. Todos los paquetes o errores cuyo protocolo coinciden con el numero de protocolo especificado por el conector directo, se pasan a este conector. Para una lista de los protocolos permitidos vea los numeros asignados en y getprotobyname(3). Un protocolo IPPROTO_RAW implica que IP_HDRINCL esta 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 envio por IP_HDRINCL | +-------------------------------+-------------------------------+ |Suma de comprobacion IP | Siempre se rellena | +-------------------------------+-------------------------------+ |Direccion 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 direccion de destino distinta de cero, la direccion de destino del conector se utiliza para enrutar el paquete. Cuando se especifica MSG_DONTROUTE, la direccion de destino debe referirse a una interfaz local, de lo contrario, se realiza una busqueda 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 mas informacion. A partir de Linux 2.2 todas las opciones y campos de las cabeceras IP se pueden configurar usando las opciones de los conectores IP. Esto significa que los conectores directos suelen ser necesarios solo para protocolos nuevos o protocolos sin interfaz de usuario (como 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 modulos de protocolo del nucleo). Formato de las direcciones Para el envio y la recepcion de datagramas (sendto(2), recvfrom(2) y similar) los conectores directos usan la estructura de direcciones estandar sockaddr_in definida en ip(7). El campo sin_port se podria usar para especificar el numero de protocolo IP, pero en Linux 2.2 se ignora al enviar y siempre deberia valer 0 (vea FALLOS). Para los paquetes de entrada, a sin_port se le asigna el protocolo del paquete. Vea el fichero cabecera para protocolos IP validos. Opciones de los conectores Las opciones de los conectores directos se pueden configurar con setsockopt(2) y leer con getsockopt(2), pasando la opcion 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 ningun mensaje ICMP. Ademas, todas las opciones ip(7) del conector IPPROTO_IP validas para conectores de datagramas estan implementadas. Gestion de errores Solo se pasan al usuario los errores generados por la red cuando el conector esta conectado o esta activa la opcion IP_RECVERR. Para conectores conectados, solo 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 direccion de difusion sin tener activa la opcion de difusion en el conector. EFAULT Se ha pasado una direccion de memoria invalida. EINVAL Argumento invalido. EMSGSIZE Paquete demasiado grande. O bien el descubrimiento del MTU de la ruta esta activo (la opcion IP_MTU_DISCOVER de los conectores) o bien el tamano del paquete excede el maximo tamano de 64 kB permitido por IPv4. EOPNOTSUPP Se ha pasado a la llamada socket una opcion invalida (como MSG_OOB). EPERM El usuario no tiene permiso para abrir conectores directos. Solo 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 parametros. VERSIONES IP_RECVERR y ICMP_FILTER son nuevos en la version 2.2 de Linux. Ambos son extensiones de Linux y no deberian usarse en programas transportables. La version 2.0 de Linux activaba cierta compatibilidad con BSD en el codigo de los conectores directos cuando se activaba la opcion SO_BSDCOMPAT. Esto se ha eliminado en la version 2.2. NOTAS Por defecto, los conectores directos averiguan el MTU de la ruta (unidad maxima de transmision) por lo que el nucleo realiza un seguimiento del MTU hacia una IP de destino emitiendo EMSGSIZE cuando la escritura deun conector directo lo sobrepasa. Cuando esto ocurre, la aplicacion debera reducir el tamano de sus paquetes. La averiguacion del MTU de las rutas puede desactivarse mediante la opcion IP_MTU_DISCOVER del conector o en el archivo /proc/sys/net/ipv4/ip_no_pmtu_disc, consulte ip(7) para mas informacion. Si esta desactivada, los conectores directores fragmentaran los paquetes salientes que sobrepasen el MTU de la interfaz. Por razones de rendimiento y fiabilidad, no se recomienda desactivarlo. Se puede asociar un conector directo a una direccion local concreta mediante la llamada bind(2). Si no esta asociado, se recibiran todos los paquetes con el protocolo IP especificado. Ademas, se puede asociar un conector directo a un dispositivo de red especifico usando SO_BINDTODEVICE. Vea socket(7). Un conector IPPROTO_RAW es solo de envio. Si verdaderamente quiere recibir todos los paquetes IP, use un conector packet(7) con el protocolo ETH_P_IP. Dese 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 modulo de protocolo dentro del nucleo. En este caso, los paquetes se pasan tanto al modulo del nucleo como al conector (o conectores) directo. No se deberia confiar en esto en programas transportables ya que muchas otras implementaciones de conectores BSD tienen limitaciones aqui. 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. Generalmente, los conectores directos son bastante especificos y deberian evitarse en programas que pretendan ser portables. En el envio a traves de conectores directos se deberia tomar el protocolo IP de sin_port. Esta capacidad se perdio en Linux 2.2. La forma de solucionar esto es usar IP_HDRINCL. ERRORES No se han descrito las extensiones de proxy transparente. Cuando se activa la opcion IP_HDRINCL, los datagramas no se fragmentan y estan limitados por la MTU de la interfaz. La posibilidad de especificar el protocolo IP en sin_port durante el envio desaparecio en Linux 2.2. Siempre se usa el protocolo al que se enlazo el conector o el que se especifico en la llamada inicial a socket(2). VEASE TAMBIEN 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 para el protocolo IP. TRADUCCION La traduccion al espanol de esta pagina del manual fue creada por Juan Piernas 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.06 31 Octubre 2023 raw(7)