segunda-feira, 7 de maio de 2007

Experiências com o iptables


The Firewall
"The firewall stands guard against unwelcome packets and connections. Anarchy and mob rule may run rampant outside, but within the wall is law and order... you hope. Protection, fortification, civility, courtesy, protocol. Reversed: absence of vigilance, false sense of security, barbarian conquest."



O post de hoje tem muito a ver com esta carta postada do lado. Hoje eu irei falar um pouco sobre o iptables.

Bem, o que é o iptables ?? Antes de tratarmos do IPTABLES, vamos conhecer o netfilter. O netfilter é um framework dentro do KERNEL Linux com o qual outras coisas (como o módulo do iptables) podem conectar-se. Ele é responsável por interceptar e manipular os pacotes de rede que trafegam pela máquina. Existem vários componentes que operam o netfilter, provendo diversas funcionalidades. Entre estes temos a principal que é filtrar os pacotes da rede, tornando-o assim um firewall. Temos também o NAT, que consiste em reescrever os endereços IP de origem de um pacote que passam sobre um router ou firewall de maneira que um computador de uma rede interna tenha acesso ao exterior.

O iptables é uma ferramenta de edição da tabela de filtragem de pacotes, ou seja, com ele você é capaz de analisar o cabeçalho (header) e tomar decisões sobre os destinos destes pacotes.

O iptables acompanha o kernel 2.4.x. Antes dele existia o ipchains (kernel 2.2.x) e anteriormente ainda existia o ipfwadm. Na realidade no kernel 2.4.x ainda existem os filtros ipchains e ipfwadm por motivos de compatibilidade mas ambos não estão ativos. Caso estejam ativos (isto pode acontecer com o ipchains) é necessário desativá-los para que o iptables possa funcionar plenamente.


Funcionamento básico do iptables

É através de regras poderemos fazer com que os pacotes possam ser ou não recebidos na rede toda, em determinada máquina, interface ou mesmo porta de conexão. O iptables trabalha através de Tabelas, Chains e Regras:

Tabelas:
Existem 3 tabelas possíveis de serem utilizadas no iptables, sendo que uma delas, a
mangle raramente é usada, restando a filter, que é a padrão, utilizada nos tráfegos de dados comuns, sem ocorrência de NAT. Quando não especificamos qual tabela a ser utilizada é ela que será ativada. A outra geralmente utilizada é a nat, que como o próprio nome diz, usada quando há ocorrência de NAT.

Chains:
Através delas podemos especificar a situação do tratamento dos pacotes, seja qual tabela for.

Quando utilizamos a tabela nat as Chains possíveis são:
PREROUTING – Quando os pacotes entram para sofrerem NAT.
POSTROUTING – Quando os pacotes estão saindo após sofrerem NAT
OUTPUT – Pacotes que são gerados na própria máquina e que sofrerão NAT
Já com a tabela filter as Chains são:
INPUT - Pacotes cujo destino final é a própria máquina firewall.
OUTPUT – Pacotes que saem da máquina firewall
FORWARD – Pacote que atravessa a máquina firewall, cujo destino é uma outra máquina. Este pacote não sai da máquina firewall e sim de outra máquina da rede ou fonte. Neste caso a máquina firewall está repassando o pacote.

Regras:
As regras de firewall geralmente são compostas de uma Tabela, Opção, Chain, Dados e Ação. Através destes elementos podemos especificar o que fazer com os pacotes.

Opções:
-P - Define uma regra padrão
-A - Acrescenta uma nova regra as existentes. Este tem prioridade sobre a -P
-D - Apaga-se uma regra
-L - Lista as regras existentes
-F - Apaga todas as regras
-I - Insere uma regra nova
-h - Muito útil, pois mostra a ajuda
-R - Substitui uma regra
-C - Faz uma checagem das regras existentes
-Z - Zera uma regra específica
-N - Cria uma nova regra com um nome
-X - Exclui uma regra específica pelo seu nome

Vamos lá ...
Dados:
-s : Especifica o origem do pacote. Este pode ser tanto uma rede ou host. Possíveis combinações podem ser:
-s 192.168.0.0/255.255.255.0 ou -s 192.168.0.0/24
OBS: No segundo caso estamos especificando a máscara de rede conforme o número de bits 1, por exemplo:
Máscara de rede 255.0.0.0 = 8
Máscara de rede 255.255.0.0 = 16
Máscara de rede 255.255.255.0 = 24
No exemplo acima estamos especificando toda uma rede de máscara C, no exemplo abaixo especificamos um host:
-s 192.168.30.51/255.255.255.255 ou -s 192.168.30.51
também pode ser assim:
-s 192.168.30.51/32
OBS: A máscara em números de bits 1 para host é 32.
Podemos especificar assim também:
-s www tccamargo.com
Podemos especificar qualquer origem também:
-s 0.0.0.0/0.0.0.0 ou -s 0/0
-d : Especifica o destino do pacote. A sintaxe é a mesma do -s
-p : Protocolo usado na regra. Pode ser tcp, udp, icmp:
-p tcp
-p udp
-p icmp
-i : Interface de entrada, ou seja, placa de rede, modem ou interface de conexão que estará recebendo o pacote a ser tratado.
-i eth0
-i eth1
-i ppp0
-o : Interface de saída. As sintaxes são as mesmas que -i, sendo que neste caso estará enviando o pacote a ser tratado.
! : Exclui determinado argumento:
-i ! eth0 - Refere-se a qualquer interface de entrada exceto a eth0
-s ! 192.168.0.45 – Refere-se a qualquer endereço de entrada exceto o 192.168.0.45
--sport : Refere-se a porta de origem. Este deve vir acompanhado das funções -p tcp e -p udp :
-p tcp –sport 80 – Refere-se a porta de origem 80 sob protocolo tcp
--dport : Refere-se a porta de destino. Assim como a função –sport, ela trabalha somente com a -p tcp e -p udp. A sintaxe é similar a –sport
Através das funções –sport e –dport podemos especificar não só uma porta específica como também um range de portas:
--sport 33435:33525
Ações:
As ações sempre vem após o parâmetro -j e geralmente são:
ACCEPT – Aceita e permite a passagem do pacote.
DROP – Não permite a passagem do pacote e abandona-o não dando sinais de recebimento.
REJECT – Assim como o DROP, não permite a passagem do pacote, mas envia um aviso ( icmp unreachable )
LOG – Cria um Log referente a regra em /var/log/messages
Com estes fatores podemos criar as nossas regras com a seguinte composição:
# iptables -A FORWARD -s 192.168.0.45 -p icmp -j DROP
Sendo: -A ( opção ) / FORWARD ( Chain ) / -s 192.168.0.45 -p icmp ( Dados ) -j DROP ( Ação )
No caso do exemplo a cima a regra determina que todos os pacotes icmp originários do endereço 192.168.0.45 devem ser barrados.
Salvando as regras
Depois das regras prontas podemos salvá-las com este comando:
# iptables-save >
Para recuperá-las use este comando:
# iptables-restore >
Outra forma seria fazer um script com as regras:
Exemplo de Script
#!/bin/bash
#limpando tabelas
iptables -F &&
iptables -X &&
iptables -t nat -F &&
iptables -t nat -X &&
#liberando acesso interno da rede
iptables -A INPUT -p tcp --syn -s 192.168.1.0/255.255.255.0 -j ACCEPT &&
iptables -A OUTPUT -p tcp --syn -s 192.168.1.0/255.255.255.0 -j ACCEPT &&
iptables -A FORWARD -p tcp --syn -s 192.168.1.0/255.255.255.0 -j ACCEPT &&
#compartilhando a web na rede interna
iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth1 -j MASQUERADE &&
echo 1 > /proc/sys/net/ipv4/ip_forward &&
# Protecao contra port scanners ocultos
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# Bloqueando tracertroute
iptables -A INPUT -p udp -s 0/0 -i eth1 --dport 33435:33525 -j DROP
#Protecoes contra ataques
iptables -A INPUT -m state --state INVALID -j DROP
#termina
echo "Iptables Pronto"

Salve-o com um nome sugestivo, como por exemplo “start-firewall”.
Dê permissão de execução:
chmod +x start-firewall
Pronto. Toda vez que quiser que ele seja habilitado é só executá-lo ( sempre como root ):
# start-firewall
Para não ter que ficar chamando o script toda vez que inicializar o sistema, podemos fazer com que ele seja ativado na inicialização. Para isso é preciso editar o arquivo
/etc/rc.d/rc.local e incluir o comando no final do arquivo.:-)


Bem pessoal, não é um tutorial curto ... São várias regras, para delas vc precisa conhecer um pouco de redes, principalmente quando vc está lidando com regras de roteamento e de NAT.

Espero que mais isto possa ser útil.