raw(7) Miscellaneous Information Manual raw(7) NOME raw - 'sockets' IPv4 diretos SINOPSE #include #include raw_socket = socket(AF_INET, SOCK_RAW, int protocolo); DESCRICAO Os sockets diretos (nao processados) permitem a implementacao de novos protocolos sob o IPv4. Um socket direto recebe ou envia o datagrama bruto, sem incluir cabecalhos de ligacao. A camada IPv4 gera um cabecalho IP ao enviar um pacote a menos que se ative a opcao IP_HDRINCL do socket. Quando ela esta habilitada, o pacote deve conter um cabecalho IP. Um pacote IP que seja recebido tera sempre o cabecalho IP. Para criar um socket direto, um processo deve ter a capacidade CAP_NET_RAW no espaco de nomes do usuario que governa seu espaco de nomes de rede. Todos os pacotes ou erros relacionados ao numero de protocolo especificado para o socket direto sao passados para este socket. Para uma lista dos protocolos atribuidos em e getprotobyname(3). Um protocolo de IPPROTO_RAW implica que o IP_HDRINCL esta habilitado e e capaz de enviar qualquer protocolo IP que e especificado no cabecalho passado. Receber de todos os protocolos IP via IPPROTO_RAW nao e possivel usando sockets diretos. +------------------------------------------------------------------+ |Cabecalhos IP sao modificados quando enviados pelo IP_HDRINCL | +--------------------------------+---------------------------------+ |Soma de verificacao do IP | Sempre preenchido | +--------------------------------+---------------------------------+ |Endereco de origem | Preenchido quando zero | +--------------------------------+---------------------------------+ |ID do pacote | Preenchido quando zero | +--------------------------------+---------------------------------+ |Tamanho total | Sempre preenchido | +--------------------------------+---------------------------------+ Se for especificado IP_HDRINCL e o cabecalho IP tiver um endereco de destino diferente de zero, este endereco de destino e usado para rotear o pacote. Quando for especificado MSG_DONTROUTE o endereco de destino deve apontar para uma interface local, caso contrario e feita uma consulta a tabela de roteamento, mas as rotas com gateways sao ignoradas. Se nao for especificado IP_HDRINCL as opcoes do cabecalho IP podem ser ajustadas nos sockets diretos com setsockopt(2); ver ip(7) para mais informacoes. A partir do Linux 2.2, todos as opcoes e campos de cabecalho IP podem ser configuradas usando as opcoes para sockets IP. Isto significa que os sockets diretos normalmente so sao necessarios para protocolos novos ou protocolos sem interface de usuario, como o ICMP. Um pacote recebido e passado para quaisquer sockets diretos que tenham sido atrelados ao seu protocolo antes de ser passado para outros manipuladores deste protocolo (ex. modulos de protocolo do kernel). Formato de endereco Para enviar e receber datagramas (sendto(2), recvfrom(2) e similares), os sockets direto usam a estrutura de endereco padrao sockaddr_in definida em ip(7). O campo sin_port pode ser usado para especificar o numero do protocolo IP, mas e ignorado pelo Linux 2.2 e versoes mais novas, e deve ser sempre ajustado para zero (veja BUGS). Para pacotes de entrada. sin_port e definido com zero. Opcoes de socket As opcoes de sockets diretos podem ser ajustadas com setsockopt(2) ou lidas com getsockopt(2) passando-se o sinalizador designador de familia IPPROTO_RAW. ICMP_FILTER Habilita um filtro especial para sockets diretos ligados ao protocolo IPPROTO_ICMP. Cada bit deste campo designa um tipo de mensagem ICMP a ser excluida. O padrao e nao filtrar nenhuma mensagem ICMP. Alem disso, todas as opcoes de socket IPPROTO_IP ip(7) validas para sockets de datagrama sao suportadas. Tratamento de erros Erros originarios da rede so sao passados para o usuario quando o socket esta conectado ou o sinalizador IP_RECVERR esta habilitado. Os sockets conectados recebem apenas EMSGSIZE e EPROTO para manter a compatibilidade. Com IP_RECVERR todos os erros de rede sao enviados para a fila de erros. ERROS EACCES O usuario tentou transmitir para um endereco de broadcast sem que o socket tivesse um sinalizador de broadcast. EFAULT Foi fornecido um endereco de memoria invalido. EINVAL Argumento invalido. EMSGSIZE O pacote e grande demais. Ou a pesquisa de MTU do caminho esta habilitada (com o sinalizador IP_MTU_DISCOVER) ou o tamanho do pacote excede o maximo de 64 kB permitido pelo IPv4. EOPNOTSUPP Um sinalizador invalido foi passado para uma chamada de socket (como MSG_OOB). EPERM O usuario nao tem permissao para abrir sockets diretos. Apenas processos com ID efetivo de usuario com valor 0 ou o atributo CAP_NET_RAW podem fazer isto. EPROTO Um mensagem ICMP chegou reportando um erro de parametros. VERSOES IP_RECVERR e ICMP_FILTER surgiram no Linux 2.2. Sao extensoes Linux e nao devem ser usadas em programas portaveis. O Linux 2.0 criou alguma compatibilidade "bug a bug" com o BSD no codigo dos sockets diretos, quandoa opcao de socket SO_BSDCOMPAT estava configurada. Desde o Linux 2.2, essa opcao nao possui mais efeito. NOTAS Por padrao, os sockets diretos fazem a pesquisa de MTU (Unidade Maxima de Transmissao) do caminho. Isso significa que o kernel rastreara o MTU para um endereco IP de destino especifico e retornara EMSGSIZE quando uma gravacao de pacote direto o exceder. Quando isso acontecer, o aplicativo devera diminuir o tamanho do pacote. A pesquisa de MTU do caminho tambem pode ser desativada usando a opcao de socket IP_MTU_DISCOVER ou o arquivo /proc/sys/net/ipv4/ip_no_pmtu_disc, consulte ip(7) para obter detalhes. Quando desativados, os soquetes brutos fragmentarao os pacotes de saida que excedem o MTU da interface. No entanto, desativa-lo nao e recomendado por motivos de desempenho e confiabilidade. Um socket direto pode ser ligado a um endereco local especifico usando a chamada bind(2). Caso contrario, todos os pacotes com o protocolo IP especificado sao recebidos. Alem disso, um socket direto pode ser associado a um dispositivo de rede especifico usando SO_BINDTODEVICE; veja socket(7). Um socket IPPROTO_RAW e transmissor apenas. Se voce realmente quiser receber todos os pacotes IP, use um socket packet(7) com o protocolo ETH_P_IP. Observe que pacotes de sockets nao remontam fragmentos IP, ao contrario dos sockets diretos. Se voce quiser receber todos os pacotes ICMP de um socket de datagrama, e muitas vezes melhor usar IP_RECVERR neste socket. Veja ip(7). Os sockets diretos podem ler todos os protocolos IP no Linux, mesmo protocolos como ICMP ou TCP, que tem um modulo de protocolo no kernel. Neste caso, os pacotes sao passados tanto para o modulo do kernel e para o(s) socket(s) diretos. Nao se deve contar com isso em programas portaveis, porque muitas implementacoes de sockets em BSD tem limitacoes aqui. O Linux nunca modifica cabecalhos enviados pelo usuario, exceto para preencher alguns campos zerados conforme descrito em IP_HDRINCL. Muitas implementacoes de sockets diretos nao se comportam assim. Os sockets diretos geralmente sao pouco portaveis, devendo ser evitados em programas que se deseje portar. Os sockets diretos enviados leem o protocolo IP de sin_port; esta capacidade foi perdida no Linux 2.2. A solucao e usar IP_HDRINCL. BUGS Extensoes transparentes de proxy nao estao incluidas. Quando a opcao IP_HDRINCL esta habilitada os datagramas nao serao fragmentados, e ficam limitados ao MTU da interface. 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 a socket(2) e usado sempre. VEJA TAMBEM recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7) RFC 1191 para pesquisa de MTU do caminho. RFC 791 e arquivo de cabecalho para o protocolo IP. TRADUCAO A traducao para portugues brasileiro desta pagina man foi criada por Paulo Cesar Mendes , Andre Luiz Fassone e Rafael Fontenelle . Esta traducao e uma documentacao livre; leia a Licenca Publica Geral GNU Versao 3 ou posterior para as condicoes de direitos autorais. Nenhuma responsabilidade e aceita. Se voce encontrar algum erro na traducao desta pagina de manual, envie um e-mail para a lista de discussao de tradutores . Linux man-pages 6.06 31 outubro 2023 raw(7)