Scroll to navigation

raw(7) Miscellaneous Information Manual raw(7)

NOME

raw - 'sockets' IPv4 diretos

SINOPSE

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

DESCRIÇÃO

Os 'sockets' diretos (não processados) permitem a implementação de novos protocolos sob o IPv4. Um 'socket' direto recebe ou envia o datagrama bruto, sem incluir cabeçalhos de ligação.

A camada IPv4 gera um cabeçalho IP ao enviar um pacote a menos que se ative a opção IP_HDRINCL do 'socket'. Quando ela está habilitada, o pacote deve conter um cabeçalho IP. Um pacote IP que seja recebido terá sempre o cabeçalho IP.

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).

A protocol of IPPROTO_RAW implies enabled IP_HDRINCL and is able to send any IP protocol that is specified in the passed header. Receiving of all IP protocols via IPPROTO_RAW is not possible using raw sockets.

Cabeçalhos IP são midificados quando enviados pelo IP_HDRINCL
Soma de verificação do IP Sempre preenchido
Endereço de origem Preenchido quando zero
Packet ID Preenchido quando zero
Tamanho total Sempre preenchido

Se for especificado IP_HDRINCL e o cabeçalho IP tiver um endereço de destino diferente de zero, este endereço é usado para rotear o pacote. Quando for especificado MSG_DONTROUTE o endereço de destino deve apontar para uma interface local, caso contrário é feita uma consulta à tabela de roteamento, mas as rotas com gateways são ignoradas.

Se não for especificado IP_HDRINCL as opções do cabeçalho IP podem ser ajustadas nos 'sockets' diretos com setsockopt(2); ver ip(7) para mais informações.

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).

Um pacote recebido é passado para quaisquer 'sockets' diretos que tenham sido atrelados ao seu protocolo antes de ser passado para outros manipuladores deste protocolo (ex. módulos de protocolo do kernel).

Formato de endereço

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

As opções de 'sockets' diretos podem ser ajustadas com setsockopt(2) ou lidas com getsockopt(2) passando-se o sinalizador designador de família IPPROTO_RAW.

Habilita um filtro especial para 'sockets' diretos ligados ao protocolo IPPROTO_ICMP. Cada bit deste campo designa um tipo de mensagem ICMP a ser excluída. O padrão é não filtrar nenhuma mensagem ICMP.

Além disso, todas as opções de 'socket' IPPROTO_IP ip(7) válidas para 'sockets' de datagrama são suportadas.

Error handling

Erros originários da rede só são passados para o usuário quando o 'socket' está conectado ou o sinalizador IP_RECVERR está habilitado. Os 'sockets' conectados recebem apenas EMSGSIZE e EPROTO para manter a compatibilidade. Com IP_RECVERR todos os erros de rede são enviados para a fila de erros.

ERROS

O usuário tentou transmitir para um endereço de broadcast sem que o 'socket' tivesse um sinalizador de broadcast.
Foi fornecido um endereço de memória inválido.
Argumento inválido.
O pacote é grande demais. Ou a pesquisa de MTU do caminho está habilitada (com o sinalizador IP_MTU_DISCOVER) ou o tamanho do pacote excede o máximo de 64 kB permitido pelo IPv4.
Um sinalizador inválido foi passado para uma chamada de 'socket' (como MSG_OOB).
O usuário não tem permissão para abrir 'sockets' diretos. Apenas processos com user ID efetivo de 0 ou o atributo CAP_NET_RAW podem fazer isto.
Um mensagem ICMP chegou reportando um erro de parâmetros.

VERSÕES

IP_RECVERR e ICMP_FILTER surgiram no linux 2.2. São extensões linux e não devem ser usadas em programas portáveis.

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).

Um 'socket' IPPROTO_RAW é transmissor apenas. Se você realmente quiser receber todos os pacotes IP use um 'socket' packet(7) com o protocolo ETH_P_IP. Observe que 'sockets packet' não remontam fragmentos IP, ao contrário dos 'sockets' diretos.

Se você quiser receber todos os pacotes ICMP de um 'socket' de datagrama, é muitas vezes melhor usar IP_RECVERR neste 'socket'. Ver ip(7).

Os 'sockets' diretos podem ler todos os protocolos IP no linux, mesmo protocolos como ICMP ou TCP, que têm um módulo de protocolo no kernel. Neste caso, os pacotes são passados tanto para o módulo do kernel e para o(s) 'socket(s)' diretos. Não se deve contar com isso em programas portáveis, porque muitas implementações de 'sockets' em BSD têm limitações aqui.

O linux nunca modifica cabeçalhos enviados pelo usuário, exceto para preencher alguns campos zerados conforme descrito em IP_HDRINCL. Muitas implementações de 'sockets' diretos não se comportam assim.

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

Os 'sockets' diretos enviados lêem o protocolo de sin_port; esta capacidade foi perdida no linux 2.2. A solução é usar IP_HDRINCL.

BUGS

Extensões transparentes de proxy não estão incluídas.

Quando a opção IP_HDRINCL está habilitada os datagramas não serão fragmentados, e ficam limitados à interface MTU.

O ajuste do protocolo IP para envio no campo sin_port foi perdido no linux 2.2. O protocolo que foi atrelado a este 'socket' ou que foi especificado na chamada inicial à socket(2) é usado sempre.

VEJA TAMBÉM

recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7)

RFC 1191 for path MTU discovery. RFC 791 and the <linux/ip.h> header file for the IP protocol.

TRADUÇÃO

A tradução para português brasileiro desta página man foi criada por Paulo César Mendes <drpc@ism.com.br> e André Luiz Fassone <lonely_wolf@ig.com.br>

Esta tradução é uma documentação livre; leia a Licença Pública Geral GNU Versão 3 ou posterior para as condições de direitos autorais. Nenhuma responsabilidade é aceita.

Se você encontrar algum erro na tradução desta página de manual, envie um e-mail para a lista de discussão de tradutores.

15 dezembro 2022 Linux man-pages 6.03