Você está na página 1de 16

IMPLEMENTAO DE UM FIREWALL

UTILIZANDO IPTABLES

1 . Introduo
O firewall manipula os pacotes que passam entre as redes locais e a internet. A partir desse
princpio podemos aceitar, rejeitar ou descartar pacotes. Devidamente implementado, capaz de
prover segurana e otimizar o uso dos canais de comunicao, atravs de um mtodo de controle
de acesso baseado em regras registradas na tabela de filtro do KERNEL.
No Linux, a filtragem de pacotes implementada no kernel pelos mdulos do NETFILTER, que so
manipulados pelo IPTABLES.

2 . Objetivo
Este documento descreve os procedimentos para instalao e configurao de um servidor firewall
IPTABLES no sistema operacional Debian GNU/Linux verso 3.0 testing.

3. IPTABLES
3.1 Opes a serem habilitadas no Kernel 2.6.6
Ao ser exibida a tela de opes do cdigo-fonte do kernel, habilite as seguintes opes:
---> Device Drivers --> Networking Support --->
[ * ] Networking Support
---> Networking Options
[ * ] Network packet filtering (replaces ipchains) --->

3.2 Instalando o IPTABLES


Para instalar o IPTABLES, execute o seguinte comando:
# apt-get install iptables

3.3 MANIPULANDO REGRAS COM O IPTABLES

O iptables permite-nos adicionar, listar e remover regras previamente implementadas atravs de


parmetros listados a seguir:
-A
:
Adiciona uma regra
-D
:
Remove uma regra
-F
:
Remove todas as regras em uma chain ou em todas as chains
-L
:
Lista todas as regras
-P
:
Define uma poltica padro para uma determinada chain
-N
:
Cria uma nova chain
-X
:
Apaga uma chain criada com o parmetro -N
3.3.1 Adicionando, visualizando e removendo regras
Para adicionar uma regra no kernel utilizando o iptables, basta executar o comando iptables e o
parmetro -A e para remover use o parmetro -D.
Exemplo:
# iptables -A INPUT -p icmp -d 127.0.0.1 -j DROP
Explicao: Pacotes do tipo ICMP (ping) direcionados para o endereo de loopback
(127.0.0.1) sero descartados. Para testar, tente executar o comando ping 127.0.0.1 antes e
depois de aplicar a regra. Para remover a regra adicionada anteriormente, execute o mesmo
comando, substituindo o parmetro -A, pelo parmetro -D:
# iptables -D INPUT -p icmp -d 127.0.0.1 -j DROP
Para listar as regras j adicionadas utilize o parmetro -L, como a seguir:
# iptables -L
Para listar as regras adicionadas na tabela de NAT (Network Address Translation), utilize o
parmetro -L seguido pelo parmetro -t nat, como a seguir:
# iptables -L -t nat
Obs.: Discutiremos NAT mais adiante.
Ainda podemos remover regras indicando o nmero de registro:

# iptables -D INPUT 1
Esse comando ir remover a primeira regra da chain INPUT.
Para remover regras implementadas na tabela de NAT, utilize o parmetro -t nat:
# iptables -D PREROUTING 1 -t nat
Obs.: Para obter a ajuda completa do comando iptables, utilize o comando man para visualizar a
pgina de manual ou execute o comando iptables e o parmetro -h.
Ainda possvel criar chains personalizadas. Por exemplo:
# iptables -N filtro
Acima criada uma chain, denominada filtro.
# iptables -A filtro -j LOG
# iptables -A filtro -j DROP
Agora temos uma chain personalizada demoninada filtro, que basicamente registra um pacote
(LOG) antes de descart-lo (DROP). Para aplic-la na chain INPUT, por exemplo, execute o
seguinte comando:
# iptables -A INPUT -j filtro

Obs.: Os logs do iptables podem ser visualizados atravs do comando dmesg.

3.4 CHAINs
Uma chain uma lista de regras. Cada regra diz: se o cabealho do pacote se parece com isso,
ento aqui est o que deve ser feito com o pacote. Se a regra no associa-se com o pacote, ento
a prxima regra na chain consultada. Se no h mais regras a consultar, o kernel analisa a
poltica da chain para decidir o que fazer.
Abaixo, tentamos resumir as etapas do processo:
4

1. Quando o pacote chega (pela placa Ethernet, por exemplo) o kernel analisa o destino do pacote:
isso chamado roteamento (routing).
2. Se ele destinado a prpria mquina, o pacote desce no diagrama, indo para a chain INPUT. Se
ele passar pela chain INPUT, ento a mquina recebe o pacote.
3. Depois, se o kernel no tem suporte a forwarding, ou no sabe como repassar (forward) o
pacote, este descartado. Se h suporte a forwarding e o pacote destinado a outra interface
de rede (se voc possui outra), o pacote vai para a chain FORWARD. Se ele for aceito
(ACCEPT), ele ser enviado.
4. Finalmente, um programa rodando na mquina firewall pode enviar pacotes. Esses pacotes
passam pela chain OUTPUT imediatamente: se ela aceitar o pacote, ele continua seu caminho,
caso contrrio ele descartado.

Existem duas aes bsicas que podemos fazer com os pacotes destinados a uma determinada
chain: ACCEPT e DROP. ACCEPT deixa o pacote passar entre origem e destino e DROP descarta
o pacote como se nunca o tivesse recebido.

3.4.1 INPUT
A chain INPUT empregada na entrada de pacotes que esto destinados maquina local.
Abaixo exemplos de regras na chain INPUT.
1Exemplo:
# iptables -A INPUT -p icmp -s 192.168.1.50 -d 192.168.1.1 -j DROP
Explicao: Pacotes do tipo ICMP (Ping) cuja origem o endereo IP 192.168.1.50 e o
destino 192.168.1.1, sero descartados na entrada (INPUT) sem que a origem receba qualquer
notificao.
2Exemplo:
# iptables -A INPUT -p icmp -s 192.168.1.50 -d 192.168.1.1 -j ACCEPT
# iptables -A INPUT -p icmp -d 192.168.1.1 -j DROP
Explicao: Qualquer pacote cuja origem no 192.168.1.50 que forem direcionados para o
5

endereo 192.168.1.1, sero descartados na entrada (INPUT).


3Exemplo:
# iptables -A INPUT -p tcp dport 80 -j ACCEPT
# iptables -A INPUT -p tcp -j DROP
Explicao: A primeira linha diz: 'aceite todos os pacotes TCP destinados a porta 80 (http) na
entrada'. A segunda linha diz 'descarte todos os pacotes TCP'. Nesse caso eu permitida a entrada
de pacotes apenas na porta 80 TCP desse host e bloqueada a entrada de pacotes TCP para
qualquer outra porta (que no seja 80).
4Exemplo:
# iptables -A INPUT -p udp -s 192.168.10.20 dport 53 -j DROP
Explicao: A regra bloqueia a entrada de pacotes UDP na porta 53 (DNS) vindos de um host
cujo endereo IP 192.168.10.20.

3.4.2 OUTPUT
A chain OUTPUT empregada na sada de pacotes da mquina local. Abaixo exemplos de regras
na chain OUTPUT.
Exemplo:
# iptables -A OUTPUT -p tcp --dport 23 -j DROP
Explicao: Bloqueia a sada de pacotes TCP destinados a porta 23 (telnet), saindo do host
local.

3.4.3 FORWARD
A chain FORWARD empregada em um host intermedirio (geralmente um firewall) que realiza o
repasse de pacotes entre redes. Observer a ilustrao:

Rede interna 1
eth2
eth0
eth1

Firewall

INTERNET

Rede interna 2
pacotes

No grfico acima, o firewall tem a funo de repassar (forwarding) os pacotes das redes internas
para a internet e vice-versa. A chain FORWARD se aplica no repasse desses pacotes.
Para habilitar o repasse de pacotes, no basta implementar regras na chain FORWARD, antes
preciso habilitar o recurso no kernel:
# echo 1 > /proc/sys/net/ipv4/ip_forward
ou editando o arquivo /etc/sysctl.conf e adicionar a seguinte linha:
net/ipv4/ip_forward=1

1Exemplo:
# iptables -A FORWARD -p all -s 192.168.1.0/24 -d 0/0 -j ACCEPT
Explicao: Habilita o repasse de pacotes da rede 192.168.1.0/255.255.255.0 para
qualquer destino, inclusive a internet.

2Exemplo:
# iptables -A FORWARD -p tcp -s 192.168.1.20 -d 200.181.132.137 --dport 80 -j DROP
Explicao: Bloqueia o acesso ao endereo 200.181.132.137 (www.playboy.com.br) da
origem cujo endereo IP 192.168.1.20, descartando os pacotes.

3Exemplo:
# iptables -A FORWARD -p tcp syn -m limit limit 1/sec -j ACCEPT
Explicao: a regra diz: receba apenas um pacote TCP por segundo com o bit SYN ativado.
Essa regra caracteriza a proteo contra o envio desenfreado de pacotes syn (SYNFLOOD) da sua
rede interna para a internet e vice-versa.

Nota: importante ressaltar que todas as regras so manipuladas pelo KERNEL, e o mtodo de
leitura implementado como uma fila. Observe, por exemplo, as seguintes regras:
1: # iptables -A INPUT -p icmp -d 192.168.1.1 -j DROP
2: # iptables -A INPUT -p icmp -s 192.168.1.50 -d 192.168.1.1 -j ACCEPT

CHAIN

TIPO DE PACOTE

ORIGEM

DESTINO

AO

INPUT

icmp

0.0.0.0

192.168.1.1

DROP

INPUT

icmp

192.168.1.50

192.168.1.1

ACCEPT

Explicao:
Se primeiro eu digo: descarte pacotes de qualquer origem (0.0.0.0) que chegarem no
destino 192.168.1.1, e depois eu digo: aceite apenas pacotes da origem 192.168.1.50 que
chegarem no destino 192.168.1.1, fao com que ambas as regras sejam aplicveis a um pacote
cujo endereo de destino 192.168.1.1, portanto apenas a primeira regra ser analisada e o pacote
cujo endereo de origem 192.168.1.50 e o endereo de destino 192.168.1.1 tambm ser
descartado. A segunda regra seria aplicvel apenas se adicionada antes da primeira.

3.5 NETWORK ADDRESS TRANSLATION NAT


Introduo:
Realizar NAT, consiste em alterar o endereo e porta de origem ou destino de um pacote.
Quando fazer NAT?

Para conectar uma rede de computadores internet atravs de um nico servidor


conectado com endereo IP vlido
Para disponibilizar um nmero X de servios na internet possuindo apenas um endereo
IP vlido e vrios servidores na rede interna
Fazer proxy transparente, ou seja, redirecionar os pacotes que chegam no roteador
padro da rede (default gateway) para o servidor proxy

Tipos de NAT
Source NAT (SNAT): ocorre quando o endereo ou porta de origem do pacote alterado. Source
NAT sempre ocorre no momento de post-routing (POSTROUTING), logo antes do pacote deixar o
firewall. MASQUERADING um exemplo de SNAT.
Destination NAT (DNAT): ocorre quando o endereo ou porta de destino do pacote alterado.
Destionation NAT sempre ocorre no momento de pre-routing (PREROUTING), logo quando o
pacote chega no firewall.
Observao: para realizar DNAT ou SNAT da sua rede interna, necessrio configurar o repasse de pacotes do
KERNEL. Esse passo descrito no item 3.4.3 desse documento.

3.5.1 Exemplos de SNAT


1 Exemplo:
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.0.0.1
Explicao: Todos os pacotes que sairem pela interface de rede eth0 tero o IP de origem
modificado para 10.0.0.1.

2 Exemplo:
# iptables -A POSTROUTING -t nat -p tcp -o eth0 -j MASQUERADE
Explicao: Faz com que todos os pacotes saindo da interface eth0 tero como endereo de
origem, o IP do firewall. Essa regra pode ser usada caso o servidor atue como um proxy.

3 Exemplo:
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 10.0.0.3:8080
Explicao: Os pacotes que saem pela interface eth0 tero endereo de origem modificado
para 10.0.0.3 e a porta de origem modificada para 8080.

3.5.2 Exemplos de DNAT


1 Exemplo:
# iptables -t nat -A PREROUTING -p tcp -i eth0 -j DNAT --to 10.0.0.50
Explicao: Pacotes TCP que chegarem atravs da interface de rede eth0 sero
encaminhados para o host cujo endereo IP 10.0.0.50.
Aplicabilidade: Mltiplos servidores que no possuem endereo IP podem alocar servios na
rede interna e estarem acessveis na internet.
2 Exemplo:
# iptables -t nat -A PREROUTING -p tcp -d 10.0.0.1 --dport 80 -j DNAT --to 10.0.0.30:3128
Explicao: Pacotes que forem destinados ao endero IP 10.0.0.1 na porta 80 tcp, sero
redirecionados para a porta 3128 do host que possui endereo IP 10.0.0.30.
Aplicabilidade: Pode ser aplicada fazendo com que o proxy se torne transparente,
redirecionando pacotes destinados a porta 80 (http) e 443 (https) para o proxy.

3.6 Exemplo de configurao do firewall baseado em uma topologia


Implementando o firewall em uma rede local e disponibilizando acesso a internet atravs de
um firewall:
Topologia:

servidor web
(192.168.1.50)
200.198.10.2

Rede Interna
192.168.1.0/24

eth1
eth0

FIREWALL

192.168.1.1

200.198.10.1
roteador

INTERNET
10

A rede 192.168.1.0/255.255.255.0 acessa a internet atravs do firewall, que est conectado ao


roteador, cumprindo o papel de gateway padro (default gateway) dos hosts. Portanto, o firewall
possui duas interfaces de rede. Os pacotes que saem da rede interna para a internet so
encaminhados (forwarding) atravs do firewall, que por sua vez os encaminha para o roteador, onde
finalmente so encaminhados para fora (internet). Na volta ocorre o inverso, o roteador recebe o
pacote, encaminha-o para o firewall, que novamente o encaminha para o host da rede interna que
realizou a requisio original. Antes do pacote sair pelo firewall aplicado o post-routing (pacotes
que ainda sero roteados) e na volta aplicado o pre-routing (pacotes que j foram roteados).
H ainda um servidor web na rede interna que precisa estar acessvel na internet. Vamos
disponibiliz-lo realizando DNAT.
Arquivo de script para configurao do firewall:
#!/bin/bash
####INCIODAFUNOstop####
stop()
{
#desbilitaorepassedepacotesdokernel
echo0>/proc/sys/net/ipv4/ip_forward
#limparegrasexistentesnaschainsINPUT,OUTPUTEFORWARD
/sbin/iptablesF
#limpaasregrasexistentesnatabeladeNAT
/sbin/iptablesFtnat
}
####FIMDAFUNOstop####
####INCIODAFUNOSTART####
start()
{
#habilitandoorepassedepacotesnokernel
echo1>/proc/sys/net/ipv4/ip_forward
#####################################################################
#########################ROTEAMENTO################################
#####################################################################
#criarotapadroparaogatewaynoprovedor(200.198.10.1)
/sbin/routeadddefaultgw200.198.10.1deveth1

11

#####################################################################
##########################REGRAS###################################
#####################################################################
#DefineapolticapadroparacadaCHAIN
/sbin/iptablesPFORWARDDROP
/sbin/iptablesPINPUTDROP
/sbin/iptablesPOUTPUTDROP
#criaumanovachaindenominadafiltro
/sbin/iptablesNfiltro
#aceitaconexesdaredeinterna
/sbin/iptablesAfiltromstatestateESTABLISHED,RELATEDjACCEPT
#rejeitanovasconexesquenosejamdaredeinterna
/sbin/iptablesAfiltromstatestateNEW!ieth0jDROP
#####################################################################
#################DETECTAEREGISTRAPORTSCANNERS###################
#####################################################################
#Xmasportscan
/sbin/iptablesAfiltroptcptcpflagsALLFIN,URG,PSHmlimitlimit2/m
limitburst2jLOGlogprefix"Xmasportscanner:"
#descartaopacote
/sbin/iptablesAfiltroptcptcpflagsALLFIN,URG,PSHjDROP
#portscannerdotipoqueativaosbitsSYNeFIN
/sbin/iptablesAfiltroptcptcpflagsALLSYN,FINmlimitlimit2/m
limitburst2jLOGlogprefix"SYNFINportscanner:"
#descartaopacote
/sbin/iptablesAfiltroptcptcpflagsALLSYN,FINjDROP
#portscannerdotipoqueativaosbitsSYNeRST
/sbin/iptablesAfiltroptcptcpflagsSYN,RSTSYN,RSTmlimitlimit2/m
limitburst2jLOGlogprefix"SYNRSTportscanner:"
#descartaopacote
/sbin/iptablesAfiltroptcptcpflagsSYN,RSTSYN,RSTjDROP
#portscannerdotipoqueativaobitFIN
/sbin/iptablesAfiltroptcptcpflagsALLFINmlimitlimit2/m
limitburst2mstatestate!ESTABLISHEDjLOGlogprefix
"FINportscanner:"
#descartaopacote
/sbin/iptablesAfiltroptcptcpflagsALLFINmstatestate!ESTABLISHED
jDROP
#portscannerdotipoquehabilitatodasasflagstcp
/sbin/iptablesAfiltroptcptcpflagsALLALLmlimitlimit2/m
limitburst2jLOGlogprefix"ALLportscanner:"
#descartaopacote
/sbin/iptablesAfiltroptcptcpflagsALLALLjDROP
#portscannerdotipoquenohabilitanenhumflag
/sbin/iptablesAfiltroptcptcpflagsALLNONEmlimitlimit2/m
limitburst2jLOGlogprefix"NONEportscanner:"

12

#descartaopacote
/sbin/iptablesAfiltroptcptcpflagsALLNONEjDROP

###################################################################
#################PROTEOCONTRAATAQUESCONHECIDOS##############
###################################################################
#proteocontrasynflood
/sbin/iptablesAfiltroptcpsynmlimitlimit1/sjACCEPT
#proteocontrapingdamorte
/sbin/iptablesAfiltropicmpicmptypeechorequestmlimitlimit1/sj
ACCEPT
#bloqueiaoutrasconexes
/sbin/iptablesAfiltrojDROP

######################################################################
#################POLTICAPARAREPASSEDEPORTAS####################
######################################################################
#liberaorepassedepacotesapenasparaportas53udp(dns),80tcp(http),
#443tcp(https)
/sbin/iptablesAFORWARDptcps192.168.1.0/24dport80jACCEPT
/sbin/iptablesAFORWARDptcps192.168.1.0/24dport443jACCEPT
/sbin/iptablesAFORWARDpudps192.168.1.0/24dport53jACCEPT

#aplicaachainfiltronaINPUT,ouseja,ospacotesquepassarempelachainINPUT
#serodirecionadosparaachainfiltro
/sbin/iptablesAINPUTjfiltro
#aplicaachainfiltronaFORWARD,ouseja,antesdospacotesseremrepassados
(forwarding),serodirecionadospelachainfiltro
/sbin/iptablesAFORWARDjfiltro

####RegrasnatabeladeNAT####
#mascaraospacotesquechegamnainterfaceeth0comdestinoaportatcp80(http)
/sbin/iptablesAPOSTROUTINGtnatptcps192.168.1.0/24oeth1jMASQUERADE
#disponibilizandoacessoaoservidorwebquerodanaporta80e443dohost
192.168.1.50
/sbin/iptablesAPREROUTINGtnatptcpdport80jDNATto192.168.1.50:80
/sbin/iptablesAPREROUTINGtnatptcpdport443jDNATto192.168.1.50:443
}
####FIMDAFUNOstart####
###################################################################

13

###################INICIANDOEPARANDOOSERVIDOR################
###################################################################
if[$#lt1];then
echo$1{start|stop|restart};
exit1;
fi
if[$1==start];then
echoIniciandooservidorfirewall...;
start;
fi
if[$1==stop];then
echoParandooservidorfirewall...;
stop;
fi
if[$1==restart];then
Parandooservidorfirewall...
stop;
IniciandooservidorFirewall...
start;
fi

FIM DO ARQUIVO

Agora preciso configurar o init para executar o script e configurar as rotas durante a inicializao
do sistema.
Salve o arquivo com o nome firewall no diretrio /etc/init.d e crie um link no diretrio e comandos do
init padro. Por exemplo, se o seu init padro est configurado para iniciar no nvel 3, execute o
seguinte comando:
# chmod u+x /etc/init.d/firewall
# ln -s /etc/init.d/firewall /etc/rc3.d/S99firewall
O script ser executado sempre que o sistema for inicializado no init 3.

3.7 Opes avanadas do IPTABLES


3.7.1 Especificando mltiplas portas com o mdulo
O mdulo multiport permite especificar mltiplas portas em uma nica regra. Sem o multiport seria

14

preciso fazer uma regra para cada porta:


# iptables -A INPUT -p tcp -d 1.2.3.4 --dport 25 -j ACCEPT
# iptables -A INPUT -p tcp -d 1.2.3.4 --dport 110 -j ACCEPT
# iptables -A INPUT -p tcp -d 1.2.3.4 --dport 143 -j ACCEPT
Usando o multiport, poderamos aplicar a mesma configurao com apenas uma regra:
# iptables -A INPUT -p tcp -d 1.2.3.4 -m multiport --dports 25,110,143 -j ACCEPT
Pode-se especificar no mximo 15 portas diferentes.

3.7.2 Limitando o nmero de conexes usando o mdulo


usado para impor um limite de conexes em uma determinada porta ou host. Observe o exemplo:
# iptables -A FORWARD -p tcp --dport 25 -i eth0 -m limit limit 30/hour --limit-burst 5 -j
ACCEPT
Explicao: Limita os hosts que estiverem conectados na interface eth0 a efetuarem apenas
30 conexes na porta 25 a cada hora. A opo --limit-burst limita apenas 5 conexes para cada
host.
3.7.3 Criando uma lista de conexes recentes usando o mdulo
O mdulo recent permite criar uma lista de endereos IP de conexes recentes.
Exemplo:
# iptables -A FORWARD -m recent --name portscan --rcheck --seconds 60 -j DROP
# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m recent name
portscan --set -j DROP
Explicao: A primeira regra cria uma lista de endereos que checada a cada 60 segundos,
bloqueando os endereos cadastrados durante esse tempo. A segunda regra, caso seja aplicvel a
um pacote (nesse caso um pacote suspeito de portscan), inclui na lista o endereo do host que
enviou o pacote.

15

3.7.4 Implementando regras baseadas nos valores TTL


Exemplo:
# iptables -A FORWARD -m ttl --ttl-lt 30 -j DROP
Explicao: Descarta pacotes que possuam um valor TTL inferior (--ttl-lt) a 30.
Podemos especificar valores maiores (ttl-gt), menores (--ttl-lt) ou iguais (--ttl-eq) durante a
checagem do pacote.
FIM DO DOCUMENTO
Referncias:
http://www.netfilter.org/
Autor: Diogo Correia Gonzaga
Reviso e correes: Ricardo Bimbo Troccoli
Braslia, 23 de novembro de 2004

16

Você também pode gostar