You are on page 1of 14

Entendendo e montando um Firewall com

IPTABLES
O Linux, de uma forma geral, relativamente imune a vrus,
worms e trojans, que so a principal causa de invases e
dores de cabea em geral no Windows. Isso no ocorre
apenas porque o Windows usado em mais mquinas e por
isso um alvo maior, mas tambm porque os aplicativos
disponveis no Linux so, pela mdia, bem mais seguros.
Veja o caso do Apache, por exemplo. Ele usado em uma
percentagem muito maior de servidores que o IIS. Mesmo assim, o nmero de falhas crticas de
segurana e invases bem-sucedidas registradas contra servidores web rodando o IIS bem maior do
que nos mais numerosos servidores Apache.
Mesmo assim, brechas de segurana podem surgir onde menos se espera. Por exemplo, em 2004 foi
descoberto um buffer overflow no servidor SSH, que poderia ser usado para desenvolver um exploit.
Esta brecha no chegou a ser explorada, pois, assim que a possvel vulnerabilidade foi descoberta,
uma correo foi rapidamente disponibilizada e a notcia se espalhou pela web. Antes que algum
tivesse tempo de escrever um exploit, a maior parte dos servidores do mundo j estavam seguros.
A moral da histria: sempre muito melhor prevenir do que remediar, e a melhor forma de se proteger
contra brechas deste tipo manter um firewall ativo, permitindo apenas acesso aos servios que voc
realmente deseja disponibilizar. Reduzindo os pontos vulnerveis, fica mais fcil cuidar da atualizao
dos servios expostos e, assim, manter seu servidor seguro.
Imagine o firewall como a muralha que cercava muitas cidades na idade mdia. Mesmo que as casas
no sejam muito seguras, uma muralha forte em torno da cidade garante a segurana. Se ningum
consegue passar pela muralha, no possvel chegar at as casas vulnerveis. Se, por acaso, as
casas j so seguras, ento a muralha aumenta ainda mais a segurana.
A idia mais comum de firewall como um dispositivo que fica entre o switch (ou hub) em que esto
ligados os micros da rede e a internet. Nesta posio usado um PC com duas placas de rede (eth0 e
eth1, por exemplo), onde uma ligada internet e outra rede local.
O firewall aceita as conexes vindas dos micros da rede local e roteia os acessos internet. De dentro
da rede voc consegue acessar quase tudo, mas todas as tentativas de conexo vindas de fora so
bloqueadas antes de chegarem aos clientes.
Imagine um micro com o Windows XP, onde o sistema acabou de ser instalado, sem nenhuma
atualizao de segurana e com o firewall inativo. Conectando este micro na internet diretamente, ser
questo de minutos at que ele comece a ser infectado por worms e se transforme em um zumbi a
atacar outras mquinas ligadas a ele.
Entretanto, se houver um firewall no caminho, os pacotes nocivos no chegam at ele, de forma que

ele fica em uma posio relativamente segura. Ele ainda pode ser infectado de formas indiretas, como
ao acessar uma pgina que explore uma vulnerabilidade do IE ou ao receber um e-mail infectado
atravs do Outlook, mas no mais diretamente, simplesmente por estar conectado internet.
Opcionalmente, o servidor rodando o firewall pode ser equipado com um servidor Squid configurado
para remover arquivos executveis das pginas acessadas e um servidor Postfix, encarregado de
bloquear mensagens infectadas, o que adiciona mais um nvel de proteo.
Note que o firewall em si no protege contra vrus e trojans, mas apenas contra tentativas diretas de
conexo. Ele cria uma barreira entre os micros da rede local e a internet, fazendo com que os recursos
compartilhados na rede no sejam acessveis de fora. No Linux, o firewall includo no prprio Kernel
do sistema, na forma do Iptables, encontrado no Kernel 2.4 em diante. Isso garante um excelente
desempenho e segurana em relao maioria dos firewalls for Windows, que rodam em nvel de
aplicao.
Embora seja sempre mais seguro ter um servidor dedicado, voc pode ter um nvel de segurana
muito bom simplesmente habilitando o firewall localmente. Todos os pacotes provenientes da internet
passam primeiro pelo Iptables antes de serem encaminhados para os aplicativos. Por isso, um firewall
local, bem configurado, garante uma segurana muito prxima de um firewall dedicado.

Escrevendo um script de firewall


Existem muitos firewalls grficos for Linux, como o GuardDog, o Shorewall e o Firestarter (que comento
adiante). Eles variam em nvel de facilidade e recursos, oferecendo uma interface amigvel e gerando
as regras do Iptables de acordo com a configurao feita. Voc pode escolher entre usar o programa
que melhor atenda suas necessidades ou configurar diretamente o Iptables com as regras desejadas.
Neste caso, voc pode formular as regras diretamente, definindo condies onde os pacotes sero
aceitos ou recusados, como em:
# iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT
Estes comandos seguem uma sintaxe comum: tudo comea com o comando iptables, que quem
executar as opes includas no comando. Em seguida vem uma condio, indicada pela opo -A.
Neste exemplo usei INPUT -p tcp -s 192.168.0.0/255.255.255.0 , que se aplica a qualquer pacote de
entrada (INPUT), utilizando o protocolo TCP (-p tcp), proveniente dos micros da rede local
(192.168.0.0/255.255.255.0). Note que aqui estou especificando uma faixa de endereos e a mscara
de sub-rede. No final, preciso dizer o que fazer com os pacotes que se enquadrarem nesta situao,
indicando uma ao. O -j ACCEPT diz que estes pacotes devem ser aceitos.
primeira vista, isso parece bem complicado, assim como o arquivo de configurao original do Squid,
com suas 3.000 e tantas linhas. Mas, as coisas ficam bem mais simples se comearmos com um script
simples e formos incluindo novas regras aos poucos.
Este um exemplo de script que pode ser usado em um desktop que simplesmente acessa a internet
como cliente, sem rodar nenhum servidor, nem compartilhar a conexo com outros micros:
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp syn -j DROP
A idia aqui que o micro possa acessar a internet sem que ningum de fora possa invadi-lo de forma
alguma. Esses dois comandos fazem isso da forma mais simples possvel.
A primeira linha orienta o firewall a deixar passar os pacotes enviados atravs da interface de loopback
(-i lo -j ACCEPT). importante que esta linha (ou outra com o mesmo efeito) sempre seja usada, em
qualquer script de firewall que termine bloqueando todas as conexes, pois no Linux a interface de
loopback usada para comunicao entre diversos programas. Para ter uma idia, todos os
programas grficos a utilizam para se comunicarem com o X, os programas do KDE a utilizam para
trocar mensagens entre si. Sem esta regra, muita coisa deixa de funcionar corretamente.
Depois de abrir o firewall para as mensagens locais, usamos a segunda regra para bloquear todas as
novas conexes vindas de fora. O syn faz com que o firewall aplique a regra apenas para tentativas
de abrir novas conexes (algum tentando acessar o servidor SSH que voc esqueceu aberto, por
exemplo), mas sem impedir que servidores remotos respondam a conexes iniciadas por voc. Isso
permite que voc continue navegando e acessando compartilhamentos em outros micros da rede local,
com poucas limitaes.

Para no precisar ficar digitando os comandos cada vez que precisar reiniciar o micro, voc pode
inclu-los em um dos arquivos de inicializao do sistema. Nas distribuies derivadas do Debian, voc
pode coloc-los no final do arquivo /etc/init.d/bootmisc.sh e, nas derivadas do Red Hat, no arquivo
/etc/rc.d/rc.local.
Essas duas regras podem ser usadas como base para criar o que chamo de firewall de bloqueio. Ele
segue uma idia bastante simples: voc diz as portas que gostaria de abrir e ele fecha todas as
demais. Ou seja, o firewall fecha por padro todas as portas, com exceo das que voc disser
explicitamente que deseja manter abertas. Isso garante uma configurao de firewall bastante segura
com um mnimo de dor de cabea.
Voc pode adicionar novas regras, abrindo portas, direcionando faixas de portas para micros da rede
interna, fechando portas de sada, de forma a bloquear o uso de programas como o ICQ e o MSN e
assim por diante.
Imagine que voc est configurando o firewall do servidor da rede. Ele tem duas placas de rede, uma
para a rede local e outra para a internet. Voc precisa que ele fique acessvel sem limitaes dentro da
rede local, mas quer manter tudo fechado para quem vem da internet.
Nesse caso, voc poderia usar a regra que mostrei h pouco no seu script de firewall:
# Abre para uma faixa de endereos da rede local
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT
O 192.168.0.0 indica a faixa de endereos da rede local. A mscara 255.255.255.0 indica que a
ltima parte do endereo muda, ou seja, os micros da rede local usam endereos entre 192.168.0.1 e
192.168.0.254. Tudo o que vier deles (tanto TCP, quanto UDP, j que no indicamos o protocolo)
aceito.
Note que esta faixa de endereos no rotevel, ela simplesmente no existe na internet. No existe a
possibilidade de algum engraadinho de outro estado tentar configurar seu micro para usar esta faixa
de endereos e enganar a regra do firewall.
Como uma proteo adicional, as verses recentes do Iptables so capazes de ignorar pacotes
aparentemente destinados a uma interface quando eles chegam em outra. Com duas placas, onde
uma est ligada rede local (usando a faixa 192.168.0.x) e outra Internet, o firewall no aceitar que
um pacote falseado, proveniente da Internet, com endereo de emissor 192.168.0.3 (por exemplo),
seja encaminhado a um micro da rede local, pois ele sabe que pacotes com este endereo de emissor
devem chegar apenas pela placa ligada rede local.
Essa mesma regra pode ser usada tambm para abrir o firewall para endereos ou faixas de
endereos da internet. Imagine que voc queira dar acesso aos micros da filial da sua empresa em
Macap, onde usam um link com o IP fixo 200.220.234.12. Voc poderia abrir a faixa 200.220.234.0 ou
apenas o IP 200.220.234.12, de forma que o firewall permitisse acessos vindos de l, mas continuasse
bloqueando o restante. Voc pode abrir para vrias faixas de endereos distintas, basta repetir a linha
adicionando cada uma das faixas desejadas.
Imagine agora que este servidor foi instalado na sede de uma empresa para a qual voc presta

servios. Voc precisa acess-lo de vez em quando para corrigir problemas, mas naturalmente quer
fazer isso via internet, sem precisar se deslocar at l. Voc pode configurar o firewall para abrir a
porta 22 usada pelo SSH adicionando a regra:
# Abre uma porta (inclusive para a internet)
iptables -A INPUT -p tcp dport 22 -j ACCEPT
Note que esta regra abre a porta 22 para todo mundo. Lembre-se do exemplo do SSH: todo servidor
disponvel para a internet um risco potencial de segurana, por isso s abra as portas para os
servidores que voc realmente for utilizar. O ideal seria usar um par de chaves, protegidas por uma
passphrase para acessar o servidor e configur-lo para no aceitar logins com senha (apenas com
chaves), como vimos no captulo sobre SSH.
Ao abrir vrias portas, voc pode utilizar o parmetro -m multiport para especificar todas de uma vez,
separadas por vrgula, sem precisar colocar uma em cada linha. Para abrir as portas 21, 22 e 6881
(bittorrent), por exemplo, voc usaria a regra abaixo:
# Abre um conjunto de portas
iptables -A INPUT -m multiport -p tcp dport 21,22,6881 -j ACCEPT
Se voc presta suporte a partir de uma empresa que possui um link dedicado, com IP fixo, voc pode
tornar a regra mais especfica, permitindo apenas o IP de onde voc acessa:
# Abre uma porta para um IP especfico
iptables -A INPUT -p tcp -s 200.231.14.16 dport 22 -j ACCEPT
Em um micro domstico, voc pode abrir tambm as portas usadas pelo bittorrent (6881 a 6889) ou
portas usadas por jogos multiplayer, por exemplo. Para abrir um intervalo de portas, use a regra:
# Abre um intervalo de portas
iptables -A INPUT -p tcp dport 6881:6889 -j ACCEPT
Alm de trabalhar com endereos IP, possvel criar regras baseadas tambm em endereos MAC.
Isso permite adicionar uma camada extra de proteo ao criar regras para a rede local. Para isso,
usamos o parmetro -m mac mac-source, seguido pelo endereo MAC da placa do host desejado.
Para permitir que o host 192.168.1.100 tenha acesso ao servidor, mas apenas se o endereo MAC da
interface bater, voc usaria uma regra como:
iptables -A INPUT -s 192.168.1.100 -m mac mac-source 00:11:D8:76:59:2E -j ACCEPT
Note que agora, alm do IP, especificamos o endereo MAC da placa. As duas regras so usadas em
conjunto, de forma que o acesso permitido apenas caso as duas informaes estejam corretas. Isso
dificulta as coisas para algum que queira acessar o servidor trocando o IP de sua mquina. Voc

pode descobrir o MAC das mquinas da rede usando o prprio ifconfig ou o comando arp -a.
Note que limitar o acesso com base no endereo MAC adiciona uma camada extra de proteo, mas
no infalvel. O endereo MAC pode ser trocado de forma quase to simples quanto o endereo IP e,
sniffando a rede, possvel descobrir os endereos IP e MAC dos micros com uma certa facilidade.
No Linux, voc pode trocar o endereo MAC da placa de rede usando os comandos:
# ifconfig eth0 down
# ifconfig eth0 hw ether 00:11:D8:76:59:2E
# ifconfig eth0 up
Como v, basta especificar o endereo desejado. O Iptables no capaz de diferenciar mquinas com
os endereos MAC falseados das reais, pois, se algum desconectasse o micro 192.168.1.100 da rede
e configurasse o seu para usar o mesmo IP e MAC, poderia acessar o servidor bipassando a regra de
firewall. A nica forma de ter uma segurana completa seria utilizar o SSH ou outro protocolo que
utilize um algoritmo robusto de encriptao para o login e a transmisso dos dados.
Lembre-se de que o firewall uma primeira barreira de proteo, mas no uma garantia por s s.
preciso combin-lo com outras camadas de segurana para ter um servidor completamente seguro.
Outra limitao que as regras baseadas em endereos MAC podem ser usadas apenas dentro da
rede local. O endereo MAC descartado do pacote quando ele roteado para a Internet, ficando
apenas o endereo IP. Ao acessar atravs de uma conexo compartilhada, todos os pacotes
provenientes da Internet chegam com o endereo MAC do gateway da rede.
Este um exemplo de script completo, incluindo algumas regras adicionais para evitar ataques
comuns:
#!/bin/bash
iniciar(){
# Abre para uma faixa de endereos da rede local
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT
# Abre uma porta (inclusive para a internet)
iptables -A INPUT -p tcp dport 22 -j ACCEPT
# Ignora pings
iptables -A INPUT -p icmp icmp-type echo-request -j DROP
# Protege contra IP spoofing (esta opo j vem ativada por padro na
# maioria das distribuies atuais, mas no custa ter certeza)
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

# Descarta pacotes malformados, protegendo contra ataques diversos


iptables -A INPUT -m state state INVALID -j DROP
# Abre para a interface de loopback. Esta regra essencial para que
# o KDE e outros programas grficos funcionem adequadamente.
iptables -A INPUT -i lo -j ACCEPT
# Impede a abertura de novas conexes, efetivamente bloqueando o acesso
# externo ao seu servidor, com exceo das portas e faixas de endereos
# manualmente especificadas anteriormente. Bloqueia tudo.
iptables -A INPUT -p tcp syn -j DROP
}
parar(){
iptables

-F

echo Regras de firewall desativadas


}
case $1 in
start) iniciar ;;
stop) parar ;;
restart) parar; iniciar ;;
*) echo Use os parmetros start ou stop
esac
A receber qualquer conexo, vinda de qualquer endereo, o firewall primeiro verifica todas estas
regras, seqencialmente, para decidir se o pacote passa ou no. Usando esse script de exemplo,
teramos o seguinte:

Se o pacote vier da rede local, ele aceito.


Se o pacote for para porta 22 (do SSH), ele aceito.
Se for um ping, ele recusado (de forma a dificultar um pouco para outros descobrirem que voc
est online).
Pacotes danificados ou forjados (unclean) so recusados, protegendo os micros da rede interna.
Se o pacote vier da sua prpria mquina (um programa tentando mostrar alguma coisa na tela, por
exemplo), ele aceito.
Se o pacote for uma resposta a uma conexo que voc iniciou, como, por exemplo, o servidor
do guiadohardware.net enviando a pgina do site que voc est acessando, ele aceito.
Tentativas de conexo (toda conexo TCP iniciada por um pacote syn) fora das condies
especificadas acima so descartadas pelo firewall. A conexo nem sequer chega a ser estabelecida e
o emissor no recebe qualquer resposta (DROP). Ele no sabe se o pacote foi recebido ou no, fica no
vcuo, o que d a impresso de que o seu micro nem est online.
Da forma como escrevi, o script suporta as funes start, stop e restart, e pode ser usado como
um servio de sistema. Salve-o dentro da pasta /etc/init.d, como em /etc/init.d/firewall, e marque a

permisso de execuo:
# chmod +x /etc/init.d/firewall
A partir da, voc pode ativar as regras usando o comando /etc/init.d/firewall start e fazer com que
alteraes dentro do script entrem em vigor com um /etc/init.d/firewall restart.
Se voc est configurando um servidor dedicado remotamente, importante que voc teste o script
antes de configurar o sistema para execut-lo automaticamente durante o boot. O motivo simples: se
houver alguma regra incorreta no script, que bloqueie seu acesso ao servidor, voc poder solicitar um
reboot do servidor para que a configurao seja removida e voc recupere o acesso. Entretanto, se o
sistema for configurado para carregar o script durante o boot, o reboot no resolver e voc precisar
abrir uma chamada de suporte, solicitando que um tcnico se logue localmente no servidor e desative
seu script (o que provavelmente resultar em uma taxa adicional).
Uma opo mais relaxada seria simplesmente colocar os comandos com as regras desejadas no final
do arquivo /etc/init.d/bootmisc.sh ou /etc/rc.d/rc.local, mas isso no to recomendvel, pois voc
perde a possibilidade de reiniciar o firewall rapidamente depois de alterar as regras.
Assim como nas regras do Squid, cada pacote que chega pela rede precisa passar por todas as
regras, para que o firewall possa decidir o que fazer com ele. Quando aceito por uma das regras, ele
imediatamente encaminhado ao aplicativo, sem passar pelas demais. Por isso necessrio sempre
colocar as regras mais restritivas por ltimo, de preferncia concluindo o script com uma regra que
bloqueia todos os pacotes de entrada.
Outra dica que voc pode incluir os comandos para compartilhar a conexo e ativar o proxy
transparente (que tambm so regras de firewall) no script, fazendo que ele desempenhe
simultaneamente as duas funes. Nesse caso, tome o cuidado de sempre colocar as regras que
compartilham a conexo e ativam o proxy transparente antes das regras que bloqueiam conexes.
Este um exemplo de script de firewall que inclui as regras para compartilhar a conexo e ativar o
proxy transparente. Ao us-lo, comente as linhas que no se aplicam sua instalao:
#!/bin/bash
iniciar(){
# Compartilha a conexo
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp tcp-flags SYN,RST SYN -m tcpmss mss 1400:1536 \
-j TCPMSS clamp-mss-to-pmtu
echo Compartilhamento ativado
# Proxy transparente
iptables -t nat -A PREROUTING -i eth1 -p tcp dport 80 -j REDIRECT to-port 3128
echo Proxy transparente ativado

# As regras de firewall que vimos h pouco:


iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT
iptables -A INPUT -p tcp dport 22 -j ACCEPT
iptables -A INPUT -p icmp icmp-type echo-request -j DROP
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp syn -j DROP
}
parar(){
iptables

-F

iptables -t nat -F
echo Regras de firewall e compartilhamento desativados
}
case $1 in
start) iniciar ;;
stop) parar ;;
restart) parar; iniciar ;;
*) echo Use os parmetros start ou stop
esac
Outra dica importante so os comandos usados para limpar as regras do Iptables. necessrio
execut-los sempre que voc fizer alteraes no seu script de firewall e quiser execut-lo novamente
para que as novas regras entrem em vigor. No primeiro script de exemplo, por exemplo, uso o comando
iptables -F como parte da funo stop, que desativa o firewall. No segundo script, inclu tambm o
iptables -t nat -F.
iptables -F: Limpa a tabela principal do iptables, onde vo os comandos para abrir e fechar portas, que
vimos at aqui.
iptables -t nat -F: Limpa a tabela nat, que usada por regras que compartilham a conexo e fazem
forwarding de portas, como por exemplo:
iptables -t nat -A PREROUTING -i eth0 dport 22 -j DNAT to-dest 192.168.1.2
Todas as regras do Iptables que levam -t nat so armazenadas nesta segunda tabela, que precisa ser
zerada separadamente. A idia que voc pode limpar as regras principais do firewall sem desabilitar
o compartilhamento da conexo e vice-versa.
iptables -L: Este comando lista a configurao atual, sem alterar nada. interessante execut-lo
depois de fazer alteraes na configurao do firewall, para ter certeza que as regras surtiram o efeito
esperado. Para ver as regras de forwarding e compartilhamento, use tambm o iptables -t nat -L

Forwarding de portas
Voc deve lembrar que, ao compartilhar uma conexo entre vrios micros, apenas o servidor que est
com a conexo recebe conexes vindas da internet. Os micros da rede local acessam via NAT e
apenas recebem respostas para conexes iniciadas por eles.
Mas, imagine que voc queira que um servidor web, escutando na porta 80 do micro 192.168.0.3 da
rede local, fique disponvel para a internet. Como o servidor o nico com um IP vlido na internet, a
nica forma de fazer com que o 192.168.0.3 fique acessvel fazer com que o servidor passe a bola
para ele ao receber conexes na porta 80. justamente isso que fazemos ao configurar o forwarding
de portas.
Uma vez feita a configurao, sempre que o servidor receber uma conexo qualquer na porta 80 (ou
qualquer outra definida por voc), ele a repassar para o micro 192.168.0.3. Isso feito de forma
completamente transparente, forma que o emissor nem percebe que quem respondeu solicitao foi
outro servidor.
Essa opo pode ser usada tambm para permitir que os micros da rede local fiquem com as portas
do bittorrent abertas (de forma a baixar arquivos com um melhor desempenho), rodem servidores de
games online ou qualquer outra tarefa onde seja necessria manter determinadas portas TCP ou UDP
abertas. A limitao que continua existindo uma nica porta 80, uma nica porta 21, etc. de forma
que apenas um micro da rede interna pode receber cada porta de cada vez.
Veja um exemplo de como redirecionar as portas 6881 a 6889 usadas pelo Bittorrent para o micro
192.168.0.10 da rede local:
# Redireciona uma faixa de portas para um micro da rede local.
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables

-t

nat

-A

PREROUTING

-p

tcp

-i

eth0

dport

6881:6889

-j

DNAT

to 192.168.0.10
iptables -t nat -A POSTROUTING -d 192.168.0.10 -j SNAT to 192.168.0.1
Esta regra um pouco mais complexa, pois trabalha em duas fases. A primeira faz com que o servidor
encaminhe todas as conexes que receber na interface e porta especificada para o micro da rede local
e a segunda faz com que os pacotes de resposta enviados por ele posam ser encaminhados de volta.
Para que ambas funcionem, necessrio usar o comando echo 1 > /proc/sys/net/ipv4/ip_forward,
que ativa o forwarding de portas. o mesmo comando que usamos ao compartilhar a conexo.
Nos parmetros que coloquei em negrito, a eth0 a placa de internet, onde chegam os pacotes, a
6881:6889 a faixa de portas que esto sendo redirecionadas e o 192.168.0.10 o IP do micro
dentro da rede local que passa a receber as conexes destinadas a ela. Na segunda regra, temos
repetido o IP do micro na rede local e, em seguida, o 192.168.0.1 que indica o IP do servidor, dentro
da rede local.
Para redirecionar uma nica porta, ao invs de uma faixa, basta citar a porta sem usar os :, como em:
# Redireciona uma nica porta para um micro da rede local.
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A PREROUTING -p tcp -i eth0 dport 22 -j DNAT to192.168.0.10


iptables -t nat -A POSTROUTING -d 192.168.0.10 -j SNAT to 192.168.0.1
possvel ainda indicar uma lista de portas (usando a opo -m multiport), como em:

# Redireciona um conjunto de portas


echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp -i eth0 -m multiport dport 21,22,80 -j DNAT \
to-dest 192.168.0.10
iptables -t nat -A POSTROUTING -d 192.168.0.10 -j SNAT to 192.168.0.1
Note que nos trs exemplos usei o parmetro -p tcp. Ele necessrio, mas faz com que a regra se
aplique apenas a portas TCP. Caso voc precise fazer forwarding de portas UDP, deve alterar o
protocolo dentro da regra, como em:
# Redireciona uma porta UDP
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p udp -i eth0 dport 53 -j DNAT to192.168.0.10
iptables -t nat -A POSTROUTING -d 192.168.0.10 -j SNAT to 192.168.0.1

Bloqueando portas de sada


Mais um uso importante para o firewall bloquear portas de sada, ou seja, bloquear portas no sentido
rede local > internet. Isso permite bloquear o uso de determinados programas que utilizem estas
portas.
O MSN, por exemplo, utiliza originalmente a porta 1863. Nas verses recentes ele capaz de se
conectar tambm atravs da porta 80 (ou atravs de sites como o meebo.com, que permitem acessar o
MSN diretamente atravs do navegador). Por isso, ao bloquear a porta 1863, os clientes podem
continuar conseguindo se conectar, porm, voc obriga o trfego a passar pela porta 80, onde tem a
chance de faz-lo passar por um servidor Squid, configurado como proxy transparente. Isso permite
logar os acessos ou sabotar o sistema de autenticao do MSN, bloqueando os domnios
messenger.hotmail.com e webmessenger.msn.com, alm de outros sites que ofeream clientes via
web.
Hoje em dia, cada vez mais programas so capazes de acessar a Web atravs da porta 80, 443 (https)
ou via proxy, o que torna difcil bloque-los. Em muitos casos, preciso usar uma combinao de
portas fechadas no firewall, bloqueio a endereos IPs especficos e bloqueio de determinados
domnios no Squid.
Ao criar as regras do Iptables, existem duas opes. Bloqueando a porta para FORWARD, voc
impede o acesso a partir dos micros da rede local, que acessam atravs da conexo compartilhada
pelo servidor. Bloqueando para OUTPUT, a porta bloqueada no prprio micro onde o firewall est
ativo. Voc pode bloquear as duas situaes, duplicando a regra:
iptables -A OUTPUT -p tcp dport 1863 -j REJECT
iptables -A FORWARD -p tcp dport 1863 -j REJECT
Voc pode ainda bloquear intervalos de portas, separando-as por :, como em:
iptables -A FORWARD -p tcp dport 1025:65536 -j REJECT
Como estamos criando regras para os micros da rede local e no para possveis invasores
provenientes da Internet, aconselhvel usar a regra REJECT ao invs de DROP. Caso contrrio,
os programas nos clientes sempre ficaro muito tempo parados ao tentar acessar portas bloqueadas, o
que vai gerar reclamaes e um certo overhead de suporte.
Voc pode descobrir facilmente quais portas de sada so utilizados por cada programa fazendo
buscas no Google, mas tentar bloquear um a um todos os programas indesejados acaba sendo
tedioso. Ao invs disso, voc pode experimentar um soluo mais radical: inverter a lgica da regra,
bloqueando todas as portas de sada e abrindo apenas algumas portas permitidas.
O mnimo que voc precisa abrir neste caso so as portas 80 e 53 (dns). A partir da, voc pode abrir
mais portas, como a 21 (ftp), 25 (smtp), 110 (pop3) e assim por diante. Um exemplo de configurao
neste caso seria:
iptables -A FORWARD -p udp -i eth1 dport 53 -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 dport 80 -j ACCEPT

iptables -A FORWARD -p tcp -i eth1 dport 21 -j ACCEPT


iptables -A FORWARD -p tcp -i eth1 -j LOG
iptables -A FORWARD -p tcp -i eth1 -j REJECT
Veja que todas as regras especificam a interface da rede local (eth1 no exemplo), de onde sero
recebidas as conexes dos clientes. Note que no inclu nenhum bloqueio para forwarding de pacotes
provenientes da interface eth0 (da internet), pois a idia bloquear diretamente as requisies dos
clientes e no as respostas. Em uma conexo TCP tpica, o cliente envia a requisio na porta TCP
usada pelo servio, mas recebe a resposta em uma porta aleatria. Este um exemplo de entrada no
log do Iptables que mostra a resposta a uma conexo http normal. Veja que ela est endereada
porta 45159 do cliente:
IN=eth0 OUT=eth1 SRC=64.233.169.99 DST=192.168.0.10 LEN=40 TOS=0x00 PREC=0x00 TTL=239
ID=36813 PROTO=TCP SPT=80DPT=45159 WINDOW=8190 RES=0x00 ACK FIN URGP=0
No caso da porta 53 (DNS) estou especificando o protocolo UDP, ao invs de TCP, pois as requisies
so feitas usando portas UDP para ganhar tempo. Embora os servidores DNS escutem tanto na porta
53 TCP, quanto UDP, na prtica quase sempre usada a porta 53 UDP, pois o tempo de resposta
menor. No UDP a requisio simplesmente respondida da forma mais rpida possvel, enquanto que
no TCP necessrio abrir e encerrar a conexo.
A regra iptables -A FORWARD -j LOG uma boa opo durante a fase de testes, pois ela faz com
que o Iptables logue todos os pacotes que forem encaminhados (tanto envio, quanto resposta),
permitindo que voc verifique o que est ocorrendo quando algo no estiver funcionando. Voc pode
acompanhar o log usando o comando dmesg.
Colocado nesta posio (depois das regras que autorizam as conexes nas portas 53 e 80), ele vai
mostrar apenas as requisies bloqueadas pelo firewall, dando-lhe a chance de acompanhar os
acessos dos clientes e permitir portas adicionais sempre que necessrio.
Por exemplo, esta estrada (no log) mostra uma tentativa de conexo de um cliente MSN rodando no
micro 192.168.0.10 que foi bloqueada pelo firewall:
IN=eth1 OUT=eth0 SRC=192.168.0.10 DST=207.46.28.77 LEN=60 TOS=0x00 PREC=0x00 TTL=63
ID=21328 DF PROTO=TCP SPT=38119DPT=1863 WINDOW=5840 RES=0x00 SYN URGP=0
A opo DTP indica a porta usada. Se quisesse autorizar o uso do programa, voc adicionaria a
regra iptables -A FORWARD -p tcp -i eth1 dport 1863 -j ACCEPT em seu script.
Outra opo, para no precisar abrir tantas portas e ter um melhor controle sobre o trfego de sada
usar um servidor Squid configurado como proxy transparente (interceptando o trfego da porta 80) e
rodar servidores locais para DNS e e-mail (voc pode configurar um servidor Postfix como sistema
satlite, de forma que ele envie os e-mails dos usurios da rede usando o SMTP do provedor), de
forma que qualquer acesso precise necessariamente passar por algum dos servios ativos no servidor,
sujeito a log e aos bloqueios que configurar.
Neste caso, desabilite o compartilhamento da conexo (ou bloqueie o forward de todas as portas) e
configure os clientes para utilizarem o IP do servidor como DNS, servidor SMTP, POP e outros
servios que tenha ativado. Mesmo ao ser configurado como proxy transparente, o Squid continua

funcionando como um proxy tradicional, atravs da porta 3128. Voc pode configurar clientes de FTP e
outros programas com suporte a proxy para acessarem atravs dele. A vantagem sobre o acesso
direto que ao passar pelo proxy, tudo fica registrado e todo acesso precisa passar pelos filtros de
domnios, formatos de arquivos, limitao de banda, etc. definidos por voc.
Complementando o bloqueio de portas, voc pode tambm bloquear o acesso de determinados
endereos IP, como em:
# Bloqueia o acesso web a partir de um determinado IP
iptables -A FORWARD -p tcp -s 192.168.0.67 -j REJECT
Esta regra deve ir logo no incio do script, antes das regras que abrem portas de sada, caso contrrio
no surtir efeito. Lembre-se de que o Iptables processa as regras seqencialmente: se uma
compartilha a conexo com todos os micros da rede, no adianta tentar bloquear para determinados
endereos depois. As regras com as excees devem sempre vir antes da regra mais geral.

You might also like