Entendendo TCP/IP (Parte 6) - Firewall
Neste artigo, o sexto da série, vou explicar o funcionamento de um firewall e mostrar como o iptables funciona.
Parte 4: Nat / Outras informações
NAT (Network Address Translator) é o processo que altera um ou mais campos do cabeçalho IP.
O exemplo mais simples e utilizado é o mascaramento, que faz com que todas as estações de trabalho da rede interna saiam para a internet através de um único endereço IP válido.
Outro exemplo, é fazer com que uma requisição vinda da internet possa ser direcionada para uma máquina na rede interna, fazendo com que vários serviços (e-mail, HTTP, FTP) rodando em máquinas diferentes possam ser acessados tendo-se um único endereço válido.
Vamos analisar melhor no desenho abaixo: Como expliquei em artigos anteriores, para que máquinas com IP privado (ex.: 172.20.x.x) acessem a Internet, é necessário fazer com que todas as estações saiam para a Internet com um IP válido.
No iptables, isso é feito com o seguinte comando:
# iptables -t nat -A POSTROUTING -j MASQUERADE
Isso faz com que todo tráfego que passar pelo firewall, irá sair com o IP da interface de saída. Se você quiser que somente os dados que saem para a Internet sejam mascarados, basta adicionar a interface de saída (vamos suporte que seja a eth1).
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Enquanto a tabela de firewall possui três chains, a de NAT possui duas: PREROUTING e POSTROUTING. Como podemos ver na imagem acima, PREROUTING é usada ANTES do pacote entrar no firewall e POSTROUTING é usado DEPOIS de sair do firewall.
O NAT também é muito usado onde o gateway da rede também é o proxy. É comum usar, nessas situações, o proxy transparente, que nada mais é do que enviar os dados que estão saindo para a porta 80 e 443 e redirecioná-los para a porta do proxy.
Para fazer isso, é necessário tratar o pacote ANTES dele entrar no firewall, portanto, usamos a chain PREROUTING:
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128
Isso fará com que todo acesso de HTTP seja direcionado para a porta 3128, onde roda o proxy. Podemos também direcionar o tráfego para outro servidor.
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 172.20.120.4:3128
Uma outra possibilidade interessante do NAT é permitir que um único IP seja usado para disponibilizar diferentes serviços em diferentes servidores.
Vamos supor que você tenha um servidor Web com IP 172.16.10.80 e um outro servidor de e-mail com IP 172.16.10.25. Podemos direcionar o tráfego que chega pela internet para esses servidores.
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 172.16.10.80:80
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 25 -j DNAT --to-destination 172.16.10.25:25
Há situações onde o gateway possui vários IPs e eu preciso que determinado acesso seja feito por um IP diferente do padrão. Por exemplo, se meu servidor possui dois endereços 200.200.100.50 (padrão) e 200.200.100.60 e eu preciso fazer com que POP3 sempre saia pelo 60.
Neste caso, eu vou usar a chain POSTROUTING, pois estou trabalhando na SAÍDA:
# iptables -t nat -A POSTROUTING -i eth1 -p tcp --dport 110 -j SNAT --to-source 200.200.100.60
Lembrando que essa regra deve vir antes da regra de MASQUERADE, pois o iptables é top-down, ou seja, as regras mais acima são executadas primeiro.
Assim que os testes forem feitos, é possível restaurar o estado anterior. Isso é feito com o comando iptables-save:
# iptables-save > regras.lst
Para restaurar as regras anteriores, basta executar:
# iptables-restore < regras.lst
O exemplo mais simples e utilizado é o mascaramento, que faz com que todas as estações de trabalho da rede interna saiam para a internet através de um único endereço IP válido.
Outro exemplo, é fazer com que uma requisição vinda da internet possa ser direcionada para uma máquina na rede interna, fazendo com que vários serviços (e-mail, HTTP, FTP) rodando em máquinas diferentes possam ser acessados tendo-se um único endereço válido.
Vamos analisar melhor no desenho abaixo: Como expliquei em artigos anteriores, para que máquinas com IP privado (ex.: 172.20.x.x) acessem a Internet, é necessário fazer com que todas as estações saiam para a Internet com um IP válido.
No iptables, isso é feito com o seguinte comando:
# iptables -t nat -A POSTROUTING -j MASQUERADE
Isso faz com que todo tráfego que passar pelo firewall, irá sair com o IP da interface de saída. Se você quiser que somente os dados que saem para a Internet sejam mascarados, basta adicionar a interface de saída (vamos suporte que seja a eth1).
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Enquanto a tabela de firewall possui três chains, a de NAT possui duas: PREROUTING e POSTROUTING. Como podemos ver na imagem acima, PREROUTING é usada ANTES do pacote entrar no firewall e POSTROUTING é usado DEPOIS de sair do firewall.
O NAT também é muito usado onde o gateway da rede também é o proxy. É comum usar, nessas situações, o proxy transparente, que nada mais é do que enviar os dados que estão saindo para a porta 80 e 443 e redirecioná-los para a porta do proxy.
Para fazer isso, é necessário tratar o pacote ANTES dele entrar no firewall, portanto, usamos a chain PREROUTING:
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128
Isso fará com que todo acesso de HTTP seja direcionado para a porta 3128, onde roda o proxy. Podemos também direcionar o tráfego para outro servidor.
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 172.20.120.4:3128
Uma outra possibilidade interessante do NAT é permitir que um único IP seja usado para disponibilizar diferentes serviços em diferentes servidores.
Vamos supor que você tenha um servidor Web com IP 172.16.10.80 e um outro servidor de e-mail com IP 172.16.10.25. Podemos direcionar o tráfego que chega pela internet para esses servidores.
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 172.16.10.80:80
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 25 -j DNAT --to-destination 172.16.10.25:25
Há situações onde o gateway possui vários IPs e eu preciso que determinado acesso seja feito por um IP diferente do padrão. Por exemplo, se meu servidor possui dois endereços 200.200.100.50 (padrão) e 200.200.100.60 e eu preciso fazer com que POP3 sempre saia pelo 60.
Neste caso, eu vou usar a chain POSTROUTING, pois estou trabalhando na SAÍDA:
# iptables -t nat -A POSTROUTING -i eth1 -p tcp --dport 110 -j SNAT --to-source 200.200.100.60
Lembrando que essa regra deve vir antes da regra de MASQUERADE, pois o iptables é top-down, ou seja, as regras mais acima são executadas primeiro.
Salvando e restaurando as regras
Eu costumo colocar as regras de firewall em um script que é executado no boot. Mas, há situações em que você pode salvar o estado atual do firewall para poder fazer várias alterações de teste.Assim que os testes forem feitos, é possível restaurar o estado anterior. Isso é feito com o comando iptables-save:
# iptables-save > regras.lst
Para restaurar as regras anteriores, basta executar:
# iptables-restore < regras.lst
Módulos
Eu ia falar dos módulos que aumentam as opções do iptables, mas há um artigo muito bom escrito pelo Edson aqui mesmo no VOL:Mais informações
Nos links abaixo, há mais informações sobre firewall e iptables.AX:- iptables: Linux 2.4 Packet Filtering HOWTO: Utilizando o iptables
- RFC firewall: http://www.ietf.org/rfc.txt
- Site oficial do netfilter: http://www.netfilter.org
Neste caso, eu vou usar a chain POSTROUTING, pois estou trabalhando na SAÍDA:
# iptables -t nat -A POSTROUTING -i eth1 -p tcp --dport 110 -j SNAT --to-source 200.200.100.60
Lembrando que essa regra deve vir antes da regra de MASQUERADE, pois o iptables é top-down, ou seja, as regras mais acima são executadas primeiro."
-- Acredito que neste caso não se pode utilizar o MASQUERADE.
O MASQUERADE somente se usa no IPtables quando o IP da placa de rede de entrada da Internet/dados está dinâmico (ou automático).
Todas as regras para os vários IPs do gateway, nesse caso, devem ser com SNAT.
"# iptables -A FORWARD -i eth0 -o eth1 -s 172.20.16.60 -d 8.8.8.8 -p udp --dport 53 -j ACCEPT
Acima, a regra permite (-j ACCEPT) que pacotes de DNS (-p udp --dport 53) vindos de 172.20.16.60 (-s 172.20.16.60) com destino ao DNS do Google (- d 8.8.8.8) entrando pela interface da LAN (-i eth0) e saindo pela interface de internet (-o eth1) atravessem o firewall (-A FORWARD)."
-- Note que especificar qualquer nome a ser resolvido com uma consulta remota, como a um DNS, é uma ideia muito ruim.
"Não se preocupe em entender esse comando agora, pois vou explicá-lo mais pra frente neste artigo. A princípio, tenha em mente que esse comando vai fazer com que todos as estações da rede saiam com o IP do firewall.
Para comprovar isso, acesse: http://meuip.datahouse.com.br/
Note que o IP mostrado é o do firewall, e não o teu."
-- O IP mostrado não é o do firewall, é o do modem/roteador.
Mas está bom o artigo.