Em redes de computadores, a conversão de endereços de rede (NAT - Network Address Translation) é o processo em que um dispositivo de rede, geralmente um roteador de perímetro, mapeia um endereço IP público e roteável para um endereço IP privado usado na rede local (LAN). O objetivo principal do NAT é limitar o número de endereços IP públicos que uma organização deve usar para seus clientes de rede interna para acessar recursos públicos. Não há endereços IP suficientes no esquema IPv4 para cada dispositivo que precisa de acesso a recursos públicos. O NAT fornece uma maneira econômica e segura para clientes internos acessarem recursos públicos sem ter um endereço IP público dedicado.
O iptables é um programa escrito na linguagem C, utilizado como ferramenta que configura regras para o protocolo de internet IPv4 na tabela de filtragem de pacotes, utilizando os módulos e framework do kernel Linux (versão 2.3.15 ou posterior). As configurações de firewall feitas ficarão guardadas no kernel, logo serão perdidas quando o sistema for reiniciado.
Fonte: Wikipedia 🔗
Revisite nosso cenário de rede virtual e observe que temos, conectados ao servidor, pelo menos dois clientes "desktop", usando a "rede interna" do hipervisor.
Para permitir que os computadores da "Rede interna" (os clientes da LAN) acessem a Internet através do servidor Linux, precisamos torná-lo o "GATEWAY PADRÃO" da rede, e a forma mais fácil de fazer isso é usando o recurso NAT, ativando o roteamento via "NAT" neste. Podemos fazer isso manualmente, comandando no terminal do servidor:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
Lembre-se de trocar "enp0s3" pela interface correta, conectada à Internet.
A primeira linha ativa o encaminhamento de pacotes do kernel;
A segunda linha limpa qualquer eventual regra de firewall que esteja ativa para NAT;
A última linha ativa o encaminhamento por mascaramento de endereços, vulgo NAT!
Basicamente o iptables vai rotear pacotes entre as redes interna e externa e no processo, substitui o IP local pelo IP da interface externa. No processo reverso, após o roteamento dos pacotes ele troca os endereços para os locais, conforma uma tabela de endereços criada na memória. Para saber exatamente quais endereços usar para cada pacote, ele identifica esses pacotes com um "hash".
Para testar, vá ao cliente e comande no terminal:
ping google.com
A resposta ao comando deve ser positiva, ou seja, conseguimos "pingar" na Internet sem problemas. Na sequência, abra o navegador e acesse os sites que costuma acessar para testar o funcionamento do NAT.
Se precisar, para desativar o compartilhamento, precisamos comandar no terminal:
echo 0 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
O problema dessa abordagem é que o "iptables" não salva o estado das configurações, assim, se reiniciamos o sistema, precisamos digitar aqueles comandos novamente, o que, na prática, não é nada produtivo.
Para manter a persistência da configuração do NAT, vamos criar um pequeno aplicativo na linguagem "Shell Script" padrão do Linux, para automatizar esta tarefa. Lembre-se que estamos programando, então, qualquer mínimo erro pode fazer com que nosso programa não funcione. Visto isso, como um bom programador, prepare-se para "debugar", se necessário.
Ainda logado como "root" no servidor "Debian 11 Server", digite o comando abaixo no terminal para criar o arquivo "nat.sh" dentro da pasta "/etc/init.d" do servidor e já abri-lo no editor:
mousepad /etc/init.d/nat.sh
O sistema Linux é fortemente "case-sensitive", ou seja, diferencia letras maiúsculas de letras minúsculas. Tenha atenção a esse detalhe na hora de programar!
O sistema Linux ama a identação com tabulações ([Tab]). Use tabulações. Evite excesso de espaços. Prefira tabulações. A tecla [Tab] é sua amiga. Tabulações são mais leves. 1tab = 4spaces em média. Vamos preservar as tabulações.
Observe que criamos o script justamente no diretório de inicialização do ambiente. Este arquivo deve ter exatamente o conteúdo abaixo:
#!/bin/sh
### BEGIN INIT INFO
# Provides: nat.sh
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Ativa o compartilhamento de Internet via NAT
# Description: Ativa o compartilhamento de Internet via NAT
### END INIT INFO
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
case "$1" in
start)
echo "Iniciando serviço NAT..."
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -F
/sbin/iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
;;
stop)
echo "Parando o serviço NAT..."
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -F
;;
restart)
echo "Reiniciando o serviço NAT..."
$0 stop
$0 start
;;
*)
echo "Operação inválida..."
;;
esac
# End of script
Mais uma vez, lembre-se de trocar "enp0s3" pelo nome correto da interface conectata à Internet, se necessário.
Salve o arquivo, teclando [Ctrl]+[S] e saia do editor teclando [Ctrl]+[Q]. AINDA NÃO DECOROU ISSO?!
Aqui, todas as linhas do programa são importantes, inclusive os comentários iniciados com "#". Sem eles a aplicação não funciona. Letras maiúsculas e minúsculas também são consideradas, então, cuidado com "a caixa".
O trecho abaixo ativa o protocolo NAT com a interface da rede externa (Internet) sempre que comandamos "start". Esses são os mesmos comandos que ativam o NAT, que vimos antes...
•••
start)
echo "Iniciando serviço NAT..."
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -F
/sbin/iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
;;
•••
Observe, mais uma vez, a referência à interface de rede "enp0s3". É por essa interface que o servidor se conecta à Internet (NAT da VM). Dependendo do ambiente e das interfaces do servidor, a referência desta interface pode ser outra.
O trecho abaixo interrompe o NAT quando comandamos "stop".
•••
stop)
echo "Parando o serviço NAT..."
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -F
;;
•••
Um "restart" nada mais é do que um "stop" seguido de um "start" e qualquer outra opção gera um erro.
Execute o comando abaixo para dar permissões de execução ao nosso script:
chmod +x /etc/init.d/nat.sh
Para testar nosso programa, comande:
/etc/init.d/nat.sh restart
Observe que, não devem aparecer mensagens de erro, caso apareçam, retorne à edição do script e revise tudo…
Para verificar o funcionamento, digite:
iptables -t nat -L
Nas últimas linhas da resposta do comando, devem aparecer exatamente as mensagens abaixo, indicando que o NAT (POSTROUTING MASQUERADE) está ativo:
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
Agora, precisamos executar este programa na inicialização do sistema, então, com muita atenção, comande:
update-rc.d nat.sh defaults
Observe que a resposta de alguns comandos acima é sempre "nada" se deu tudo certo ou "error..." se algo de errado. Esse é o padrão de um "sistema temente ao ser humano que o controla"
Reinicie o Debian comandando:
reboot
Após o reinicio, logue-se novamente como "root", execute o teste mais uma vez e observe as respostas como antes:
iptables -t nat -L
Agora, se necessário, precisamos informar o "gateway padrão" das interfaces da LAN nos clientes da rede interna.
Clientes Windows
No Windows, as configurações são feitas basicamente da mesma forma, independente da versão ou edição:
Tecle [Win] + [R], digite "ncpa.cpl" e tecle [Enter];
Clique direito na interface de rede ativa e selecione "Propriedades";
Na lista de protocolos, selecione "Protocolo TCP/IP versão 4 (TCP/IPv4);
Marque a opção "Usar o seguinte endereço IP:";
Configure os valores com:
Endereço IP: → O endereço IP da LAN atribuído a este computador, por exemplo, 192.168.99.10
Máscara de sub-rede: → A máscara de sub-rede padrão da LAN, por exemplo, 255.255.255.0
Gateway padrão: → O endereço IP da LAN do servidor que está compartilhando a Internet, por exemplo, 192.168.99.1
Servidor DNS preferencial: → O endereço do servidor DNS da LAN. Usaremos nosso servidor mesmo: 192.168.99.1
Servidor DNS alternativo: → Pode ser o endereço IP de um servidor DNS público como o do Google: 8.8.8.8
Clique em [Ok] e em [Ok] novamente.
Agora, teste para verificar se o Windows acessa a Internet, usando um navegador.
Clientes Linux
Cada distribuição Linux tem suas especificidades quanto a configuração das interfaces de rede, mas, basicamente, é preciso configurar os mesmos parâmetros usados no cliente Windows:
Endereço IP da interface → Um IP válido na LAN, mas ainda não usado, por exemplo 192.168.99.20
Máscara de subrede da interface → A mesma do restante da rede, por exemplo 255.255.255.0
Gateway padrão ou Roteador padrão ou ainda Default gateway → Endereço IP da interface local do servidor que compartilha a internet. Por exemplo 192.168.99.1
Servidor DNS primário → Normalmente, o mesmo IP do gateway, por exemplo: 192.168.99.1. Também podemos usar qualquer servidor DNS público como, por exemplo, o servidor do Google que é 8.8.8.8
Servidor DNS secundário → Um servidor DNS público qualquer. Por exemplo 8.8.4.4
Observe que os endereços usados como exemplo podem variar conforme o ambiente de rede que estamos planejando. Durante o planejamento da rede é importante ter esses endereços já documentados e reservados.
Os passos abaixo descrevem um exemplo de configuração do IP de um cliente Debian.
⚠ Atenção! Não faça isso no seu servidor Debian! Isso é para clientes Debian e derivados…
⚠ Atenção! Não faça isso no seu servidor Debian! Isso é para clientes Debian e derivados…
⚠ Atenção! Não faça isso no seu servidor Debian! Isso é para clientes Debian e derivados…
Logue-se como "root";
Se estiver em uma interface gráfica, abra um emulador de terminal ou tecle [Ctrl] + [Alt] + [F3] para abrir um console de comandos;
Edite o arquivo "/etc/network/interfaces", comandando:
mousepad /etc/network/interfaces
Acrescente as linhas em amarelo ao arquivo.
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet static
address 192.168.99.40
netmask 255.255.255.0
gateway 192.168.99.1
dns-nameservers 192.168.99.1
dns-nameservers 8.8.8.8 8.8.4.4
Lembre-se que os endereços e os nomes das interfaces são só exemplos.
Salve o arquivo e reinicie o sistema, comandando:
reboot
Verifique se as configurações foram aceitas com o comando:
ip address
O comando abaixo faz o mesmo, mas tem uma saída mais limpa:
ifconfig
Para verificar se está acessando a Internet, comande:
ping google.com
Caso tenha funcionado com o Windows, mas não com o Debian, faça o seguinte:
Edite o arquivo "/etc/resolv.conf" comandando:
mousepad /etc/resolv.conf
nameserver 192.168.99.1
nameserver 8.8.8.8
nameserver 8.8.4.4
Salve e feche o editor;
Para verificar se está acessando a Internet, comande novamente:
ping google.com
Outra opção é instalar o script de atualização automática do "resolv.conf", comandando:
apt-get update
apt-get install resolvconf
Na sequencia, reinicie o sistema comandando:
reboot
Depois de reiniciar, para verificar se está acessando a Internet, mais uma vez, comande:
ping google.com
Como já temos acesso à Internet nos clientes da rede virtual, vamos, opcionalmente, aproveitar para baixar e instalar alguns aplicativos essenciais nesses sistemas, por exemplo:
Clamwin → Antivírus gratuito e open-source → http://www.clamwin.com/content/view/18/46/
Google Chrome → Navegador Web → https://www.google.com/intl/pt-BR/chrome/
Visual Studio Code → Editor de códigos → https://code.visualstudio.com/
Notepad ++ → Editor de textos planos melhorado → https://notepad-plus-plus.org/download/v7.7.1.html
Mozilla Firefox → Navegador Web → https://www.mozilla.org/pt-BR/firefox/new/
PuTTY → Cliente de acesso remoto SSH → https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
E outros…