2 puntos por GN⁺ 2023-09-11 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2023-09-11
Opinión de Hacker News
  • Artículo sobre cómo la traducción de direcciones de red (NAT) de Linux maneja solicitudes de ping
  • El servidor envía paquetes fijos de solicitud de eco ICMP a una dirección fija, y no se espera que regresen
  • Cuando el cliente intenta conectarse, envía al servidor un paquete ICMP de tiempo excedido que incluye el paquete fijo "original" que el servidor estaba enviando
  • El cliente actúa como si fuera un salto de Internet para informar al servidor que el paquete original no pudo entregarse
  • El dispositivo NAT reenvía el ICMP de tiempo excedido al servidor detrás del NAT, incluyendo el encabezado IP completo del cliente, lo que permite que el servidor conozca la dirección IP del cliente
  • Cuando se envía un ping desde la red local a un dispositivo en Internet, el router que realiza NAT reescribe la dirección de origen del ping con la dirección IP pública y reescribe el campo ID del paquete ICMP con un valor único
  • El router usa ese valor de ID único para entregar la respuesta al dispositivo correcto dentro de la red local
  • La publicación también ofrece material sobre una herramienta llamada Netfilter, usada para manipulación de paquetes, traducción de direcciones de red y filtrado de paquetes
  • El artículo recibe elogios por profundizar en el análisis a través de todas las capas de abstracción hasta llegar al código fuente
  • Como ICMP no tiene puertos, NAT no necesita resolver el problema de devolver las respuestas de eco ICMP al puerto correcto
  • Las solicitudes de eco ICMP tienen un ID, que en la práctica es equivalente a un número de puerto de origen
  • El manejo de NAT para eco ICMP requiere remapear el ID en ambos sentidos, de forma similar a como UDP remapea el puerto de origen
  • Algunos usuarios expresan molestias por enlazar líneas específicas de código en publicaciones de blog, debido a cambios con el tiempo
  • Algunos usuarios critican a NAT como una mala abstracción y piden el fin de IPv4
  • Se especula sobre la posibilidad de enviar mensajes cortos para redes peer-to-peer usando ping sobre UDP sin un servidor central
  • El artículo se resume explicando que los paquetes ICMP tienen un campo ID y que Netfilter trata los paquetes ICMP como un "caso especial"