2 pontos por GN⁺ 2023-09-11 | 1 comentários | Compartilhar no WhatsApp
  • Explicação em artigo sobre como o Linux realiza tradução de endereços de rede (NAT) para o comando ping, que usa o Protocolo de Mensagens de Controle da Internet (ICMP)
  • A autora explorou o código de rede do Linux para entender como o NAT funciona para pacotes ICMP; pacotes ICMP não têm campo de porta
  • Configuração experimental em que a autora usa namespaces de rede para simular vários dispositivos em uma única máquina Linux, usando o comando ping para testar o processo de NAT
  • O experimento inclui a criação de dois clientes conectados a uma bridge, com conexão a uma caixa NAT e a um servidor, além da configuração de roteamento e NAT
  • A autora capturou pacotes ICMP nos namespaces de rede do cliente e do servidor e analisou os dados dos pacotes
  • A autora descobriu que cada cliente possui um campo "id" diferente, permitindo que a caixa NAT diferencie os pacotes de resposta entregues a cada cliente
  • A autora explorou o código-fonte do Linux e a RFC 792, que define o protocolo ICMP, para entender como o ID é escolhido
  • A autora descobriu que o comando ping escolhe o identificador aleatoriamente e que, se dois processos ping em hosts diferentes escolherem o mesmo ID, o kernel Linux seleciona aleatoriamente uma porta livre, e essa porta é usada como o ID do pacote ICMP
  • A autora rastreou funções do kernel e usou uma ferramenta chamada bpftrace para validar seu entendimento do código do netfilter
  • A conclusão do artigo é que o Linux faz NAT de ping criando uma conexão para cada cliente, reescrevendo o endereço IP de origem e/ou o campo de ID do ICMP nos pacotes de saída, e depois revertendo essas modificações nos pacotes de resposta
  • O artigo oferece uma explicação detalhada, passo a passo, do processo, de forma acessível para engenheiros de software iniciantes com conhecimento técnico básico

1 comentários

 
GN⁺ 2023-09-11
Comentário do Hacker News
  • Artigo sobre como a tradução de endereços de rede (NAT) no Linux processa solicitações de ping
  • O servidor envia pacotes fixos de solicitação de eco ICMP para um endereço fixo, sem esperar que eles retornem
  • Quando o cliente tenta se conectar, ele envia ao servidor um pacote ICMP de tempo esgotado que inclui o pacote fixo "original" que o servidor estava enviando
  • O cliente age como um salto da internet e informa ao servidor que o pacote original não pôde ser entregue
  • O dispositivo NAT encaminha o ICMP de tempo esgotado para o servidor atrás do NAT, incluindo o cabeçalho IP completo do cliente, permitindo que o servidor descubra o endereço IP do cliente
  • Quando um ping é enviado da rede local para um dispositivo na internet, o roteador que faz NAT reescreve o endereço de origem do ping para o endereço IP público e também reescreve o campo ID do pacote ICMP com um valor único
  • O roteador usa esse valor de ID único para entregar a resposta ao dispositivo correto na rede local
  • A postagem também fornece material sobre uma ferramenta chamada Netfilter, usada para adulteração de pacotes, tradução de endereços de rede e filtragem de pacotes
  • O artigo é elogiado por sua análise profunda, que vai de todas as camadas de abstração até o código-fonte
  • Como o ICMP não tem portas, o NAT não precisa lidar com o problema de devolver as respostas de eco ICMP para a porta correta
  • Solicitações de eco ICMP têm um ID, que na prática equivale ao número da porta de origem
  • O tratamento de NAT para eco ICMP precisa remapear o ID nos dois sentidos, de forma semelhante a como o UDP remapeia a porta de origem
  • Alguns usuários reclamam de links para linhas específicas de código em posts de blog, já que eles mudam com o tempo
  • Alguns usuários criticam o NAT como uma abstração ruim e pedem o fim do IPv4
  • Há especulações sobre a possibilidade de enviar mensagens curtas para redes ponto a ponto usando ping sobre UDP sem um servidor central
  • O artigo é resumido como uma explicação de que os pacotes ICMP têm um campo ID e que o Netfilter trata pacotes ICMP como um "caso especial"