- 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
Comentário do Hacker News