O que é NAT ?

Devido à escassez de endereços IPV4, uma solução que começou a ganhar força foi a utilização de NAT (Network Address Translation).

English version: Click Here

Dessa forma, o NAT permite que máquinas de dentro de uma rede se comuniquem com outra rede como se estivessem saindo de um mesmo IP. 

Consequentemente, se estamos em uma rede privada com 50 computadores, poderíamos ter apenas um IP público. Como existe escassez de IPs públicos IPV4, a solução do uso de NAT é bem vantajosa. 

As comunicações com a internet utilizam o IP público enquanto na rede privada, podemos usar IPs reservados para uso privado.

Vale ressaltar que IPs privados não funcionam na internet. Isso porque os roteadores são programados para descartar IPs que estão na categoria de IPs privados. 

A figura 1 apresenta uma rede onde a interface LAN do roteador atende a rede privada e a interface WAN atende a rede pública da Internet.

Dessa forma, para esse cenário, podemos supor que o administrador de rede necessita apenas de um IP público. Isso porque as outras 3 máquinas internas utilizam IPs privados. 

A figura 2 apresenta um bloco de IPs privados que podem ser livremente utilizados dentro de redes internas.

Dessa forma, o administrador de rede pode utilizar diferentes máscaras de rede com esses blocos de IPs para dar endereços para seus dispositivos.

Vale ressaltar que além dos 2 blocos apresentados na figura 2, existe o bloco 169.254.0.0/16. No entanto, esse último bloco não é utilizado para o NAT. 

Alguns tipos de NAT

Static NAT : faz o mapeamento entre um IP privado e outro IP público.
Assim, utiliza um mapeamento um para um.
Dynamic NAT: faz o mapeamento de endereços privados em um
conjunto de endereços públicos.
PAT Port Address Translation: Faz o mapeamento entre endereços
privados e públicos utilizando as portas da camada de transporte.
(muito utilizado)
Esse será o NAT abordado nessa aula

Como funciona o NAT?

O NAT vai utilizar uma tabela com endereços IP e Portas para encaminhar tráfego entre os hosts da rede interna e os hosts da rede externa.​

Na Figura 3 podemos ver o primeiro pacote saindo do IP 192.168.0.3 indo em direção ao servidor HTTP. 

Dessa forma, podemos verificar que o pacote sai com endereço IP de origem = 192.168.0.3 e com uma porta de origem = 3000 TCP. Consequentemente, vale a pena mencionar que essa porta foi escolhida aleatoriamente. 

 Assim, devemos lembrar que no modelo cliente servidor do TCP/IP os clientes geralmente utilizam portas aleatórias para se comunicar com portas de servidores.

Por outro lado, as portas dos servidores devem preferencialmente ser bem conhecidas. Isso porque o cliente precisa saber em qual porta deve se conectar. 

Então, podemos observar que o IP de destino usado no pacote IP será o IP do servidor HTTP Server e a porta destino = 80.

Dessa forma, o cliente já sabe que está acessando um servidor e que esse servidor escuta na porta 80 TCP.

Adicionalmente, sabemos que a porta 80 TCP é utilizada para prestar o serviço de prover páginas http. Portanto, a porta 80 TCP é usada pelo protocolo HTTP. 

Agora podemos verificar que o pacote 1 já passou pelo NAT, Figura 4. Dessa forma, estamos apresentando o NAT no modelo PAT.

Ou seja, utilizamos portas da camada de transporte para fazer a tradução entre máquinas da rede interna e IPs públicos. 

Podemos observar que a origem do pacote é modificada. Isso porque o NAT, precisa alterar o IP de origem pois o IP privado 192.168.0.3 não pode existir na internet. Nesse o IP é alterado para o IP público do rotador que realiza o NAT.  

Adicionalmente, o NAT também altera a porta de origem. Em muitos casos as pessoas se perguntam: por que não pode usar a mesma porta?  

A resposta para essa pergunta é simples e está no fato de que o NAT não pode evitar que dois ou mais hosts usem a mesma porta para se comunicar com um IP da rede pública. Dessa forma, o NAT altera a porta de origem para uma porta disponível em seu conjunto de portas.  

Quando uma máquina da rede interna se comunica com outros IPs públicos o NAT precisa criar uma tabela.

Essa tabela é utilizada para que o NAT mantenha o estado da comunicação entre o host interno e o host que tem um ip público.  

Além disso, a tabela NAT é importante para garantir que quando houver uma resposta da comunicação, essa possa voltar.

Consequentemente, utilizando a tabela NAT o roteador que faz o NAT pode redirecionar o tráfego de resposta para o host que iniciou a comunicação. 

O NAT é mais seguro?

O NAT proporciona uma segurança adicional para as máquinas que estão dentro da rede privada. Isso porque as máquinas que possuem um IP privado não podem ser vistas diretamente pelos hosts que estão na Internet. 

Dessa forma, o NAT proporciona que o acesso às máquinas com IPs públicos seja impedido, a menos que a máquina privada inicie a comunicação.  

Assim, quando uma máquina com IP privado inicia a comunicação com uma máquina de IP público o IP da máquina privada será traduzido para o IP público do roteador NAT. 

Entretanto, as máquinas ainda estão vulneráveis a ataques que fazem com que as máquinas internas iniciem a comunicação como por exemplo o shell reverso.  

NAT viola a regra de camadas ?

Alguns autores argumentam que o NAT viola a regra das camadas. Isso porque o NAT faz com que um roteador faça alterações na camada de transporte ao mudar a porta de origem. 

Entretanto, apesar dessa questão de violar as camadas, o NAT tem sido uma ferramenta extremamente útil com o passar dos anos.  

Como funciona a resposta do pacote no NAT?

A resposta das comunicações entre a rede privada e os IPs públicos acontece utilizando a tabela NAT, FIgura 6 e Figura 7. 

Dessa forma, quando uma resposta chega ao IP público do roteador, esse vai verificar qual a porta de destino e se essa porta está em sua tabela NAT.

Assim, se a porta de destino estiver mapeada em sua tabela NAT a tabela NAT será usada para saber para onde o pacote deverá ser encaminhado.

Dessa forma, a tabela NAT é essencial para que o retorno das comunicações ocorra de forma correta.  

NAT com 2 PCs na rede LAN

Agora vamos adicionar uma segunda máquina 192.168.0.2 e vamos iniciar uma comunicação com o mesmo servidor WEB.

Dessa forma, pretendemos demonstrar a forma como o NAT trata dois clientes internos realizado comunicações com IPs públicos. 

Inicialmente, Figura 8, o computador 192.168.0.2 inicia sua comunicação e escolhe uma porta aleatória, nesse caso a porta escolhida foi 9000 TCP.

Portanto, o endereço de origem agora é 192.168.0.2 e a porta de origem é a 9000 TCP. Os endereços de destino permanecem os mesmos da comunicação anterior. Ou seja,  IP de destino = IP público do servidor WEB e porta de destino = 80 TCP. 

Após passar pelo NAT, Figura 9, o pacote originado no computador 192.168.0.2 é modificado. Nessa modificação o IP de origem e a porta de origem são modificadas.

Dessa forma, após o NAT, temos o pacote com os endereços de origem IP = IP público do roteador NAT e porta 4400 TCP.

Entretanto, o IP de destino e a porta de destino permanecem as mesmas. Ou seja, IP de destino = IP do servidor WEB e porta de destino = 80 TCP. 

Finalmente, vamos analisar a tabela NAT. Então, após o início da comunicação dos computadores representados pelos IPs 192.168.0.3 e 192.168.0.2  temos a tabela NAT formada no roteador que está fazendo o NAT.

Dessa forma, o NAT consegue distinguir os diferentes fluxos de máquinas internas e suas comunicações externas utilizando os IPs e as portas na tabela NAT. 

Port Forwarding

Agora vamos falar do Port Forwarding. O port forwarding é extremamente importante quando queremos compartilhar um serviço que está atrás de um NAT. 

Dessa forma, se desejamos que um servidor WEB em uma rede interna seja exposto na internet, podemos usar o port forwarding. 

Nesse exemplo, vamos supor que o computador representado pelo IP 192.168.0.3 deseja expor seu servidor WEB, Figura 11.

Sabemos que por padrão um servidor WEB HTTP vai ouvir na porta 80 TCP. Portanto precisamos criar uma regra no NAT para permitir que acessos originados de IPs públicos possam acessar a máquina 192.168.0.3 na porta 80 TCP. 

Para isso, vamos criar um port forwarding na tabela do roteador NAT, Figura 12.

Dessa forma vamos criar uma regra que indica que tudo que chegar na interface de IP público do roteador NAT na porta 80 TCP será direcionado para o IP 192.168.0.3 na porta 80 TCP.

Assim, permitimos que conexões oriundas de IPs públicos se comuniquem diretamente com o IP público do roteador NAT. Consequentemente, permitimos que o acesso ao servidor HTTP do host 192.168.0.3 seja acessado externamente. 

No entanto, vale lembrar que as máquinas externas apenas se comunicam com o IP público do roteador NAT. 

Dessa forma, quando um IP fictício 1.2.3.4 inicia a comunicação com o servidor WEB, deve indicar como destino do pacote o IP público do roteador NAT e a porta mapeada no port fowarding = 80 TCP. 

Após o pacote passar pelo port forwarding, os endereços de destino são alterados para permitir o redirecionamento do pacote para o servidor WEB dentro da rede interna, Figura 14.

Dessa forma, o IP de destino é modificado para 192.168.0.3 e a porta continua a mesma 80 TCP.

Entretanto, apesar da porta continuar a mesma, seria perfeitamente possível utilizar uma porta interna diferente da porta mapeada externamente no port  forwarding. 

Temos um exercício resolvido com NAT: https://youtu.be/azpBws4QPOc

Veja Mais

Protocolo HTTP – Como funciona?

Métodos HTTP

 ​Cookies – HTTP Protocol

Juliana Mascarenhas

Data Scientist and Master in Computer Modeling by LNCC.
Computer Engineer