- Explicación de un artículo sobre cómo Linux realiza traducción de direcciones de red (NAT) para el comando
ping, que usa el Protocolo de Mensajes de Control de Internet (ICMP)
- El autor exploró el código de redes de Linux para entender cómo funciona NAT con paquetes ICMP, ya que los paquetes ICMP no tienen campo de puerto
- El autor configuró un experimento usando espacios de nombres de red para simular varios dispositivos en una sola máquina Linux y usó el comando
ping para probar el proceso de NAT
- El experimento consistió en crear dos clientes conectados a un bridge, además de conectar una caja NAT y un servidor, incluyendo configuración de enrutamiento y NAT
- El autor capturó paquetes ICMP en los espacios de nombres de red del cliente y del servidor y analizó los datos de los paquetes
- El autor descubrió que cada cliente tiene un campo "id" distinto, por lo que la caja NAT puede distinguir los paquetes de respuesta que deben entregarse a cada cliente
- El autor exploró el código fuente de Linux y la RFC 792, que define el protocolo ICMP, para entender cómo se elige el ID
- El autor descubrió que el comando
ping elige aleatoriamente el identificador y que, si dos procesos ping en hosts distintos eligen el mismo ID, el kernel de Linux selecciona aleatoriamente un puerto libre, y ese puerto se usa como el ID del paquete ICMP
- El autor rastreó funciones del kernel y usó una herramienta llamada
bpftrace para validar su comprensión del código de netfilter
- La conclusión del artículo es que Linux hace NAT para
ping creando una conexión para cada cliente, reescribiendo la dirección IP de origen y/o el campo ID de ICMP en los paquetes salientes, y luego invirtiendo esas modificaciones en los paquetes de respuesta
- El artículo ofrece una explicación detallada paso a paso del proceso, de forma accesible para ingenieros de software de nivel inicial con conocimientos técnicos básicos
1 comentarios
Opinión de Hacker News