Abordagem Firewall Iptables Roteador Gateway JoaoHeriberto
Abordagem Firewall Iptables Roteador Gateway JoaoHeriberto
Abordagem Firewall Iptables Roteador Gateway JoaoHeriberto
www.iptablesbr.cjb.net
1. IP FORWARD
Considerações iniciais
O IP FORWARD é um tipo de roteamento. É estabelecido quando colocamos uma máquina
entre duas ou mais sub-redes diferentes e há a livre passagem de pacotes entre
elas, quando necessário. É importante ressaltar que o roteamento só irá funcionar
quando for feito entre SUB-REDES DIFERENTES. Não se pode colocar um roteador entre
duas sub-redes iguais.
O roteamento também é útil para diminuir o tráfego na rede como um todo, pois só
deixa o pacote mudar de sub-rede se isso for realmente necessário.
Para fazer o IP FORWARD, o micro roteador deve possuir uma placa de rede em cada
sub-rede. Também deveremos informar em cada máquina quem será o micro responsável
pelo roteamento. O nome técnico desse micro é gateway.
No caso do esquema anterior, temos as seguintes situações:
É importante que, nos dois lados, todos os micros saibam quem é o seu gateway pois,
do contrário, os hosts não saberão para onde enviar os pacotes destinados a outras
redes. Exemplo:
A máquina 10.0.0.1 sabe que 10.0.0.10 é o seu gateway. A máquina 172.20.0.1 não
sabe quem é o seu gateway. Um ping de 10.0.0.1 para 172.20.0.1 sairá de 10.0.0.1,
passará por 10.0.0.10, seguirá por 172.20.0.10 e chegará em 172.20.0.1. Como o
172.20.0.1 não sabe quem é o seu gateway para a rede 10.0.0.0, não conseguirá
responder. O ping vai morrer por timeout. Houve o icmp echo request, mas será
impossível gerar o icmp echo reply.
Fazendo o IP FORWARD
Para estabelecermos o IP FORWARD entre duas sub-redes, basta:
* inserir um micro com duas placas de rede entre as duas sub-redes, configurando
cada placa de acordo com cada sub-rede;
Definindo o gateway
GATEWAY=ip_do_gateway
#/etc/rc.d/init.d/network restart
GATEWAY="ip_do_gateway"
#/etc/rc.d/rc.inet1 restart
gateway ip_do_gateway
#/etc/init.d/networking restart
--> No Windows 9x
Teste do roteamento
O teste do roteamento pode ser feito por intermédio do comando ping. Basta "pingar"
uma máquina que esteja após o roteador.
Caso não haja resposta, faça um teste progressivo para tentar deduzir o problema:
www.iptablesbr.cjb.net
2. GENERALIDADES
Considerações iniciais
Vamos considerar firewall como sendo o efetivo controle do roteamento. Então, vamos
configurar uma máquina capaz de tomar decisões em relação ao tráfego de rede.
Podemos citar como firewall, as máquinas que executam os seguintes serviços:
Os filtros Linux
O firewall, na maioria das vezes, atua como um roteador controlado. É uma atividade
interna, uma propriedade, do kernel.
Obs: um kernel é estável quando o algarismo existente entre os dois pontos é par.
Exemplo: x.2.x é estável. Já o x.3.x não é estável.
--> filter: é a tabela default. Quando não especificarmos a tabela, a filter será
utilizada. Refere-se às atividades normais de tráfego de dados, sem a ocorrência de
NAT. Admite as chains INPUT, OUTPUT e FORWARD.
--> nat: utilizada quando há NAT. Exemplo: passagem de dados de uma rede privada
para a Internet. Admite as chains PREROUTING, OUTPUT e POSTROUTING.
--> mangle: basicamente, trabalha com marcação de pacotes e QoS. Neste tutorial,
não trataremos dessa tabela.
www.iptablesbr.cjb.net
3. TABELAS
Tabela Filter
Vejamos o funcionamento da tabela filter (default) e as suas respectivas chains:
--> FORWARD: qualquer pacote que atravessa o firewall, oriundo de uma máquina e
direcionado a outra, será tratado pela chain FORWARD.
Regras de firewall
As regras (rules) de firewall, geralmente, são compostas assim:
Exemplo:
A linha acima determina que todos os pacotes destinados à máquina 192.168.1.1 devem
ser descartados. No caso:
opção: -A
chain: FORWARD
dados: -d 192.168.1.1
ação: DROP
Opções
-A --> Append (anexar). Acresce uma nova regra à chain. Tem prioridade sobre o -P.
Geralmente, como buscamos segurança máxima, colocamos todas as chains em política
DROP, com o -P e, depois, abrimos o que é necessário com o -A. Exemplos:
-D --> Delete (apagar). Apaga uma regra. A regra deve ser escrita novamente,
trocando-se a opção para -D. Exemplos:
Também é possível apagar a regra pelo seu número de ordem. Pode-se utilizar o -L
para verificar o número de ordem. Verificado esse número, basta citar a chain e o
número de ordem. Exemplo:
#iptables -D FORWARD 4
#iptables -L
#iptables -L FORWARD
-F --> Flush (esvaziar). Remove todas as regras existentes. No entanto, não altera
a política (-P). Exemplos:
#iptables -F
#iptables -F FORWARD
Chains
Dados
-s 172.20.0.0/255.255.0.0
-s 172.20.5.10/255.255.255.255
Agora vimos o host 172.20.5.10. Ainda no caso de hosts, a máscara pode ser omitida.
Caso isso ocorra, o iptables considera a máscara como 255.255.255.255. Exemplo:
-s 172.20.5.10
-s 172.20.0.0/16
-s www.chat.com.br
-p icmp
-i ppp0
-i eth+
! --> Exclusão. Utilizado com -s, -d, -p, -i, -o e outros, para excluir o
argumento. Exemplo:
-s ! 10.0.0.1
-p ! tcp
--sport --> Source Port. Porta de origem. Só funciona com as opções -p udp e -p
tcp. Exemplo:
-p tcp --sport 80
Ações
DROP --> Abandonar. Não permite a passagem do pacote, descartando-o. Não avisa a
origem sobre o ocorrido.
REJECT --> Igual ao DROP, mas avisa a origem sobre o ocorrido (envia pacote icmp
unreachable).
LOG --> Cria um log referente à regra, em /var/log/messages. Usar antes de outras
ações.
#iptables -L
---------------------------------------
#iptables -F
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
Os pacotes icmp oriundos do host 10.0.0.5 e destinados a qualquer lugar deverão ser
descartados.
---------------------------------------
---------------------------------------
Os pacotes que entrarem por qualquer interface, exceto a eth0, serão aceitos.
---------------------------------------
---------------------------------------
---------------------------------------
Observações importantes
Conclusão: se houver impasse entre regras, sempre valerá a primeira. Assim, entre
as regras:
#iptables -A FORWARD -p icmp -j DROP
Valerá:
Já entre as regras:
Valerá:
Em resumo:
IP FORWARD
Caso haja o envolvimento de mais de uma sub-rede, será necessário que o IP FORWARD
seja ativado para que o iptables funcione corretamente. O IP FORWARD, via kernel,
pode ser ativado pelo comando:
Cabe lembrar que a reinicialização do daemon de rede fará com que o roteamento seja
perdido. Uma forma de deixar a regra de roteamento permanentemente ativada,
resistindo a qualquer tipo de reinicialização, seria a alteração do
arquivo /etc/sysctl.conf:
net.ipv4.ip_forward = 1
O carregamento
#rmmod ipchains
Nada impede que as regras sejam colocadas diretamente dentro de um shell script.
Extensões
As extensões permitem filtragens especiais, principalmente contra ataques de
hackers. Os exemplos abaixo mostram como controlar os pings que atravessam o
firewall:
Contra Ping
Não faz parte dos meus objetivos o aprofundamento no assunto extensões. Procure por
documentos especializados. Consulte a seção de links.
Mais proteção
Existe, ainda, uma regra muito importante que pode ser utilizada como segurança. É
a proteção contra pacotes danificados, suspeitos ou mal formados.
Mascaramento
O mascaramento é uma forma de fazer NAT (Network Address Translation). Com isso, é
possível fazer uma rede privada navegar na Internet. A rede solicita os dados para
a máquina que faz o mascaramento. Essa busca tais dados na Internet...
Redirecionamento de servidores
Proxy transparente
Balanceamento de carga
A tabela NAT
A tabela NAT funciona da seguinte forma:
Regras de NAT
Para fazer o mascaramento, deveremos, antes, carregar o módulo de NAT:
#modprobe iptable_nat
As regras mais utilizadas, além da maioria dos recursos descritos para uso com a
tabela filter, contêm o seguinte:
Chains
--> POSTROUTING: utilizada para analisar pacotes que estão saindo do kernel, após
sofrerem NAT. O POSTROUTING pode fazer ações de NAT com o endereço de origem do
pacote. Isso é conhecido como SNAT (Source NAT);
--> OUTPUT: utilizada para analisar pacotes que são gerados na própria máquina e
que irão sofrer NAT. O OUTPUT pode fazer ações de NAT com o endereço de destino do
pacote. Também é DNAT.
Opções
-D --> Deletar.
Dados
-t --> Table (tabela). Estabelece a tabela a ser utilizada. A tabela default, por
omissão, é filter. Para o mascaramento ou NAT será nat. Exemplo:
--to --> utilizado para definir IP e porta de destino, após um DNAT, ou de origem,
após um SNAT. Deve ser utilizado após uma ação (-j ação). Assim:
--dport --> assim como -d define um host de destino, --dport define uma porta de
destino. Deve ser utilizado antes de uma ação (-j ação). Antes de --dport, deve ser
especificado um protocolo (-p). Exemplo:
--sport --> assim como -s define um host de origem, --sport define uma porta de
origem. Deve ser utilizado antes de uma ação (-j ação).
--to-port --> define uma porta de destino, após um REDIRECT.
Obs: A maioria dos dados básicos apresentados para a tabela filter continuam
valendo. Exemplo: -p servirá para definir um protocolo de rede; -d define um host
de destino.
Ações
SNAT --> Utilizado com POSTROUTING para fazer ações de mascaramento da origem.
DNAT --> Utilizado com PREROUTING e OUTPUT para fazer ações de redirecionamento de
portas e servidores, balanceamento de carga e proxy transparente. Caso a porta de
destino não seja especificada, valerá a porta de origem. No firewall, a porta que
será redirecionada não pode existir ou estar ocupada por um daemon.
REDIRECT --> Redireciona uma requisição para uma porta local do firewall.
#iptables -t nat -L
---------------------------------------
#iptables -t nat -F
---------------------------------------
Todos os pacotes que saírem pela interface ppp0 (modem) serão mascarados. Isso dá
um nível de segurança elevado à rede que está atrás da ppp0. É uma boa regra para
navegação na Internet. Note que esse tipo de mascaramento não usa SNAT.
---------------------------------------
#iptables -t nat -A POSTROUTING -d 0/0 -j MASQUERADE
Tem o mesmo efeito da regra anterior. No entanto, parece ser menos segura, pois
estabelece que qualquer pacote destinado a qualquer outra rede, diferente da
interna, será mascarado. A regra anterior refere-se aos pacotes que saem por
determinada interface. A opção -d 0/0 poderia ser -d 0.0.0.0/0 também. É uma outra
regra para navegação na Internet.
---------------------------------------
---------------------------------------
---------------------------------------
Essa regra faz com que todos os pacotes que irão sair pela interface eth0 tenham o
seu endereço de origem alterado para 200.20.0.1 .
---------------------------------------
Todos os pacotes que entrarem pela eth0 serão enviados para a máquina 172.20.0.1
---------------------------------------
Aqui haverá o load balance. Todos os pacotes que entrarem pela eth0 serão
distribuídos entre as máquinas 172.20.0.1 , 172.20.0.2 e 172.20.0.3
---------------------------------------
Todos os pacotes TCP que vierem da rede 10.0.0.0, com máscara 255.0.0.0, destinados
à porta 80 de qualquer host, não sairão; serão redirecionados para a porta 3128 do
firewall. Isso é o passo necessário para fazer um proxy transparente. O proxy
utilizado deverá aceitar esse tipo de recurso. No caso, o Squid, que aceita
transparência, deverá estar instalado na máquina firewall, servindo na porta 3128.
---------------------------------------
Uma situação interessante: todos os pacotes que saírem da rede 192.168.1.0 serão
transformados em 200.20.5.0 .
---------------------------------------
O procedimento é totalmente seguro, pois discrimina uma origem, que só poderá sair
pela ppp0, de forma mascarada. Hoje em dia, o carregamento do módulo iptable_nat,
na maioria das vezes, se dá automaticamente, dispensando a segunda linha.
#insmod ip_conntrack_ftp
#insmod ip_nat_ftp
Salvamento de regras
--> Salvando
--> Recuperação
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe iptable_nat
iptables-restore < /etc/firewall
insmod ip_conntrack_ftp
insmod ip_nat_ftp
Topologias de firewall
O firewall será isolado quando estiver entre máquinas, com função exclusiva de
firewall:
O firewall será incorporado quando não houver uma máquina isolada como firewall.
Nesse caso, as máquinas da rede deverão estabelecer, individualmente, as suas
próprias regras de firewall. É o sistema mais inseguro:
Nada impede que os dois sistemas sejam utilizados em parceria, oferendo-se assim um
alto grau de segurança à rede. Cabe ressaltar que no firewall incorporado há maior
nível de insegurança, uma vez que outros processos rodam junto com o firewall.
FIREWALL COM IPTABLES
www.iptablesbr.cjb.net
O sistema de firewall deve ser protegido para que o restante da rede também tenha
segurança. Assim, algumas regras básicas devem ser observadas:
--> Feche a máquina firewall, de modo que todas os pacotes destinados diretamente a
ela sejam descartados:
Em seguida, aos poucos, abra o que for necessário. Cuidado, pois muitas vezes o
firewall precisará de vários acessos abertos. Por exemplo: se uma máquina firewall
isolado também for proxy, a mesma será servidora da intranet e cliente da Internet,
necessitando assim das portas superiores a 1023 abertas.
--> NUNCA rode qualquer serviço, principalmente os remotos, como telnet e ftp, na
máquina firewall, quando se tratar de firewall isolado;
--> Se tiver que administrar remotamente um firewall, utilize ssh. Nesse caso, o
ssh não deverá permitir o login como root;
--> Nunca cadastre qualquer usuário na máquina firewall, caso se trate de firewall
isolado, a não ser os que irão administrar por ssh;
--> Anule as respostas a ICMP 8 (echo reply) no firewall isolado, para evitar
identificação da topologia na rede e ataques de Ping of Death. A melhor forma de se
fazer isso é atuando sobre regras do kernel, com o comando:
--> Não deixe o firewall isolado com cara de firewall. Dê um nome descaracterizado
para ele;
--> Faça log de ações suspeitas que estiverem ocorrendo na rede;
L I N K S
http://www.netfilter.org
http://www.linuxguruz.com/iptables/howto