Professional Documents
Culture Documents
UTILIZANDO IPTABLES
1
1 . Introdução
O firewall manipula os pacotes que passam entre as redes locais e a internet. A partir desse
princípio podemos aceitar, rejeitar ou descartar pacotes. Devidamente implementado, é capaz de
prover segurança e otimizar o uso dos canais de comunicação, através de um método de controle
de acesso baseado em regras registradas na tabela de filtro do KERNEL.
No Linux, a filtragem de pacotes é implementada no kernel pelos módulos do NETFILTER, que são
manipulados pelo IPTABLES.
2 . Objetivo
3. IPTABLES
2
O iptables permite-nos adicionar, listar e remover regras previamente implementadas através de
parâmetros 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 política padrão para uma determinada chain
-N : Cria uma nova chain
-X : Apaga uma chain criada com o parâmetro -N
Para adicionar uma regra no kernel utilizando o iptables, basta executar o comando iptables e o
parâmetro -A e para remover use o parâmetro -D.
Exemplo:
# iptables -L
Para listar as regras adicionadas na tabela de NAT (Network Address Translation), utilize o
parâmetro -L seguido pelo parâmetro -t nat, como a seguir:
# iptables -L -t nat
3
# iptables -D INPUT 1
Obs.: Para obter a ajuda completa do comando iptables, utilize o comando man para visualizar a
página de manual ou execute o comando iptables e o parâmetro -h.
# iptables -N filtro
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:
3.4 CHAINs
Uma chain é uma lista de regras. Cada regra diz: “se o cabeçalho do pacote se parece com isso,
então aqui está o que deve ser feito com o pacote”. Se a regra não associa-se com o pacote, então
a próxima regra na chain é consultada. Se não há mais regras a consultar, o kernel analisa a
política 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 própria máquina, o pacote desce no diagrama, indo para a chain INPUT. Se
ele passar pela chain INPUT, então a máquina recebe o pacote.
3. Depois, se o kernel não tem suporte a forwarding, ou não 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 máquina firewall pode enviar pacotes. Esses pacotes
passam pela chain OUTPUT imediatamente: se ela aceitar o pacote, ele continua seu caminho,
caso contrário ele é descartado.
Existem duas ações básicas 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 estão destinados à maquina local.
Abaixo exemplos de regras na chain INPUT.
1Exemplo:
2Exemplo:
Explicação: Qualquer pacote cuja origem não é 192.168.1.50 que forem direcionados para o
5
endereço 192.168.1.1, serão descartados na entrada (INPUT).
3Exemplo:
Explicação: 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 não seja 80).
4Exemplo:
Explicação: A regra bloqueia a entrada de pacotes UDP na porta 53 (DNS) vindos de um host
cujo endereço IP é 192.168.10.20.
3.4.2 OUTPUT
A chain OUTPUT é empregada na saída de pacotes da máquina local. Abaixo exemplos de regras
na chain OUTPUT.
Exemplo:
Explicação: Bloqueia a saída de pacotes TCP destinados a porta 23 (telnet), saindo do host
local.
3.4.3 FORWARD
6
Rede interna 1
eth2
eth0
Firewall INTERNET
eth1
Rede interna 2
pacotes
No gráfico acima, o firewall tem a função 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, não basta implementar regras na chain FORWARD, antes é
preciso habilitar o recurso no kernel:
net/ipv4/ip_forward=1
1Exemplo:
2Exemplo:
7
3Exemplo:
Explicação: a regra diz: “receba apenas um pacote TCP por segundo com o bit SYN ativado”.
Essa regra caracteriza a proteção 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 são manipuladas pelo KERNEL, e o método de
leitura implementado é como uma fila. Observe, por exemplo, as seguintes regras:
Explicação:
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”, faço com que ambas as regras sejam aplicáveis a um pacote
cujo endereço de destino é 192.168.1.1, portanto apenas a primeira regra será analisada e o pacote
cujo endereço de origem é 192.168.1.50 e o endereço de destino é 192.168.1.1 também será
descartado. A segunda regra seria aplicável apenas se adicionada antes da primeira.
Introdução:
Realizar NAT, consiste em alterar o endereço e porta de origem ou destino de um pacote.
8
• Para conectar uma rede de computadores à internet através de um único servidor
conectado com endereço IP válido
• Para disponibilizar um número X de serviços na internet possuindo apenas um endereço
IP válido e vários servidores na rede interna
• Fazer proxy transparente, ou seja, redirecionar os pacotes que chegam no roteador
padrão da rede (default gateway) para o servidor proxy
Tipos de NAT
Source NAT (SNAT): ocorre quando o endereço 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 endereço ou porta de destino do pacote é alterado.
Destionation NAT sempre ocorre no momento de pre-routing (PREROUTING), logo quando o
pacote chega no firewall.
Observação: para realizar DNAT ou SNAT da sua rede interna, é necessário configurar o repasse de pacotes do
KERNEL. Esse passo é descrito no item 3.4.3 desse documento.
1 Exemplo:
Explicação: Todos os pacotes que sairem pela interface de rede eth0 terão o IP de origem
modificado para “10.0.0.1”.
2 Exemplo:
Explicação: Faz com que todos os pacotes saindo da interface eth0 terão como endereço de
origem, o IP do firewall. Essa regra pode ser usada caso o servidor atue como um proxy.
9
3 Exemplo:
Explicação: Os pacotes que saem pela interface eth0 terão endereço de origem modificado
para 10.0.0.3 e a porta de origem modificada para 8080.
1 Exemplo:
Explicação: Pacotes TCP que chegarem através da interface de rede eth0 serão
encaminhados para o host cujo endereço IP é 10.0.0.50.
Aplicabilidade: Múltiplos servidores que não possuem endereço IP podem alocar serviços na
rede interna e estarem acessíveis na internet.
2 Exemplo:
Explicação: Pacotes que forem destinados ao enderço IP 10.0.0.1 na porta 80 tcp, serão
redirecionados para a porta 3128 do host que possui endereço 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.
200.198.10.2
eth1 200.198.10.1
Rede Interna
FIREWALL
INTERNET
roteador
192.168.1.0/24 eth0
192.168.1.1
10
A rede 192.168.1.0/255.255.255.0 acessa a internet através do firewall, que está conectado ao
roteador, cumprindo o papel de gateway padrão (default gateway) dos hosts. Portanto, o firewall
possui duas interfaces de rede. Os pacotes que saem da rede interna para a internet são
encaminhados (forwarding) através do firewall, que por sua vez os encaminha para o roteador, onde
finalmente são 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 requisição original. Antes do pacote sair pelo firewall é aplicado o post-routing (pacotes
que ainda serão roteados) e na volta é aplicado o pre-routing (pacotes que já foram roteados).
Há ainda um servidor web na rede interna que precisa estar acessível na internet. Vamos
disponibilizá-lo realizando DNAT.
#!/bin/bash
#### INÍCIO DA FUNÇÃO stop ####
stop()
{
# desbilita o repasse de pacotes do kernel
echo “0” > /proc/sys/net/ipv4/ip_forward
# limpa regras existentes nas chains INPUT, OUTPUT E FORWARD
/sbin/iptables F
# limpa as regras existentes na tabela de NAT
/sbin/iptables F t nat
}
#### FIM DA FUNÇÃO stop ####
#### INÍCIO DA FUNÇÃO START ####
start ()
{
# habilitando o repasse de pacotes no kernel
echo “1” > /proc/sys/net/ipv4/ip_forward
#####################################################################
######################### ROTEAMENTO ################################
#####################################################################
# cria rota padrão para o gateway no provedor (200.198.10.1)
/sbin/route add default gw 200.198.10.1 dev eth1
11
#####################################################################
########################## REGRAS ###################################
#####################################################################
# Define a política padrão para cada CHAIN
/sbin/iptables P FORWARD DROP
/sbin/iptables P INPUT DROP
/sbin/iptables P OUTPUT DROP
# cria uma nova chain denominada filtro
/sbin/iptables N filtro
# aceita conexões da rede interna
/sbin/iptables A filtro m state state ESTABLISHED,RELATED j ACCEPT
# rejeita novas conexões que não sejam da rede interna
/sbin/iptables A filtro m state state NEW ! i eth0 j DROP
#####################################################################
################# DETECTA E REGISTRA PORTSCANNERS ###################
#####################################################################
# Xmas portscan
/sbin/iptables A filtro p tcp tcpflags ALL FIN,URG,PSH m limit limit 2/m
limitburst 2 j LOG logprefix "Xmas portscanner: "
# descarta o pacote
/sbin/iptables A filtro p tcp tcpflags ALL FIN,URG,PSH j DROP
# portscanner do tipo que ativa os bits SYN e FIN
/sbin/iptables A filtro p tcp tcpflags ALL SYN,FIN m limit limit 2/m
limitburst 2 j LOG logprefix "SYN FIN portscanner: "
# descarta o pacote
/sbin/iptables A filtro p tcp tcpflags ALL SYN,FIN j DROP
# portscanner do tipo que ativa os bits SYN e RST
/sbin/iptables A filtro p tcp tcpflags SYN,RST SYN,RST m limit limit 2/m
limitburst 2 j LOG logprefix "SYN RST portscanner: "
# descarta o pacote
/sbin/iptables A filtro p tcp tcpflags SYN,RST SYN,RST j DROP
# portscanner do tipo que ativa o bit FIN
/sbin/iptables A filtro p tcp tcpflags ALL FIN m limit limit 2/m
limitburst 2 m state state ! ESTABLISHED j LOG logprefix
"FIN portscanner: "
# descarta o pacote
/sbin/iptables A filtro p tcp tcpflags ALL FIN m state state ! ESTABLISHED
j DROP
# portscanner do tipo que habilita todas as flags tcp
/sbin/iptables A filtro p tcp tcpflags ALL ALL m limit limit 2/m
limitburst 2 j LOG logprefix "ALL portscanner: "
# descarta o pacote
/sbin/iptables A filtro p tcp tcpflags ALL ALL j DROP
# portscanner do tipo que não habilita nenhum flag
/sbin/iptables A filtro p tcp tcpflags ALL NONE m limit limit 2/m
limitburst 2 j LOG logprefix "NONE portscanner: "
12
# descarta o pacote
/sbin/iptables A filtro p tcp tcpflags ALL NONE j DROP
###################################################################
################# PROTEÇÃO CONTRA ATAQUES CONHECIDOS ##############
###################################################################
# proteção contra synflood
/sbin/iptables A filtro p tcp syn m limit limit 1/s j ACCEPT
# proteção contra ping da morte
/sbin/iptables A filtro p icmp icmptype echorequest m limit limit 1/s j
ACCEPT
# bloqueia outras conexões
/sbin/iptables A filtro j DROP
######################################################################
################# POLÍTICA PARA REPASSE DE PORTAS ####################
######################################################################
# libera o repasse de pacotes apenas para portas 53 udp (dns), 80 tcp (http),
# 443 tcp (https)
/sbin/iptables A FORWARD p tcp s 192.168.1.0/24 dport 80 j ACCEPT
/sbin/iptables A FORWARD p tcp s 192.168.1.0/24 dport 443 j ACCEPT
/sbin/iptables A FORWARD p udp s 192.168.1.0/24 dport 53 j ACCEPT
# aplica a chain filtro na INPUT, ou seja, os pacotes que passarem pela chain INPUT
# serão direcionados para a chain filtro
/sbin/iptables A INPUT j filtro
# aplica a chain filtro na FORWARD, ou seja, antes dos pacotes serem repassados
(forwarding), serão direcionados pela chain filtro
/sbin/iptables A FORWARD j filtro
# # # # Regras na tabela de NAT # # # #
# mascara os pacotes que chegam na interface eth0 com destino a porta tcp 80 (http)
/sbin/iptables A POSTROUTING t nat p tcp s 192.168.1.0/24 o eth1 j MASQUERADE
# disponibilizando acesso ao servidor web que roda na porta 80 e 443 do host
192.168.1.50
/sbin/iptables A PREROUTING t nat p tcp dport 80 j DNAT to 192.168.1.50:80
/sbin/iptables A PREROUTING t nat p tcp dport 443 j DNAT to 192.168.1.50:443
}
#### FIM DA FUNÇÃO start ####
###################################################################
13
################### INICIANDO E PARANDO O SERVIDOR ################
###################################################################
if [ $# lt 1 ]; then
echo “$1 { start | stop | restart }”;
exit 1;
fi
if [ $1 == “start” ]; then
echo “Iniciando o servidor firewall...”;
start;
fi
if [ $1 == “stop” ]; then
echo “Parando o servidor firewall...”;
stop;
fi
if [ $1 == “restart” ]; then
“Parando o servidor firewall...”
stop;
“Iniciando o servidor Firewall...”
start;
fi
# # # FIM DO ARQUIVO # # #
Agora é preciso configurar o init para executar o script e configurar as rotas durante a inicialização
do sistema.
Salve o arquivo com o nome firewall no diretório /etc/init.d e crie um link no diretório e comandos do
init padrão. Por exemplo, se o seu init padrão está configurado para iniciar no nível 3, execute o
seguinte comando:
O módulo multiport permite especificar múltiplas portas em uma única regra. Sem o multiport seria
14
preciso fazer uma regra para cada porta:
Usando o multiport, poderíamos aplicar a mesma configuração com apenas uma regra:
É usado para impor um limite de conexões em uma determinada porta ou host. Observe o exemplo:
Explicação: Limita os hosts que estiverem conectados na interface eth0 a efetuarem apenas
30 conexões na porta 25 a cada hora. A opção --limit-burst limita apenas 5 conexões para cada
host.
Exemplo:
Explicação: A primeira regra cria uma lista de endereços que é checada a cada 60 segundos,
bloqueando os endereços cadastrados durante esse tempo. A segunda regra, caso seja aplicável a
um pacote (nesse caso um pacote suspeito de portscan), inclui na lista o endereço do host que
enviou o pacote.
15
3.7.4 Implementando regras baseadas nos valores TTL
Exemplo:
Explicação: 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
Referências:
http://www.netfilter.org/
16