Antes de comenzar a quedarnos sin direcciones IPv4, no utilizamos (ampliamente) NAT. Cada computadora conectada a Internet tendría su propia dirección global única. Cuando se introdujo NAT por primera vez, fue pasar de dar a los clientes de ISP 1 dirección real por dispositivo que el cliente usó / poseyó para dar a 1 cliente 1 dirección real. Eso solucionó el problema por un tiempo (años) mientras se suponía que íbamos a cambiar a IPv6. En lugar de cambiar a IPv6, (en su mayoría) todos esperaron a que todos cambiaran y, por lo tanto, (en su mayoría) nadie lanzó IPv6. Ahora estamos enfrentando el mismo problema nuevamente, pero esta vez, se está implementando una segunda capa de NAT (CGN) para que los ISP puedan compartir 1 dirección real entre múltiples clientes.
El agotamiento de la dirección IP no es un gran problema si NAT no es terrible, incluso en el caso en que el usuario final no tiene control sobre él (Carrier Grade NAT o CGN).
Pero yo diría que NAT es terrible, especialmente en el caso en que el usuario final no tiene control sobre él. Y (como una persona cuyo trabajo es ingeniería / administración de redes pero tiene un título en ingeniería de software), diría que al implementar NAT en lugar de IPv6, los administradores de red han trasladado el peso de resolver el agotamiento de la dirección de su campo a los usuarios finales. y desarrolladores de aplicaciones.
Entonces (en mi opinión), ¿por qué NAT es algo terrible y malvado que debería evitarse?
Veamos si puedo hacerle justicia al explicar lo que rompe (y qué problemas causa que nos hayamos acostumbrado tanto que ni siquiera nos damos cuenta de que podría ser mejor):
- Independencia de la capa de red
- Conexiones de igual a igual
- Nomenclatura constante y ubicación de recursos
- Enrutamiento óptimo del tráfico, los hosts conocen su dirección real
- Seguimiento de la fuente del tráfico malicioso
- Protocolos de red que separan datos y control en conexiones separadas
Veamos si puedo explicar cada uno de esos elementos.
Independencia de la capa de red
Se supone que los ISP simplemente pasan paquetes de capa 3 y no les importa lo que hay en las capas superiores. Ya sea que esté pasando por TCP, UDP o algo mejor / más exótico (¿SCTP tal vez? cuidado; se supone que todo debe parecerles datos.
Pero no es así, no cuando están implementando la "segunda ola" de NAT, "Carrier Grade" NAT. Luego, necesariamente tienen que mirar y apoyar los protocolos de capa 4 que desea usar. En este momento, eso prácticamente significa que solo puede usar TCP y UDP. Otros protocolos simplemente serían bloqueados / descartados (la gran mayoría de los casos en mi experiencia) o simplemente reenviados al último host "dentro" del NAT que usó ese protocolo (he visto 1 implementación que hace esto). Incluso reenviar al último host que usó ese protocolo no es una solución real: tan pronto como lo usan dos hosts, se rompe.
Me imagino que hay algunos protocolos de reemplazo para TCP y UDP que actualmente no se han probado ni utilizado solo por este problema. No me malinterpreten, TCP y UDP fueron impresionantemente bien diseñados y es sorprendente cómo ambos han podido ampliar la forma en que usamos Internet hoy. ¿Pero quién sabe lo que nos hemos perdido? He leído sobre SCTP y suena bien, pero nunca lo usé porque no era práctico debido a NAT.
Conexiones de igual a igual
Este es un grande. En realidad, el más grande en mi opinión. Si tiene dos usuarios finales, ambos detrás de su propio NAT, sin importar cuál intente conectarse primero, el NAT del otro usuario descartará su paquete y la conexión no tendrá éxito.
Esto afecta los juegos, el chat de voz / video (como Skype), el alojamiento de sus propios servidores, etc.
Hay soluciones alternativas. El problema es que esas soluciones cuestan tiempo de desarrollador, tiempo e inconvenientes para el usuario final o costos de infraestructura de servicio. Y no son infalibles y a veces se rompen. (Vea los comentarios de otros usuarios sobre la interrupción que sufrió Skype).
Una solución alternativa es el reenvío de puertos, donde se programa el dispositivo NAT para reenviar un puerto entrante específico a una computadora específica detrás del dispositivo NAT. Hay sitios web completos dedicados a cómo hacer esto para todos los diferentes dispositivos NAT que existen. Ver https://portforward.com/ . Esto generalmente le cuesta tiempo y frustración al usuario final.
Otra solución es agregar soporte para cosas como perforar agujeros en las aplicaciones y mantener la infraestructura del servidor que no está detrás de un NAT para introducir dos clientes NAT. Por lo general, esto cuesta tiempo de desarrollo y coloca a los desarrolladores en una posición de mantenimiento potencial de la infraestructura del servidor donde no habría sido requerida previamente.
(¿Recuerda lo que dije sobre la implementación de NAT en lugar de que IPv6 transfiriera el peso del problema de los administradores de red a los usuarios finales y desarrolladores de aplicaciones?)
Nomenclatura / ubicación constante de los recursos de la red
Debido a que se usa un espacio de direcciones diferente en el interior de un NAT y luego en el exterior, cualquier servicio ofrecido por un dispositivo dentro de un NAT tiene múltiples direcciones para llegar a él, y el correcto para usar depende de dónde esté accediendo el cliente desde él. . (Esto sigue siendo un problema incluso después de que funcione el reenvío de puertos).
Si tiene un servidor web dentro de un NAT, digamos en el puerto 192.168.0.23 puerto 80, y su dispositivo NAT (enrutador / puerta de enlace) tiene una dirección externa de 35.72.216.228, y configura el reenvío de puertos para el puerto TCP 80, ahora su Se puede acceder al servidor web utilizando 192.168.0.23 puerto 80 O 35.72.216.228 puerto 80. El que debe usar depende de si está dentro o fuera del NAT. Si está fuera de NAT y usa la dirección 192.168.0.23, no llegará a donde esperaba. Si está dentro de NAT y usa la dirección externa 35.72.216.228, puede llegar a donde quiera, si su implementación de NAT es avanzada y admite horquilla, pero el servidor web que atiende su solicitud verá que la solicitud proviene de su dispositivo NAT. Esto significa que todo el tráfico debe pasar por el dispositivo NAT, incluso si hay una ruta más corta en la red detrás de NAT, y significa que los registros en el servidor web se vuelven mucho menos útiles porque todos enumeran el dispositivo NAT como la fuente de la conexión. Si su implementación NAT no es compatible, entonces no llegará a donde esperaba ir.
Y este problema empeora tan pronto como usa DNS. De repente, si desea que todo funcione correctamente para algo alojado detrás de NAT, tendrá que dar diferentes respuestas sobre la dirección del servicio alojado dentro de un NAT, en función de quién pregunta (también conocido como DNS de horizonte dividido, IIRC). Yuck
Y eso es todo suponiendo que tenga a alguien con conocimientos sobre el reenvío de puertos y la NAT de horquilla y DNS de horizonte dividido. ¿Qué pasa con los usuarios finales? ¿Cuáles son sus posibilidades de configurar todo esto correctamente cuando compran un enrutador de consumo y alguna cámara de seguridad IP y quieren que "funcione"?
Y eso me lleva a:
Enrutamiento óptimo del tráfico, los hosts conocen su dirección real
Como hemos visto, incluso con el tráfico avanzado de NAT no siempre fluye a través de la ruta óptima. Eso es incluso en el caso en que un administrador experto configura un servidor y tiene una horquilla NAT. (Por supuesto, el DNS de horizonte dividido puede conducir a un enrutamiento óptimo del tráfico interno en manos de un administrador de red).
¿Qué sucede cuando un desarrollador de aplicaciones crea un programa como Dropbox y lo distribuye a usuarios finales que no se especializan en la configuración de equipos de red? Específicamente, ¿qué sucede cuando pongo un archivo de 4GB en mi archivo compartido y luego trato de acceder en la próxima computadora? ¿Se transfiere directamente entre las máquinas o tengo que esperar a que se cargue en un servidor en la nube a través de una conexión WAN lenta y luego esperar una segunda vez para que se descargue a través de la misma conexión WAN lenta?
Para una implementación ingenua, se cargaría y luego se descargaría, utilizando la infraestructura del servidor de Dropbox que no está detrás de un NAT como mediador. Pero si las dos máquinas solo pudieran darse cuenta de que están en la misma red, entonces podrían transferir directamente el archivo mucho más rápido. Entonces, para nuestro primer intento de implementación menos ingenuo, podríamos preguntarle al sistema operativo qué direcciones IP (v4) tiene la máquina, y luego verificar eso con otras máquinas registradas en la misma cuenta de Dropbox. Si está en el mismo rango que nosotros, simplemente transfiera el archivo directamente. Eso podría funcionar en muchos casos. Pero incluso entonces hay un problema: NAT solo funciona porque podemos reutilizar direcciones. Entonces, ¿qué pasa si la dirección 192.168.0.23 y la 192.168.0. 42 direcciones registradas en la misma cuenta de Dropbox en realidad están en diferentes redes (como su red doméstica y su red de trabajo)? Ahora debe volver a utilizar la infraestructura del servidor de Dropbox para mediar. (Al final, Dropbox intentó resolver el problema haciendo que cada cliente de Dropbox transmitiera en la red local con la esperanza de encontrar otros clientes. Pero esas transmisiones no cruzan ningún enrutador que pueda tener detrás del NAT, lo que significa que no es una solución completa ,especialmente en el caso de CGN .)
IP estáticas
Además, dado que la primera escasez (y la ola de NAT) sucedió cuando muchas conexiones de consumidores no siempre estaban en conexiones (como el acceso telefónico), los ISP podrían hacer un mejor uso de sus direcciones asignando solo direcciones IP públicas / externas cuando estaba realmente conectado. Eso significaba que cuando te conectabas, obtenías cualquier dirección disponible, en lugar de obtener siempre la misma. Eso hace que la ejecución de su propio servidor sea mucho más difícil, y hace que el desarrollo de aplicaciones punto a punto sea más difícil porque necesitan tratar con pares que se mueven en lugar de estar en direcciones fijas.
Ofuscación de la fuente del tráfico malicioso
Debido a que NAT reescribe las conexiones salientes para que provengan del propio dispositivo NAT, todo el comportamiento, bueno o malo, se incluye en una dirección IP externa. No he visto ningún dispositivo NAT que registre cada conexión saliente de forma predeterminada. Esto significa que, de manera predeterminada, la fuente del tráfico malicioso anterior solo se puede rastrear hasta el dispositivo NAT por el que pasó. Si bien se pueden configurar más equipos de clase empresarial o de operador para registrar cada conexión saliente, no he visto ningún enrutador de consumidor que lo haga. Ciertamente creo que será interesante ver si (y durante cuánto tiempo) los ISP mantendrán un registro de todas las conexiones TCP y UDP realizadas a través de CGN a medida que las implementen. Dichos registros serían necesarios para tratar las quejas de abuso y las quejas de la DMCA.
Algunas personas piensan que NAT aumenta la seguridad. Si lo hace, lo hace a través de la oscuridad. La caída predeterminada del tráfico entrante que NAT hace obligatorio es lo mismo que tener un firewall con estado. Tengo entendido que cualquier hardware capaz de hacer el seguimiento de conexión necesario para NAT debería poder ejecutar un firewall con estado, por lo que NAT realmente no merece ningún punto allí.
Protocolos que usan una segunda conexión
Los protocolos como FTP y SIP (VoIP) tienden a usar conexiones separadas para el control y el contenido de datos real. Cada protocolo que hace esto debe tener un software auxiliar llamado ALG (puerta de enlace de capa de aplicación) en cada dispositivo NAT que atraviesa, o solucionar el problema con algún tipo de mediador o perforación. En mi experiencia, los ALG rara vez se actualizan o alguna vez han sido la causa de al menos un par de problemas que he tratado con SIP. Cada vez que escucho a alguien informar que VoIP no funcionó para ellos porque el audio solo funcionó de una manera, instantáneamente sospecho que en algún lugar, hay una puerta de enlace NAT que deja caer paquetes UDP con los que no puede averiguar qué hacer.
En resumen, NAT tiende a romperse:
- protocolos alternativos a TCP o UDP
- sistemas de igual a igual
- acceder a algo alojado detrás de NAT
- cosas como SIP y FTP. Los ALG para evitar esto todavía causan problemas aleatorios y extraños hoy, especialmente con SIP.
En esencia, el enfoque por capas que adopta la pila de red es relativamente simple y elegante. Trate de explicárselo a alguien nuevo en las redes, e inevitablemente asumen que su red doméstica es probablemente una red buena y simple para tratar de entender. En un par de casos, he visto esto conducir a algunas ideas bastante interesantes (excesivamente complicadas) sobre cómo funciona el enrutamiento debido a la confusión entre las direcciones externas e internas.
Sospecho que sin NAT, VoIP sería omnipresente e integrado con la PSTN, y que realizar llamadas desde un teléfono celular o computadora sería gratis (a excepción de Internet que ya pagó). Después de todo, ¿por qué pagaría el teléfono cuando usted y yo podemos abrir una transmisión VoIP de 64K y funciona tan bien como la PSTN? Parece que hoy, el problema número 1 con la implementación de VoIP está pasando por dispositivos NAT.
Sospecho que generalmente no nos damos cuenta de lo simples que podrían ser muchas cosas si tuviéramos la conectividad de extremo a extremo que NAT rompió. La gente todavía envía sus propios correos electrónicos (o Dropbox) porque es el problema principal de necesitar un mediador para cuando dos clientes están detrás de NAT.