O
NAT (
Network Address Translation) é o responsável por traduzir endereços para que as redes distintas consigam se comunicar, ou seja, é responsável pela comunicação dos hosts de uma empresa com o mundo, a Internet, por exemplo.
Também serve para que o acesso externo chegue a seu servidor Web localizado em sua rede interna, DMZ. Na prática, usamos muito o NAT para mascarar conexões, proxies transparentes, fazer SNAT (NAT Origem) e DNAT (NAT destino), redirecionamentos de portas etc.
Antes de começarmos a analisar as regras de NAT, devemos lembrar das nossas redes privadas.
Mas, para quê precisamos relembrar redes privadas?
Como visto anteriormente, uma das funções do NAT é compartilhar a Internet com uma rede privada, desta forma só para relembrar, podemos ver a seguir as redes privadas disponíveis:
- 10.0.0.0 - 10.255.255.255 ou 10.0.0.0/8 (máscara de rede 255.0.0.0)
- 172.16.0.0 - 172.31.255.255 ou 172.16.0.0/16 (máscara de rede 255.255.0.0)
- 192.168.0.0 - 192.168.255.255 ou 192.168.0.0/24 (máscara de rede 255.255.255.0)
As redes privadas não trafegam na Internet. Para isso, precisamos de um dispositivo que atue entre a rede privada e a Internet. Neste momento, entra em cena o nosso roteador
GNU/Linux com NAT. A solução com Linux é bem mais econômica do que outras soluções, como usar ferramentas proprietárias ou até hardwares. Assim, torna-se viável o uso do Linux com sistema de NAT.
O NAT trabalha reescrevendo os IPs de origem ou destino, que atravessam o firewall, então, quando um pacote é encaminhado para um servidor Web, o firewall reescreve o endereço IP de origem para que os pacotes possam chegar até o destino.
E quando este pacotes voltar, ele retornará como sendo endereço de destino, o nosso servidor (não teria como saber para quem realmente é este pacote sem as
connection tracks). Como o servidor já tem armazenadas informações sobre esta conexão, então ele reescreve os IPs de destino e os encaminha para quem os solicitou.
O nosso IPtables pode trabalhar em vários cenários diferentes, por exemplo:
- 1:1 - Um para um → Quando traduzimos um IP privado para um IP público;
- 1:N - Um para muitos → Quando traduzimos um IP privado por vários IPs públicos, por exemplo, se temos várias conexões com a Internet ou pelo menos mais de uma.
- N:1 - Muitos para um → Esse é o mais comum, pois temos uma rede privada para um IP público;
- N:N - Muitos para muitos → neste caso específico, temos mitos IPs privados ou uma rede, onde será traduzido para vários IPs públicos.
Após termos visto todos estes itens, podemos verificar os alvos comuns utilizados na tabela NAT. No NAT trabalhamos com três chains: PREROUTING, POSTROUTING e OUTPUT, e temos também alguns alvos específicos, como: DNAT, SNAT e MASQUERADE.
Utilizando SNAT
O SNAT faz parte da tabela NAT, ele faz a tradução de endereços e altera os endereços de origem (source nat).
Então, o SNAT é responsável por alterar os endereços de uma rede, e enviar para outra rede. Esta tradução poderá ser feita nos cenários que citamos: 1:1, 1:N etc.
Habilitando forwarding no kernel
Um item importantíssimo é habilitar o nosso kernel para permitir o encaminhamento de pacotes (IPv4 forward). Este item pode ser habilitado através da inserção do número 1 dentro do arquivo
/proc/sys/net/ipv4/ip_forward.
Podemos usar também o comando:
# sysctl -w net.ipv4.ip_forward=1
É importante atentar que, nas duas situações, as habilitações são perdidas após reiniciarmos as máquinas, desta forma devemos criar um script do tipo:
echo 1 > /proc/sys/net/ipv4/ip_forward
Podemos fazer da seguinte forma também:
systcl -w net.ipv4.ip_forward=1
Também podemos editar o arquivo
/etc/sysctl.conf e adicionar a seguinte linha:
net.ipv4.ip_forward=1
Assim não teremos problemas quando houver necessidade de reiniciarmos o GNU/Linux, não perdendo a ativação de encaminhamentos de pacotes.
Compartilhando a Internet para uma máquina
Vamos supor que precisamos dar acesso a um IP na rede privada através da nossa interface de rede com "IP FIXO" público no GNU/Linux.
# iptables -t nat -A POSTROUTING -s 192.168.0.4 -d 0/0 -j SNAT --to 200.200.200.1
Neste exemplo, os pacotes que passarem pelo nosso firewall de origem 192.168.0.4 com destino a qualquer lugar, serão alterados com endereço de origem para 200.200.200.1.
Note que usamos a opção "-t nat", que indica que a tabela que será adicionada à regra, será a tabela NAT. Temos que especificar a tabela, pois caso contrário, o IPtables iria inserir na tabela filter, que não possui chain POSTROUTING e geraria um erro.
Compartilhando a Internet para uma rede
Neste exemplo, iremos fazer a alteração do endereço de destino para uma rede inteira:
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 200.200.200.1
No exemplo anterior, todos os pacotes com origem na rede privada 192.168.0.0 que irão sair pela interface eth0, terão seus endereços de origem alterados para 200.200.200.1.
Comunicação entre redes privadas
Podemos nos utilizar dessa regra para fazer duas redes distintas privadas comunicarem-se.
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 10.0.0.1
A nossa rede inteira 192.168.0.0 poderá comunicar-se com a rede 10.0.0.0 através da alteração do endereço de origem para 10.0.0.1.
Usando SNAT para um range de IPs
Podemos utilizar o esquema N:N, ou seja, vários IPs para vários IPs.
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 10.0.0.1-10.0.0.10
Os pacotes de origem 10.0.0.0/8 terão seus endereços de origem alterados para os endereços entre 10.0.0.1 até 10.0.0.10.
Usando exceções
As exceções também funcionam na tabela NAT. Utilizando normalmente o "!" para fazer uma exceção.
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j SNAT --to 200.200.200.1
Neste exemplo, estamos utilizando o sinal "!". Seu significado quer dizer "diferente de", por exemplo, 192.168.0.1 significa todos menos o endereço 192.168.0.1.
A regra anterior especifica que os pacotes com origem da rede 192.168.0.0/24, e destino, que não seja ela mesma (diferente de 192.168.0.0/24), especificado através do item "! -d 192.168.0.0/24", terão a origem alterada para 200.200.200.1 (utilizando-se da tabela NAT).
Esta alteração de endereço de 192.168.0.0/24 para 200.200.0.1 é necessária, pois endereços desse tipo não podem acessar a rede pública da Internet.