Cómo funciona NAT para protocolos no estándar o poco comunes (o sin procesar)

4

Para usuarios de TCP y UDP NAT información del puerto. Para otros protocolos como ICMP, puede usar trucos específicos del protocolo. ¿Qué sucede si se usa un protocolo IP que no se atiende o no se reconoce?

¿Puede un paquete así salir de la interfaz de destino? Si es así, ¿qué pasa? ¿Se acaba de cambiar la IP de origen? ¿Qué pasa en el camino de regreso? ¿Es posible que un paquete de retorno pueda ir a la dirección IP incorrecta? ¿Quizás incluso todos los ips disponibles?

Andrew Parker
fuente

Respuestas:

7

Para usuarios de TCP y UDP NAT información del puerto. Para otros protocolos como ICMP, puede usar trucos específicos del protocolo.

Bueno, los mismos TCP y UDP también son "trucos específicos del protocolo": en realidad no son diferentes de los "ID de solicitud" de ICMP Echo o los "SPI" de IPsec. (NAT en sí es un 'truco').

¿Puede un paquete así salir de la interfaz de destino? Si es así, ¿qué pasa? ¿Se acaba de cambiar la IP de origen?

Por lo general, si. La mayoría de los NAT pasarán a través de dichos paquetes incluso si no reconocen el protocolo interno, ya que aún tiene una mayor probabilidad de funcionar que "descartar todo".

¿Qué pasa en el camino de regreso?

Depende de si el NAT realmente realizó un seguimiento del paquete saliente. (Varía.)

Incluso si el NAT no comprende cómo extraer puertos o ID fuera del protocolo interno, aún puede realizar un seguimiento del tipo de protocolo , que podría ser suficiente para algunas situaciones. (Cada paquete de IP tiene un campo de tipo de protocolo, por lo que lo que llama "IP sin procesar" es simplemente un caso de "tipo de protocolo de IP desconocido").

Por ejemplo, una conexión TCP (protocolo IP 6) y un ping ICMP (protocolo IP 1, ICMP tipo 8) se rastrearían como:

  • host 192.168.1.2 (as 42.0.2.1) → 62.205.132.12` proto 6`port 21445 → 80
  • host 192.168.1.2 (as 42.0.2.1) → 62.205.132.12` proto 1`type 8 code 0 id 1227

Mientras tanto, un protocolo no reconocido como un túnel 6in4 se rastrearía como:

  • host 192.168.1.2 (as 42.0.2.1) → 62.205.132.12` proto 41`

Por lo tanto, todos los protocolos-41 paquetes entrantes se enviarían de vuelta a 192.168.1.2. Esto significa que una computadora aún podría hablar el protocolo, pero dos computadoras a la vez probablemente no. (Al igual que con UDP, algunos NAT también verifican la dirección IP de origen, pero muchos solo se preocupan por el protocolo y el puerto).

Si bien he utilizado 6en4 en el ejemplo anterior, la misma también sucedería con todos los protocolos que la NAT no entiende, aunque lo tienen puertos (por ejemplo, UDP-Lite o SCTP).

  • Aparte: si su enrutador ejecuta Linux, puede ejecutar conntrack -Lo cat /proc/net/nf_conntrackver todos los estados que se están rastreando actualmente. Algunos enrutadores incluso muestran esto en su interfaz de usuario web.

Finalmente, si el NAT no mantuvo ningún estado, entonces se supone que el paquete está destinado al enrutador (igual que con cualquier otro paquete entrante no rastreado), y generalmente se cae al suelo.

¿Es posible que un paquete de retorno pueda ir a la dirección IP incorrecta?

En el caso más simple, no. O el NAT puede asociar el paquete de retorno con algún estado conocido, o no puede, pero no generará basura al azar. (Generalmente.)

Sin embargo, si dos computadoras detrás de la LAN están tratando de hablar el mismo protocolo al mismo host remoto, entonces sus estados pueden entrar en conflicto. El que gana puede variar: o el estado más antiguo se usa hasta que caduca (por lo que las respuestas para ambas computadoras continúan yendo al primero), o se anulan mutuamente cada cierto tiempo (es decir, cambia de lugar entre ambos). Es una situación en la que NAT dinámica definitivamente no fue diseñada para ...

¿Quizás incluso todos los ips disponibles?

No. Es posible en teoría, por ejemplo, algunas personas hacen esto con configuraciones de reenvío de puertos estáticos para Wake-on-LAN, pero hacerlo de forma predeterminada no sería muy útil. En todo caso, haría que su LAN sea más vulnerable a los paquetes falsificados.

(Aunque, de hecho, así es como funciona la conmutación de Ethernet: los paquetes para MAC desconocidos se inundan a través de todos los puertos físicos).


Como nota al margen, esto no es realmente específico para los NAT IPv4. El seguimiento de estado es una parte integral de un firewall con estado , utilizado tanto por IPv4 como por IPv6. Incluso sin NAT / PAT, el seguimiento de estado también permite que el firewall acepte automáticamente todos los paquetes conocidos y rechace los desconocidos.

Entonces, cuando las personas afirman que "NAT agrega seguridad", en realidad están hablando de la configuración del firewall que generalmente viene con él (y se puede usar igualmente bien sin NAT).

Gravedad
fuente
Gracias muy útil. Esto golpea la mayoría de los puntos clave en los que estaba pensando. El punto más interesante para mí, que es algo que pensé que era posible, es el conflicto con dos hosts que intentan hablar el mismo protocolo. El principal caso de uso que tengo en mente es la conexión de los clientes a una VPN. Me preocupaba que en algunas situaciones (ciertamente, probablemente raras) habría, en el mejor de los casos, problemas de confiabilidad y, en el peor, posibles agujeros de seguridad. Parece que mi comprensión de NAT es bastante buena y si necesito decir concretamente qué va a suceder, tendré que profundizar en el código del kernel.
Andrew Parker el
Además, a riesgo de volverse subjetivo, algunos consejos sobre fuentes de verdad exacta serían útiles, por ejemplo, documentos específicos de Linux o archivos fuente.
Andrew Parker el
Puede haber problemas de confiabilidad con PPTP (debido a la falta de puertos GRE, pero PPTP ya debería morir), y a veces con IPsec (aunque la mayoría de los clientes admiten NAT-T a través de UDP en la actualidad). Muchos otros productos VPN ejecutan todo a través de UDP y no tienen problemas, aunque necesitan hacer ping al servidor con frecuencia para evitar el vencimiento del estado.
Grawity
Para NAT implementado en Linux, vea net/netfilter/nf_conntrack*.c(donde se implementa el seguimiento de estado) y la conntrackherramienta (para examinar exactamente qué estados se conocen en este momento).
Grawity
2

NAT es un tema interesante.

Hay tres tipos de NAT:

  • Estático
  • Dinámica
  • PALMADITA

PAT es lo que usan la mayoría de los enrutadores de consumo, así que vamos por ese.

Imaginemos que tengo este diseño en casa:

Router   192.168.0.1
PC 1     192.168.0.2
PC 2     192.168.0.3
External IP 1.1.1.1 (Lets assume I have that one)

Mis dos computadoras quieren conectarse a www.superuser.com que tiene la ip 151.101.65.69.

Cargo mi navegador en PC1 y escribo www.superuser.com y sucede lo siguiente:

  • Mi computadora le pide a mi servidor DNS que resuelva www.superuser.com a una IP
  • El servidor DNS regresa con 151.101.65.69
  • Mi computadora abre un número de puerto fuente aleatorio, digamos 40000 en este caso.
  • Mi computadora envía un paquete a 151.101.65.69 desde la fuente 192.168.0.2 y coloca la secuencia número 1 en él.
  • El enrutador intercepta ese paquete y cambia la fuente de 192.168.0.2 a nuestro 1.1.1.1 y toma nota de que proviene de 192.168.0.2:40000.
  • El superusuario obtiene el paquete y envía una respuesta a 1.1.1.1
  • El enrutador recibe la respuesta, mira el número de secuencia y dice "Ajá, eso es para 192.168.0.2, es mejor que se lo envíe al puerto 40000, lo espera.

Al mismo tiempo, la PC 2 podría pasar al mismo proceso, pero lo más probable es que elija un puerto separado. El enrutador toma nota de estos números de puerto y baraja el tráfico según sea necesario al destino correcto.

El enrutador mantendrá una tabla como esta:

Source              Destination
192.168.0.2:40000   151.101.65.69:80
192.168.0.3:56944   151.101.65:69:80

Ahora pregunta: "Pero Lister, ¿qué sucede si el número de puerto aleatorio que has elegido ya está en uso? ¡Has roto el sistema Lister!" Eso está completamente bien, el enrutador incrementará el número de puerto en su lista al siguiente disponible, pero recordará enviar la información del puerto correcto a la PC.

Lister
fuente
La pregunta era principalmente sobre protocolos en los que el dispositivo NAT no sabe cómo extraer puertos (o donde no existe un puerto o ID de solicitud).
Grawity
1
Ah, sí, he escrito una buena respuesta para la pregunta ligeramente incorrecta mirando tu respuesta.
Lister el