Você está na página 1de 30

Iptables

Firewalls no Linux

por oliver menezes


Firewall - Iptables
• O iptables é um código de firewall das
versões 2.4 do kernel, que substituiu o
ipchains (presente nas séries 2.2 do
kernel). Ele foi incluído no kernel da série
2.4 em meados de Junho/Julho de 1999.
Componentes
• Pacote: iptables
• iptables - Sistema de controle principal para protocolos
ipv4
• ip6tables - Sistema de controle principal para protocolos
ipv6
• iptables-save - Salva as regras atuais em um arquivo
especificado como argumento. Este utilitário pode ser
dispensado por um shell script contendo as regras
executado na inicialização da máquina.
• iptables-restore - Restaura regras salvas pelo utilitário
iptables-save.
Hardware Necessário
• É necessário que o seu kernel tenha sido
compilado com suporte ao iptables. O
requerimento mínimo de memória necessária
para a execução do iptables é o mesmo do
kernel 2.4 (4MB). Dependendo do tráfego que
será manipulado pela(s) interface(s) do firewall
ele poderá ser executado com folga em uma
máquina 386 SX com 4MB de RAM.
• Como as configurações residem no kernel não é
necessário espaço extra em disco rígido para a
execução deste utilitário.
Registro
• Todo tráfego que for registrado pelo
iptables é registrado por padrão no
arquivo /var/log/kern.log.
Instalação
#apt-get install iptables
• O pacote iptables contém o utilitário
iptables (e ip6tables para redes ipv6)
necessários para inserir suas regras no
kernel. Se você não sabe o que é ipv6,
não precisará se preocupar com o utilitário
ip6tables por enquanto.
Tipos de firewalls
Existem basicamente dois tipos de firewalls:
• nível de aplicação - Este tipo de firewall analisam o
conteúdo do pacote para tomar suas decisões de
filtragem. Permitem um controle relacionado com o
conteúdo do tráfego. Servidores proxy, como o squid,
são um exemplo deste tipo de firewall.
• nível de pacotes - Este tipo de firewall toma as decisões
baseadas nos parâmetros do pacote, como
porta/endereço de origem/destino, estado da conexão, e
outros parâmetros do pacote. O firewall então pode
negar o pacote (DROP) ou deixar o pacote passar
(ACCEPT). O iptables é um excelente firewall que se
encaixa nesta categoria.
O que são regras?

• As regras são como comandos passados ao iptables


para que ele realize uma determinada ação (como
bloquear ou deixar passar um pacote) de acordo com o
endereço/porta de origem/destino, interface de
origem/destino, etc. As regras são armazenadas dentro
dos chains e processadas na ordem que são inseridas.
• As regras são armazenadas no kernel, o que significa
que quando o computador for reiniciado tudo o que fez
será perdido. Por este motivo elas deverão ser gravadas
em um arquivo para serem carregadas a cada
inicialização.
• Um exemplo de regra:
#iptables -A INPUT -s 123.123.123.1 -j DROP
O que são chains?
• Os Chains são locais onde as regras do firewall
definidas pelo usuário são armazenadas para
operação do firewall. Existem dois tipos de
chains: os embutidos (como os chains INPUT,
OUTPUT e FORWARD) e os criados pelo
usuário. Os nomes dos chains embutidos devem
ser especificados sempre em maiúsculas (note
que os nomes dos chains são case-sensitive, ou
seja, o chain input é completamente diferente de
INPUT
O que são tabelas?
• Tabelas são os locais usados para
armazenar os chains e conjunto de regras
com uma determinada característica em
comum. As tabelas podem ser
referenciadas com a opção -t tabela e
existem 3 tabelas disponíveis no iptables:
– Filter;
– NAT;
– Mangle.
O que são tabelas?
• filter - Esta é a tabela padrão, contém 3
chains padrões:
– INPUT - Consultado para dados que chegam
a máquina
– OUTPUT - Consultado para dados que saem
da máquina
– FORWARD - Consultado para dados que são
redirecionados para outra interface de rede
ou outra máquina.
O que são tabelas?
• nat - Usada para dados que gera outra conexão
(masquerading, source nat, destination nat, port
forwarding, proxy transparente são alguns exemplos).
Possui 3 chains padrões:
– PREROUTING - Consultado quando os pacotes precisam ser
modificados logo que chegam. É o chain ideal para realização
de DNAT e redirecionamento de portas.
– OUTPUT - Consultado quando os pacotes gerados localmente
precisam ser modificados antes de serem roteados. Este chain
somente é consultado para conexões que se originam de IPs de
interfaces locais.
– POSTROUTING - Consultado quando os pacotes precisam ser
modificados após o tratamento de roteamento. É o chain ideal
para realização de SNAT e IP Masquerading.
O que são tabelas?
• mangle - Utilizada para alterações especiais de pacotes (como
modificar o tipo de serviço (TOS). Possui 2 chains padrões:
– INPUT - Consultado quando os pacotes precisam ser modificados antes
de serem enviados para o chain INPUT da tabela filter.
– FORWARD - Consultado quando os pacotes precisam ser modificados
antes de serem enviados para o chain FORWARD da tabela filter.
– PREROUTING - Consultado quando os pacotes precisam ser
modificados antes de ser enviados para o chain PREROUTING da
tabela nat.
– POSTROUTING - Consultado quando os pacotes precisam ser
modificados antes de serem enviados para o chain POSTROUTING da
tabela nat.
– OUTPUT - Consultado quando os pacotes precisam ser modificados
antes de serem enviados para o chain OUTPUT da tabela nat.
Adicionando regras - A
Agora vamos incluir uma regra no chain INPUT (-A INPUT) que
bloqueie (-j DROP) qualquer acesso indo ao endereço 127.0.0.1 (-d
127.0.0.1):
iptables -t filter -A INPUT -d 127.0.0.1 -j DROP
• Agora verificamos um novo ping.
• Desta vez a máquina 127.0.0.1 não respondeu, pois todos os
pacotes com o destino 127.0.0.1 (-d 127.0.0.1) são rejeitados (-j
DROP). A opção -A é usada para adicionar novas regras no final do
chain. Além de -j DROP que serve para rejeitar os pacotes,
podemos também usar -j ACCEPT para aceitar pacotes. A opção -j
é chamada de alvo da regra ou somente alvo pois define o destino
do pacote que atravessa a regra.
• OBS: - A tabela filter será usada como padrão caso nenhuma
tabela seja especificada através da opção -t.
Listando regras - L
• A seguinte sintaxe é usada para listar as regras criadas:
• iptables [-t tabela] -L [chain] [opções]
Onde:
• tabela
– É uma das tabelas usadas pelo iptables. Se a tabela não for especificada, a tabela
filter será usada como padrão..
• chain
– Um dos chains disponíveis na tabela acima ou criado pelo usuário. Caso o chain não
seja especificado, todos os chains da tabela serão mostrados.
• opções
-v - Exibe mais detalhes sobre as regras criadas nos chains.
-n - Exibe endereços de máquinas/portas como números ao invés de tentar a resolução
DNS e consulta ao /etc/services.
-x - Exibe números exatos ao invés de números redondos. Também mostra a faixa de
portas de uma regra de firewall.
--line-numbers - Exibe o número da posição da regra na primeira coluna da listagem.
Listando regras - L
• Para listar a regra criada anteriormente usamos o
comando:
#iptables -t filter -L INPUT
Limpando as regras de um chain -
F
• Para limpar todas as regras de um chain, use a
seguinte sintaxe:
• iptables [-t tabela] [-F chain]
• Onde:
• tabela
– Tabela que contém o chain que desejamos zerar.
• chain
– Chain que desejamos limpar. Caso um chain não seja
especificado, todos os chains da tabela serão limpos.
#iptables -t filter -F INPUT
Especificando um endereço de
origem/destino
• As opções -s (ou --src/--source)e -d (ou --dst/--
destination) servem para especificar endereços de
origem e destino respectivamente. É permitido usar um
endereço IP completo (como 192.168.1.1), um
hostname (debian), um endereço fqdn (www.debian.org)
ou um par rede/máscara (como
200.200.200.0/255.255.255.0 ou 200.200.200.0/24).
• Caso um endereço/máscara não sejam especificados, é
assumido 0/0 como padrão (todos as máquinas de todas
as redes).
• Bloqueia o tráfego vindo da rede 200.200.200.*:
#iptables -A INPUT -s 200.200.200.0/24 -j DROP
Especificando a interface de
origem/destino
• As opções -i (ou --in-interface) e -o (ou --out-interface) especificam
as interfaces de origem/destino de pacotes.
• Por exemplo para bloquear o acesso do tráfego de qualquer
máquina com o endereço 200.123.123.10 vinda da interface ppp0
(uma placa de fax-modem):
#iptables -A INPUT -s 200.123.123.10 -i ppp0 -j DROP
A mesma regra pode ser especificada como :
#iptables -A INPUT -s 200.123.123.10 -i ppp+ -j DROP O sinal
de "+" funciona como um coringa, assim a regra terá efeito em
qualquer interface. Para bloquear qualquer tráfego local para a
Internet:
#iptables -A OUTPUT -o ppp+ -j DROP
Para bloquear a passagem de tráfego da interface ppp0 para a
interface eth1 (de uma de nossas redes internas):
#iptables -A FORWARD -i ppp0 -o eth1 -j DROP
Especificando um protocolo
• A opção -p (ou --protocol) é usada para especificar
protocolos no iptables. Podem ser especificados os
protocolos tcp, udp e icmp. Por exemplo, para rejeitar
todos os pacotes UDP vindos de 200.200.200.200:

#iptables -A INPUT -s 200.200.200.200


-p udp -j DROP
Especificando portas de
origem/destino
• As portas de origem/destino devem ser especificadas
após o protocolo e podem ser precedidas por uma das
seguintes opções:
• --source-port ou --sport - Especifica uma porta ou faixa
de portas de origem.
• --destination-port ou --dport - Especifica uma porta ou
faixa de portas de destino.
• Uma faixa de portas pode ser especificada através de
PortaOrigem:PortaDestino:
• Bloqueia qualquer pacote indo para 200.200.200.200 na
faixa de # portas 0 a 1023:
#iptables -A OUTPUT -d 200.200.200.200 -p tcp
--dport :1023 -j DROP
Salvando e Restaurando regras
• As regras que você está trabalhosamente criando e
testando manualmente enquanto manipula o iptables
podem ser salvas de 2 formas; uma delas é escrevendo
um shell script que tenha todos os comandos, um por
linha. Isto é recomendado quando tem um firewall
grande e que exige uma boa padronização de regras,
bem como sua leitura, comentários.
• A outra forma é usando as ferramentas iptables-save e
iptables-restore. O iptables-save deve ser usado sempre
que modificar regras no firewall iptables da seguinte
forma:
#iptables-save >/dir/iptables-regras.
• Para restaurar as regras salvas, utilize o comando:
#iptables-restore </dir/iptables-regras
Fazendo IP masquerading
(Compartilhar Internet)
#iptables -t nat -A POSTROUTING -s
192.168.1.0/24 -j MASQUERADE
#echo "1" >/proc/sys/net/ipv4/ip_forward
A configuração do servidor Linux está completa,
agora os clientes da rede precisarão ser
configurados para usar o endereço IP do
servidor Linux como gateway. É recomendável
instalar um servidor proxy e DNS na máquina
Linux para acelerar o desempenho das
requisições/resolução de nomes das máquinas
em rede.
Fazendo DNAT
• DNAT (Destination nat - nat no endereço de destino)
consiste em modificar o endereço de destino das
máquinas clientes. O destination nat é muito usado para
fazer redirecionamento de pacotes, proxyes
transparentes e balanceamento de carga.

• Modifica o endereço IP destino dos pacotes de


200.200.217.40 vindo da interface eth0 para 192.168.1.2.
#iptables -t nat -A PREROUTING -s 200.200.217.40 -i
eth0 -j DNAT --to 192.168.1.2
OBS: Não se esqueça de conferir se o ip_forward está
ajustado para 1:
#echo "1" >/proc/sys/net/ipv4/ip_forward.
Um exemplo de firewall simples
– O exemplo a seguir toma com base a
situação que o servidor linux está ligado à
rede externa pela interface eth0, e a rede
interna por eth1.
Um exemplo de firewall simples
#!/bin/bash
#Firewall e compartilhamento de internet
implementado por
#oliver_menezes@yahoo.com.br
#Esse script assume que o módulo iptables já
esteja carregado por padrão

#Limpa as regras anteriores


##Qdo o argumento -t é omitido regra é aplicada
na tabela filter
iptables -F
Um exemplo de firewall simples
#Limpa as regras da tabela nat
iptables -t nat -F

#Compartilhamento de internet
iptables -t nat -A POSTROUTING -o eth0 -j
MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
Um exemplo de firewall simples
#Abre algumas portas
iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
iptables -A INPUT -p tcp --destination-port 3128 -j ACCEPT
iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT
iptables -A INPUT -p tcp --destination-port 1433 -j ACCEPT
iptables -A INPUT -p tcp --destination-port 3389 -j ACCEPT

#Liberação de conexão para computadores da rede interna


iptables -A INPUT -p tcp --syn -s 192.168.0.0/255.255.255.0 -j
ACCEPT

# Fecha o resto
iptables -A INPUT -p tcp --syn -j DROP
Um exemplo de firewall simples
#Redirecionamento do trafego da porta 80 para o Squid
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT
--to-port 3128

#Redirecionamento do tráfego TCP e UDP que provém da internet


para uma máquina
#na rede interna com ip 192.168.1.254

iptables -t nat -A PREROUTING -p tcp --dport 1433 -i eth0 -j DNAT --to


192.168.1.254
iptables -t nat -A PREROUTING -p udp --dport 1433 -i eth0 -j DNAT
--to 192.168.1.254
Referências
• http://www.guiadohardware.net/artigos/fire
wall-iptables/
• http://www.conectiva.com.br/cpub/pt/incCo
nectiva/suporte/pr/servidores.firewall.iptabl
es.html
• http://focalinux.cipsga.org.br/gol.html

Você também pode gostar