Antes de começarmos a ficar sem endereços IPv4, não usamos (amplamente) o NAT. Todo computador conectado à Internet teria seu próprio endereço globalmente exclusivo. Quando o NAT foi introduzido pela primeira vez, passou de fornecer aos clientes do ISP 1 endereço real por dispositivo que o cliente usava / possuía para fornecer 1 endereço real a 1 cliente. Isso resolveu o problema por um tempo (anos) enquanto devíamos mudar para o IPv6. Em vez de mudar para o IPv6, (principalmente) todos esperavam que todos mudassem e, portanto, (principalmente) ninguém lançava o IPv6. Agora, estamos enfrentando o mesmo problema novamente, mas desta vez, uma segunda camada de NAT está sendo implantada (CGN) para que os ISPs possam compartilhar um endereço real entre vários clientes.
A exaustão do endereço IP não é grande coisa se o NAT não for terrível, inclusive no caso em que o usuário final não tem controle sobre ele (NAT ou CGN de grau de operadora).
Mas eu argumentaria que o NAT é terrível, especialmente no caso em que o usuário final não tem controle sobre ele. E (como uma pessoa cujo trabalho é engenharia / administração de rede, mas possui um diploma em engenharia de software), eu argumentaria que, ao implantar o NAT em vez do IPv6, os administradores de rede mudaram o peso de resolver a exaustão de endereços fora de seu campo e para os usuários finais e desenvolvedores de aplicativos.
Então (na minha opinião), por que o NAT é uma coisa terrível e maligna que deve ser evitada?
Vamos ver se eu posso fazer justiça ao explicar o que quebra (e quais os problemas causados por nós nos acostumamos tanto que nem percebemos que poderia ser melhor):
- Independência da camada de rede
- Conexões ponto a ponto
- Nomeação e localização consistentes de recursos
- Roteamento ideal de tráfego, hosts sabendo seu endereço real
- Rastreando a origem do tráfego malicioso
- Protocolos de rede que separam dados e controlam em conexões separadas
Vamos ver se consigo explicar cada um desses itens.
Independência da camada de rede
Os ISPs devem apenas passar pacotes da camada 3 e não se importar com o que está nas camadas acima disso. Esteja você passando TCP, UDP ou algo melhor / mais exótico (talvez SCTP? Ou mesmo algum outro protocolo que seja melhor que TCP / UDP, mas que seja obscuro por falta de suporte a NAT), seu ISP não deve Cuidado; tudo deve parecer com dados para eles.
Mas isso não acontece - não quando eles estão implementando a "segunda onda" do NAT, NAT "Carrier Grade". Então eles necessariamente precisam examinar e dar suporte aos protocolos da camada 4 que você deseja usar. No momento, isso praticamente significa que você só pode usar TCP e UDP. Outros protocolos seriam apenas bloqueados / descartados (grande parte dos casos na minha experiência) ou apenas encaminhados para o último host "dentro" do NAT que usava esse protocolo (eu já vi 1 implementação que faz isso). Mesmo encaminhar para o último host que usou esse protocolo não é uma correção real - assim que dois hosts o usam, ele quebra.
Eu imagino que existem alguns protocolos de substituição para TCP e UDP por aí que atualmente não são testados e não são usados apenas por causa desse problema. Não me interpretem mal, o TCP e o UDP foram impressionantemente bem projetados e é incrível como os dois foram capazes de escalar a maneira como usamos a Internet hoje. Mas quem sabe o que perdemos? Eu li sobre o SCTP e parece bom, mas nunca o usei porque era impraticável por causa do NAT.
Conexões ponto a ponto
Este é um grande problema. Na verdade, o maior na minha opinião. Se você tiver dois usuários finais, ambos atrás do seu próprio NAT, não importa qual deles tente se conectar primeiro, o NAT do outro usuário descartará o pacote e a conexão não será bem-sucedida.
Isso afeta jogos, bate-papo por voz / vídeo (como o Skype), hospedando seus próprios servidores, etc.
Existem soluções alternativas. O problema é que essas soluções alternativas custam tempo do desenvolvedor, tempo do usuário final e inconveniência ou custos de infraestrutura de serviço. E eles não são infalíveis e às vezes quebram. (Veja os comentários de outros usuários sobre a interrupção sofrida pelo Skype.)
Uma solução alternativa é o encaminhamento de porta, em que você programa o dispositivo NAT para encaminhar uma porta de entrada específica para um computador específico atrás do dispositivo NAT. Existem sites inteiros dedicados a como fazer isso para todos os diferentes dispositivos NAT existentes no mercado. Consulte https://portforward.com/ . Isso normalmente custa tempo e frustração ao usuário final.
Outra solução alternativa é adicionar suporte a coisas como perfuração nos aplicativos e manter a infraestrutura do servidor que não está atrás de um NAT para apresentar dois clientes com NAT. Isso geralmente custa tempo de desenvolvimento e coloca os desenvolvedores em uma posição de manutenção potencial da infraestrutura do servidor, onde ela não seria necessária anteriormente.
(Lembre-se do que eu disse sobre a implantação do NAT em vez de o IPv6 mudar o peso do problema dos administradores de rede para usuários finais e desenvolvedores de aplicativos?)
Nomeação / localização consistente de recursos de rede
Como um espaço de endereço diferente é usado na parte interna de um NAT e no exterior, qualquer serviço oferecido por um dispositivo dentro de um NAT tem vários endereços para alcançá-lo, e o correto a ser usado depende de onde o cliente está acessando. . (Isso ainda é um problema, mesmo depois que o encaminhamento de porta está funcionando.)
Se você possui um servidor Web dentro de um NAT, digamos na porta 192.168.0.23, porta 80, e seu dispositivo NAT (roteador / gateway) possui um endereço externo 35.72.216.228, e você configura o encaminhamento de porta para a porta TCP 80, agora seu o servidor da web pode ser acessado usando a porta 80 ou 192.168.0.23 da porta 80 ou 35.72.216.228 porta 80. O que você deve usar depende se você está dentro ou fora do NAT. Se você estiver fora do NAT e usar o endereço 192.168.0.23, não chegará ao ponto esperado. Se você estiver dentro do NAT e usar o endereço externo 35.72.216.228, poderá chegar onde deseja, se a implementação do NAT for avançada e suportar hairpin, mas o servidor da web que atende sua solicitação verá a solicitação como proveniente do seu dispositivo NAT. Isso significa que todo o tráfego deve passar pelo dispositivo NAT, mesmo se houver um caminho mais curto na rede atrás do NAT, e significa que os logs no servidor da Web se tornam muito menos úteis, porque todos listam o dispositivo NAT como a fonte de a conexão. Se sua implementação de NAT não suportar hairpin, você não chegará aonde esperava.
E esse problema piora assim que você usa o DNS. De repente, se você deseja que tudo funcione corretamente para algo hospedado por trás do NAT, você deve dar respostas diferentes sobre o endereço do serviço hospedado dentro de um NAT, com base em quem está perguntando (AKA split horizon DNS, IIRC). Que nojo.
E isso pressupõe que você tenha alguém com conhecimento sobre encaminhamento de porta e NAT hairpin e DNS de horizonte dividido. E os usuários finais? Quais são as chances de que tudo esteja configurado corretamente quando eles compram um roteador de consumidor e uma câmera de segurança IP e querem que "funcione"?
E isso me leva a:
Roteamento ideal de tráfego, hosts sabendo seu endereço real
Como vimos, mesmo com o hairpin avançado, o tráfego NAT nem sempre flui através do caminho ideal. Isso ocorre mesmo no caso em que um administrador experiente configura um servidor e possui um NAT hairpin. (O DNS com divisão de horizonte concedido pode levar ao roteamento ideal do tráfego interno nas mãos de um administrador de rede.)
O que acontece quando um desenvolvedor de aplicativos cria um programa como o Dropbox e o distribui para usuários finais que não se especializam em configurar equipamentos de rede? Especificamente, o que acontece quando coloco um arquivo de 4 GB no meu arquivo de compartilhamento e tento acessar o próximo computador novamente? Ele é transferido diretamente entre as máquinas ou eu tenho que esperar o upload para um servidor em nuvem por meio de uma conexão WAN lenta e, em seguida, esperar uma segunda vez para fazer o download pela mesma conexão lenta WAN?
Para uma implementação ingênua, ela seria carregada e baixada, usando a infraestrutura de servidor do Dropbox que não está atrás de um NAT como mediador. Mas se as duas máquinas pudessem perceber que estão na mesma rede, elas poderiam transferir o arquivo diretamente muito mais rapidamente. Portanto, em nossa primeira tentativa de implementação menos ingênua, poderíamos perguntar ao sistema operacional qual o endereço IP (v4) da máquina e verificar isso com outras máquinas registradas na mesma conta do Dropbox. Se estiver no mesmo intervalo que nós, basta transferir diretamente o arquivo. Isso pode funcionar em muitos casos. Mas mesmo assim há um problema: o NAT funciona apenas porque podemos reutilizar endereços. E daí se o endereço 192.168.0.23 e o 192.168.0. 42 endereços registrados na mesma conta do Dropbox estão em redes diferentes (como sua rede doméstica e sua rede comercial)? Agora você deve voltar a usar a infraestrutura do servidor Dropbox para mediar. (No final, o Dropbox tentou resolver o problema fazendo com que cada cliente do Dropbox transmitisse na rede local na esperança de encontrar outros clientes. Mas essas transmissões não cruzam nenhum roteador que você possa ter por trás do NAT, o que significa que não é uma solução completa ,especialmente no caso da CGN .)
IPs estáticos
Além disso, como a primeira escassez (e onda de NAT) ocorreu quando muitas conexões de consumidores nem sempre estavam em conexões (como discagem), os ISPs poderiam usar melhor seus endereços alocando apenas endereços IP públicos / externos quando você estava realmente conectado. Isso significava que, quando você se conectava, obtinha qualquer endereço disponível, em vez de sempre obter o mesmo. Isso torna a execução do seu próprio servidor muito mais difícil e o desenvolvimento de aplicativos ponto a ponto, porque eles precisam lidar com os colegas que se deslocam ao invés de estarem em endereços fixos.
Ofuscação da fonte de tráfego malicioso
Como o NAT reescreve as conexões de saída como se fossem provenientes do próprio dispositivo NAT, todo o comportamento, bom ou ruim, é rolado em um endereço IP externo. Não vi nenhum dispositivo NAT que registrasse cada conexão de saída por padrão. Isso significa que, por padrão, a origem do tráfego malicioso passado só pode ser rastreada no dispositivo NAT pelo qual passou. Embora o equipamento da classe da empresa ou da operadora possa ser configurado para registrar cada conexão de saída, eu não vi nenhum roteador de consumidor que faça isso. Eu certamente acho que será interessante ver se (e por quanto tempo) os ISPs manterão um log de todas as conexões TCP e UDP feitas por meio de CGNs à medida que forem lançadas. Esses registros seriam necessários para lidar com reclamações de abuso e DMCA.
Algumas pessoas pensam que o NAT aumenta a segurança. Se isso acontecer, o faz através da obscuridade. A queda padrão do tráfego de entrada que o NAT torna obrigatório é o mesmo que ter um firewall com estado. Entendo que qualquer hardware capaz de fazer o rastreamento de conexão necessário para o NAT possa executar um firewall com estado, para que o NAT realmente não mereça nenhum ponto.
Protocolos que usam uma segunda conexão
Protocolos como FTP e SIP (VoIP) tendem a usar conexões separadas para controle e conteúdo de dados real. Cada protocolo que faz isso deve ter um software auxiliar chamado ALG (gateway da camada de aplicativo) em cada dispositivo NAT por onde passa ou solucionar o problema com algum tipo de mediador ou perfuração. Na minha experiência, os ALGs raramente são atualizados, e foram a causa de pelo menos alguns problemas com os quais eu lidei envolvendo o SIP. Sempre que ouço alguém relatar que o VoIP não funcionou para eles, porque o áudio só funcionou de uma maneira, suspeito instantaneamente que em algum lugar existe um gateway NAT que libera pacotes UDP e não consegue descobrir o que fazer.
Em resumo, o NAT tende a quebrar:
- protocolos alternativos ao TCP ou UDP
- sistemas ponto a ponto
- acessando algo hospedado atrás do NAT
- coisas como SIP e FTP. Os ALGs para contornar isso ainda causam problemas aleatórios e estranhos atualmente, especialmente com o SIP.
No núcleo, a abordagem em camadas adotada pela pilha de rede é relativamente simples e elegante. Tente explicá-lo a alguém novo na rede, e eles inevitavelmente assumem que sua rede doméstica é provavelmente uma rede boa e simples de tentar entender. Eu já vi isso levar em alguns casos a algumas idéias bastante interessantes (excessivamente complicadas) sobre como o roteamento funciona devido à confusão entre endereços externos e internos.
Eu suspeito que, sem o NAT, o VoIP seria onipresente e integrado à PSTN, e que fazer chamadas de um telefone celular ou computador seria gratuito (exceto pela Internet pela qual você já pagou). Afinal, por que eu pagaria pelo telefone quando você e eu podemos simplesmente abrir um fluxo de 64K VoIP e funciona tão bem quanto a PSTN? Hoje parece que o problema número 1 na implantação do VoIP está passando pelos dispositivos NAT.
Suspeito que geralmente não percebemos o quanto as coisas poderiam ser mais simples se tivéssemos a conectividade de ponta a ponta que o NAT quebrou. As pessoas ainda enviam por e-mail (ou Dropbox) os próprios arquivos porque se o problema principal é precisar de um mediador para quando dois clientes estão atrás do NAT.