GNU/Linux
 
 
Iptables / Netfilter na prática
Filtro de Pacotes / Estados / NAT
(na prática em um ambiente de produção)

Neste artigo será mostrado como configurar na prática o IPTABLES para colocá-lo em um ambiente de produção. Ressaltando que nesta implementação além da chain FORWARD, também serão bloqueadas as chains INPUT e OUTPUT da tabela FILTER e a POSTROUTING da tabela NAT. Devido à isso, se terá um total controle do filtro de pacotes, mas em compensação a sua implementação e manutenção serão muito mais complicadas. Outra desvantagens é a exigência de mais recursos computacionais pra processar todas as regras. Somente fiz isto para que o administrador do IPTABLES saiba exatamente como um FILTRO DE PACOTES/ESTADOS funciona. No entanto, em um ambiente de produção não recomendo bloquear a tabela OUTPUT da FILTER. Então, caso não se faça esse bloqueio, basta ignorar as regras de OUTPUT do artigo abaixo. Assim, se notará que as regras ficarão muito mais simples. A figura a seguir mostra ambiente de rede usada para a implementação do IPTABLES:


clique aqui para ampliar

Primeiramente se deve habilitar o roteamento via Kernel de maneira permanente
# vi /etc/sysctl.conf (no final deste arquivo digite a linha a seguir)
net.ipv4.ip_forward=1 (também poderia ser "net/ipv4/ip_forward=1" ou "/net/ipv4/ip_forward=1" ou ".net.ipv4.ip_forward=1")
Salve e Saia do arquivo (digite o comando a seguir)
# sysctl -p (no Debian GNU/Linux também pode-se utilizar "# /etc/init.d/procps.sh start")


A seguir será mostrado duas maneiras de fazer a mesma coisa. Então escolha entre a OPÇÃO 1 e a 2:




OPÇÃO 1

Se deve limpar todas as tabelas do "iptables":
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F

Política da empresa na tabela FILTER:
Obs: se deve colocar a política do "iptables" de acordo com as política defina pela empresa. Neste caso, a política adotada foi "nega tudo e vai permitindo aos poucos". Então:
iptables -t filter -P FORWARD DROP (nega a passagem de pacotes através do "iptables")

Medidas de segurança na tabela NAT:
iptables -t nat -P POSTROUTING DROP (nega a passagem de pacotes através do iptables "FORWARD" e dos que são gerados pelo iptables "OUTPUT", mas não nega os pacotes que são direcionados a ele "INPUT" e a suas respectivas respostas "PSEUDO-OUTPUT" --> lembre-se filtro de estados. Esta política, na verdade, é um medida de segurança, pois são necessárias as regras a seguir para que o "iptables" libere o tráfego)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE (medida de segurança para a rede que está sendo mascarada "172.16.200.0/24" e "192.168.1.0/24", pois o endereço de origem que sairá para a Internet será sempre o endereço do "iptables", ou seja, "10.1.1.254". Também, com esta regra, não é permitido um tráfego iniciado da Internet sem a devida configuração. Um MASQUERADE é um ACCEPT, sem colocar um SNAT do endereço IP da interface de rede de saída ;-)
iptables -t nat -A POSTROUTING -o br-xen -m iprange --dst-range 192.168.1.1-192.168.1.12 -j ACCEPT (serve para a LAN, Internet e IPTABLES acessarem a DMZ, sendo que o tráfego não deve ser mascarado, pois os administradores da DMZ precisam saber de onde os pacotes são gerados. Medida de segurança)
iptables -t nat -A POSTROUTING -o eth1 -s 172.16.200.254 -d 172.16.200.0/24 -j ACCEPT (libera o tráfego iniciado ou gerado pela máquina local em direção à LAN)
iptables -t nat -A POSTROUTING -o lo -j ACCEPT (libera o tráfego iniciado ou gerado pela máquina local em direção a ela mesmo ou não. Importante quando se têm serviços onde o IP do servidor é 127.0.0.1, ou seja, o servidor é cliente dele mesmo)
Obs: o interessante nas regras acima é que os únicos tráfegos que não foram liberados são o da Internet em direção a LAN e da DMZ em direção à LAN.


Agora deve-se colocar as regras de acordo com os serviços necessários para uma rede funcionar.

Regras para o acesso ao remoto (ssh) ao Filtro de Pacotes (roteador)
iptables -t filter -A INPUT -i eth1 -s 172.16.200.20 -d 172.16.200.254 -p tcp --dport 22 -m mac --mac-source 00:1E:8C:66:97:F1 -j ACCEPT
iptables -t filter -A OUTPUT -o eth1 -s 172.16.200.254 -d 172.16.200.20 -p tcp --sport 22 -j ACCEPT (esta regra não seria necessária, bastando deixar a política "OUTPUT" da "FILTER" sempre "ACCEPT". "OUTPUT" não aceita o "-m mac". Trabalhar com regras "OUTPUT" são sempre trabalhosas, faça isto somente se quiser ter um controle total do tráfego)


Regras para o tráfego DNS no sentido LAN/FP para DMZ, DMZ para a Internet e vice-versa
iptables -t filter -A FORWARD -i eth1 -o br-xen -s 172.16.200.0/24 -m iprange --dst-range 192.168.1.1-192.168.1.2 -p udp --dport 53 -j ACCEPT
iptables -t filter -A FORWARD -i br-xen -o eth1 -m iprange --src-range 192.168.1.1-192.168.1.2 -d 172.16.200.0/24 -p udp --sport 53 -j ACCEPT
iptables -t filter -A FORWARD -i br-xen -o eth0 -m iprange --src-range 192.168.1.1-192.168.1.2 -p udp --dport 53 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o br-xen -m iprange --dst-range 192.168.1.1-192.168.1.2 -p udp --sport 53 -j ACCEPT
iptables -t filter -A OUTPUT -o br-xen -s 192.168.1.254 -m iprange --dst-range 192.168.1.1-192.168.1.2 -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -i br-xen -m iprange --src-range 192.168.1.1-192.168.1.2 -d 192.168.1.254 -p udp --sport 53 -j ACCEPT


Regras do tráfego HTTP, HTTPS e FTP no sentido LAN/DMZ/FP para o PROXY, do PROXY para a Internet e virce-versa
Obs1: essas regras só devem ser usadas se o proxy HTTP (Squid) não estiver trabalhando em modo transparente. HTTP usa a porta TCP 80. O HTTPS usa a porta TCP 443. O FTP utiliza a porta TCP 20 para troca de dados (comando "ls", "put" etc) e porta TCP 21 para o estabelecimento de conexão, autenticação, mensagens de controle etc.
iptables -t filter -A INPUT -i eth1 -s 172.16.200.0/24 -d 172.16.200.254 -p tcp --dport 3128 -j ACCEPT
iptables -t filter -A OUTPUT -o br-xen -s 192.168.1.254 -d 192.168.1.3 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -t filter -A OUTPUT -o br-xen -s 192.168.1.254 -d 192.168.1.4 -p tcp -m multiport --dports 20,21 -j ACCEPT
iptables -t filter -A INPUT -i br-xen -s 192.168.1.3 -d 192.168.1.254 -p tcp -m multiport --sports 80,443 -j ACCEPT
iptables -t filter -A INPUT -i br-xen -s 192.168.1.4 -d 192.168.1.254 -p tcp -m multiport --sports 20,21 -j ACCEPT
iptables -t filter -A OUTPUT -o eth1 -s 172.16.200.254 -d 172.16.200.0/24 -p tcp --sport 3128 -j ACCEPT
Obs2: as regras acima são para a LAN acessar o proxy HTTP, HTTPS e FTP do Filtro de Pacotes, do Filtro de Pacotes para a DMZ, da DMZ para FP e do FP para a LAN.
iptables -t filter -A INPUT -i br-xen -m iprange --src-range 192.168.1.1-192.168.1.12 -d 192.168.1.254 -p tcp --dport 3128 -j ACCEPT
iptables -t filter -A OUTPUT -o br-xen -s 192.168.1.254 -m iprange --dst-range 192.168.1.1-192.168.1.12 -p tcp --sport 3128 -j ACCEPT
Obs3: as duas regras acima é para a DMZ acessar o proxy HTTP, HTTPS e FTP do FP e do FP para a DMZ.
iptables -t filter -A OUTPUT -o eth0 -s 10.1.1.254 -p tcp -m multiport --dports 20,21,80,443 -j ACCEPT
iptables -t filter -A INPUT -i eth0 -d 10.1.1.254 -p tcp -m multiport --sports 20,21,80,443 -j ACCEPT
Obs4: as regras acima é para proxy HTTP, HTTPS e FTP do Filtro de Pacotes sair para a Internet.
Obs5: Nenhuma regra acima permite que um equipamento da Internet use o proxy HTTP, HTTPS e FTP do Filtro de Pacotes. A não ser, se usar portas de origem 80, 443, 20 e 21 :-( .


Regras de FORWARD para o acesso HTTP, HTTPS e FTP da DMZ para a Internet
Obs: muitas vezes configurar os equipamentos da DMZ para usar um proxy HTTP, HTTPS ou FTP para sair para a Internet gera problema (regras anteriores). Quando isto acontecer, utilize as regras a seguir para que estes equipamentos atravessem o FP sem passam por tal proxy.
iptables -t filter -A FORWARD -i br-xen -o eth0 -m iprange --src-range 192.168.1.1-192.168.1.12 -p tcp -m multiport --dports 20,21,80,443 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o br-xen -m iprange --dst-range 192.168.1.1-192.168.1.12 -p tcp -m multiport --sports 20,21,80,443 -j ACCEPT


Regras para o serviço de sincronização de hora (NTP)
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 172.16.200.0/24 -p udp --sport 123 --dport 123 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 172.16.200.0/24 -p udp --sport 123 --dport 123 -j ACCEPT
iptables -t filter -A FORWARD -i br-xen -o eth0 -m iprange --src-range 192.168.1.1-192.168.1.12 -p udp --sport 123 --dport 123 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o br-xen -m iprange --dst-range 192.168.1.1-192.168.1.12 -p udp --sport 123 --dport 123 -j ACCEPT
Obs: não se preocupe com os FORWARDs acima, pois o acesso a LAN só ocorrerá se o tráfego for iniciado pela LAN. Lembre-se que no início foi feito um mascaramento.


Regras para o serviço apt-cacher da LAN para a Internet
Obs: nas duas regras a seguir é usado um IP e mac de origem específico para melhorar a segurança, mas nada impede dos dois serem falsificados (spoofing). Poderia-se impor mais a segurança, colocando o IP de destino como "debian.org", mas não é prático.
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 172.16.200.1 -p tcp --dport 80 -m mac --mac-source 00:0C:29:37:67:5F -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 172.16.200.1 -p tcp --sport 80 -j ACCEPT
Obs: não se preocupe com os FORWARDs acima, pois o acesso a LAN só ocorrerá se o tráfego for iniciado pela LAN. Lembre-se que no início foi feito um mascaramento.


Regras para o serviço apt-cacher no FP oferecido para a DMZ e FP
iptables -t filter -A INPUT -i br-xen -m iprange --src-range 192.168.1.1-192.168.1.12 -d 192.168.1.254 -p tcp --dport 3142 -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -s 10.1.1.254 -p tcp --dport 80 -j ACCEPT (esta regra já foi implementada)
iptables -t filter -A INPUT -i eth0 -d 10.1.1.254 -p tcp --sport 80 -j ACCEPT (esta regra já foi implementada)
iptables -t filter -A OUTPUT -o br-xen -s 192.168.1.254 -m iprange --dst-range 192.168.1.1-192.168.1.12 -p tcp --sport 3142 -j ACCEPT
Obs: as quatro regras a seguir é para localhost (127.0.0.1). Para entender essas regras, pense em duas máquinas fisicamente separadas.
iptables -t filter -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -p tcp --dport 3142 -j ACCEPT
iptables -t filter -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -p tcp --sport 3142 -j ACCEPT
iptables -t filter -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -p tcp --sport 3142 -j ACCEPT
iptables -t filter -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -p tcp --dport 3142 -j ACCEPT


Regras para o DHCP
Obs: não sei porque, mas o serviço DHCP não é influenciado pelo iptables. Em todo caso, a seguir têm-se as regras para tal serviço:
iptables -t filter -A INPUT -i eth1 -p udp --sport 68 --dport 67 -j ACCEPT (não foi especificado o "-s" e "-d", pois o primeiro segmento enviado pelo cliente DHCP tem como IP de origem "0.0.0.0" e de destino "255.255.255.255"
iptables -t filter -A OUTPUT -o eth1 -s 172.16.200.254 -d 172.16.200.0/24 -p udp --sport 67 --dport 68 -j ACCEPT



Regras para Internet acessar os serviços HTTP, HTTPS, FTP e DNS da DMZ
iptables -t filter -A FORWARD -i eth0 -o br-xen -m iprange --dst-range 192.168.1.1-192.168.1.2 -p udp --dport 53 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o br-xen -d 192.168.1.3 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o br-xen -d 192.168.1.4 -p tcp -m multiport --dports 20,21 -j ACCEPT
iptables -t filter -A FORWARD -i br-xen -o eth0 -m iprange --src-range 192.168.1.1-192.168.1.2 -p udp --sport 53 -j ACCEPT
iptables -t filter -A FORWARD -i br-xen -o eth0 -s 192.168.1.3 -p tcp -m multiport --sports 80,443 -j ACCEPT
iptables -t filter -A FORWARD -i br-xen -o eth0 -s 192.168.1.4 -p tcp -m multiport --sports 20,21 -j ACCEPT


Regras para controlar os ICMPs e fragmentos dos datagramas IP
iptables -A FORWARD -f -j ACCEPT(esta regra é para quando a origem [transmissor] fragmenta o datagrama. No caso do pacote ICMP, ele se fragmenta em outros pacotes ICMPs ou pelo menos é assim que o Netfilter e o Tcpdump interpretam. Já o TCP, UDP etc eu não sei, então use está regra para liberar os fragmentos. O correto seria que os fragmentos de protocolos como o TCP e UDP fossem sempre um datagrama IP sem cabeçalhos TCP ou UDP, pois os fragmentos só sobem para as camadas superiores do modelo TCP/IP, quando todos os fragmentos forem reunidos, formando o datagrama original único. Não se pode usar regras como "iptables -t filter -A FORWARD -p ip -j ACCEPT", pois o "-p ip" é substituído por "-p all")
iptables -A INPUT -f -j ACCEPT
iptables -A OUTPUT -f -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -p icmp --icmp-type echo-request -j DROP
iptables -t filter -A INPUT -i eth0 -p icmp --icmp-type echo-request -j DROP
iptables -t filter -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j DROP
iptables -t filter -A FORWARD -m limit --limit 5/s -p icmp -j ACCEPT
iptables -t filter -A INPUT -p icmp -m limit --limit 5/s -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -m limit --limit 5/s -j ACCEPT



OPCIONAL: Regras para o serviço e proxy HTTP Transparente (Squid)
Obs1: as duas regras abaixo só devem se usadas ser o proxy HTTP (Squid) estiver trabalhando em modo transparente.
iptables -t nat -A PREROUTING -i eth1 -s 172.16.200.0/24 -d 172.16.200.1 -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A PREROUTING -i br-xen -m iprange --src-range 192.168.1.1-192.168.1.12 -d 172.16.200.1 -p tcp --dport 80 -j REDIRECT --to-ports 3128
Obs2: as regras acima só funcionarão para a porta 80 (http), pois o Squid trabalha de forma errada ao fazer redirecionamento com outras porta como: 443 (https), 20 (ftp) e 21 (ftp). O que acontece na prática e que mesmo fazendo o redirecionamento através de regras implementadas com o "iptables", quando o tráfego 443, 20 e 21 saem do proxy, saem com destino a porta 80. Então, para evitar problemas, não trabalhe com o squid em modo transparente. É sempre importate especificar o endereço do Proxy "-d", principalmente ao usar o XEN (virtualização) no próprio Firewall.


Seguindo a política de bloquear tudo e vai permitindo aos poucos, vamos bloquear as "chains" INPUT e OUTPUT:
iptables -t filter -P INPUT DROP (nega a entrada de pacotes no "iptables". Essa regra é muito importante, principalmente nos casos em que o Filtro de Pacotes oferece outros serviços como DHCP, Proxy HTTP, HTTPS, FTP, APT etc)
iptables -t filter -P OUTPUT DROP (nega a saída de pacotes no "iptables". Essa regra dobra o trabalho na implementação de um Filtro de Pacotes, mas gera um maior controle do tráfego)
Obs: ao se utilizar as duas regras acima, não se preocupe com protocolos como o "ARP", pois os únicos protocolos que serão bloqueados são os que estão e "/etc/protocols". Se quiser filtrar o "ARP" instale o "ARPTABLES" (apt-get install arptables).



Depois de implementar todas as políticas e regras, se deve salvá-las com o comando:
iptables-save > /etc/firewall (para ver o conteúdo digite "cat /etc/firewall")

Para que as políticas e regras sejam estabelecidas durante o boot (inicialização) do sistema, siga os procedimentos a seguir:
# vi /etc/rc.local (é um arquivo onde podem ser adicionados scripts, comandos etc que serão executados no final de todos os runlevel do sistema. Em resumo, os scripts ou comandos dentro deste arquivo serão executados depois que todos os outros serviços do sistema forem executados, ou seja, no final do boot do sistema. De uma forma groseira e para quem conhece o MS Windows, ele pode ser entendido como o "autoexec.bat" ou "msconfig" do GNU/Linux)
iptables-restore < /etc/firewall (digite esta linha. Esta linha na verdade é um comando que restaura as políticas e regras salvas anteriormente com o comando "iptables-save > /etc/firewall". É importante notar que não é necessário logar no sistema para que este comando entre em ação)
exit 0 (esta linha já existe por padrão, sendo que todo script antes dela será executado no final do boot do sistema)
Salve e Saia do arquivo

Caso haja necessidade de adicionar outras políticas e regras, basta seguir o exemplo abaixo:
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 172.16.200.0/24 -p tcp --dport 119 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 172.16.200.0/24 -p tcp --sport 119 -j ACCEPT
iptables-save > /etc/firewall




OPÇÃO 2

Também se poderia criar um script em vez de usar "iptables-save" e "iptables-restore", conforme procedimentos a seguir:
vi /etc/firewall.sh (a seguir se tem o conteúdo que deve ser digitado)
#!/bin/bash (processador de comandos)
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -P FORWARD DROP
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.200.0/24 -j MASQUERADE
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 172.16.200.0/24 -p udp --dport 53 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 172.16.200.0/24 -p udp --sport 53 -j ACCEPT
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 172.16.200.0/24 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 172.16.200.0/24 -p tcp --sport 80 -j ACCEPT
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 172.16.200.0/24 -p tcp --dport 443 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 172.16.200.0/24 -p tcp --sport 443 -j ACCEPT
Salve e Saia do arquivo

Digite o comando a seguir
# chmod 744 /etc/firewall.sh (torna o script executável)

Para executar o script durante o boot (inicialização) do sistema, siga os procedimentos a seguir:
# vi /etc/rc.local
/etc/firewall.sh
exit 0
Salve e Saia do arquivo

Digite o comando a seguir
# /etc/firewall.sh (comando para que as políticas e regras sejam implementadas sem a necessidade de reiniciar o equipamento)

Caso haja necessidade de adicionar outras políticas e regras, basta seguir o exemplo abaixo:
vi /etc/firewall.sh (dentre as várias linhas exisdentes, digite as políticas ou regras no local mais apropriado. A seguir foram adicionadas mais duas regras)
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 172.16.200.0/24 -p tcp --dport 119 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 172.16.200.0/24 -p tcp --sport 119 -j ACCEPT
Salve e Saia do arquivo

Digite o comando a seguir novamente para que as novas regras sejam implementadas
# /etc/firewall.sh




EXTRA

Caso se tenha algum compartilhamento com o SAMBA
As seguintes portas são utilizadas para o compartilhamento de arquivos e impressora: 137 UDP ou netbios-ns - name service (cliente e servidor / endereço IP em broadcast), 138 UDP ou netbios-dgm - datagram service (cliente e servidor / endereço IP em broadcast), 139 TCP ou netbios-ssn - session service (servidor / na prática só vi o MS Windows utilizando-a durante a inicialização) e 445 TCP ou microsoft-ds - Nacked CIFS (servidor / usado durante a autenticação, troca de dados e impressão). NBT significa NetBions over TCP/IP ;-)

MSN
AMSN (portas TCP 80, 443 e 1863).



AGUANDE
PÁGINA EM CONSTRUÇÃO

 
 




ETI - Especialista em Tecnologia
da Informação