Criando um firewall simples e compartilhando a conexão usando o IPtables

Este artigo aborda o processo de criação de um firewall baseado no iptables, onde o administrador de sistemas poderá bloquear acesso à portas desnecessárias, compartilhar a conexão do servidor com sua rede interna e redirecionar portas.

[ Hits: 203.697 ]

Por: Luis Fernando Targas em 17/06/2003


Um firewall simples com o Iptables



Todo administrador de redes aprende logo que uma das coisas mais importantes para qualquer rede é um bom firewall. Embora existam muitos mitos em torno disto, os firewalls não fazem milagres, apenas adicionam uma camada extra de proteção, escondendo as vulnerabilidades das máquinas.

Você pode ter um servidor IIS ativo com todas as vulnerabilidades possíveis dentro da sua rede, mas ninguém poderá fazer nada se não conseguir se conectar à ele. Este é o papel do firewall, limitar e filtrar os acessos aos servidores e estações de trabalho da sua rede.

Existem vários tipos de firewall, de todos os preços. O tipo mais simples e ao mesmo tempo um dos mais eficazes para PCs domésticos são os firewalls de bloqueio, onde você simplesmente fecha todas as portas do micro (ou deixa abertas apenas as portas de que você realmente precisa). Se ninguém consegue se conectar a seu PC, 90% das brechas de segurança são anuladas.

Outro ponto comum é a necessidade de compartilhar a conexão com a Web. Nos meus artigos sobre o Coyote mostrei como usar um 486 para esta tarefa, desta vez vamos ver como é fácil fazer o mesmo com qualquer distribuição Linux. Isto permite que você use o seu próprio PC, sem precisar montar e manter outro micro só para isso, além de resolver as limitações do Coyote com modens PCI e placas de rede Wireless.

Isso pode ser feito facilmente através do Iptables. A receita funciona em qualquer distribuição que utilize o Kernel 2.4, basicamente qualquer coisa que você ainda possa querer usar hoje em dia.

Existem vários programas gráficos para configuração de firewalls, como por exemplo o GuardDog e o Shorewall (usando no Red Hat e Mandrake). Estes programas também trabalham com o Iptables, eles servem apenas para facilitar a configuração, criando as regras a partir das escolhas feitas pelo usuário.

A configuração do Iptables é feita diretamente via terminal, basta você ir inserindo as regras uma a uma. As regras se perdem ao reiniciar o micro, por isso depois de testar tudo vamos criar um script para que elas sejam recriadas automaticamente a cada reboot.

O Iptables é tão versátil que pode ser usado para praticamente tudo relacionado à inspeção, encaminhamento e até mesmo alteração de pacotes. Se ele não fizer algo é possível criar um módulo que o faça. Já que as possibilidades são infinitas, mais seu tempo não. Vou ficar em algumas regras simples que resolvem a maior parte dos problemas do dia a dia. A partir daí você pode ir se aperfeiçoando e desenvolvendo soluções mais sofisticadas.

Antes de mais nada, você precisa verificar se o pacote do iptables está instalado. Se você estiver no Mandrake basta dar um "urpmi iptables". Se você estiver no Debian, Kurumin ou Conectiva, um "apt-get install iptables" resolve.

Para garantir que o Iptables está mesmo carregado, dê também um:

# modprobe iptables

Vamos então à criação das regras que determinam o que entra e o que não entra na máquina. Se o seu micro está ligado apenas à internet, sem uma rede local, então são necessárias apenas duas regras para resolver o problema. Abra um terminal, logue-se como root e digite o comando:

# iptables -A INPUT -p tcp --syn -j DROP
# iptables -A INPUT -i ppp0 -p udp --dport 0:30000 -j DROP


Isso fará com que o micro passe a ignorar conexões vindas em qualquer porta TCP, sem enviar sequer uma confirmação de que o pacote foi recebido. Você continuará conseguindo acessar a internet normalmente, mas ninguém conseguirá se conectar diretamente ao seu PC; um servidor Web ou SSH que você esquecesse de desativar passariam despercebidos. Apenas as conexões iniciadas por você são aceitas, o que permite que alguns programas de compartilhamento como o gtkgnutella e o Kazza continuem funcionando normalmente. A segunda regra é opcional (dica do Fabrício Carvalho), ela bloqueia também parte das portas UDP, adicionando uma camada extra se segurança.

O efeito colateral é que alguns programas que abrem servidores podem deixar de funcionar. Você não conseguirá mais receber arquivos pelo ICQ por exemplo, como se estivesse acessando através de uma conexão compartilhada via NAT.

O interessante é que você pode desativar o firewall a qualquer momento, para isso basta um único comando:

# iptables -F

Isso elimina todas as regras do Iptables, fazendo com que seu micro volte a aceitar todas as conexões. Você pode usa-la para permitir que alguém se conecte rapidamente via ssh na sua máquina por exemplo e depois fechar tudo novamente reinserindo as regras anteriores.

Se você tiver uma rede local e quiser que os micros da rede interna sejam capazes de se conectar normalmente, mas mantendo o bloqueio a tudo que vem da internet, basta dar um "iptables -F" e começar de novo, desta vez adicionando primeiro a regra que permite os pacotes vindos da rede local:

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

Em seguida vem os comandos anteriores:

# iptables -A INPUT -p tcp --syn -j DROP
# iptables -A INPUT -i ppp0 -p udp --dport 0:30000 -j DROP


Altere o "192.168.0.0/255.255.255.0" para a faixa de endereços e máscara de sub-rede que estiver utilizando na sua rede. Este exemplo serve para redes que utilizam a faixa de 192.168.0.1 até 192.168.0.254.

O Iptables processa os comandos em seqüência. Então todos os pacotes passam pela primeira instrução antes de ir para a segunda. Quando um pacote vem de um dos endereços da rede local é imediatamente aceito, os demais vão para as duas últimas linhas e acabam recusados. É uma simples questão de sim ou não. A primeira linha diz sim para os pacotes da rede local enquanto as duas últimas dizem não para todos os demais.

Imagine agora que você queira permitir ao mesmo tempo pacotes vindos da rede local e uma certa porta vinda da Internet, como por exemplo a porta 22 do SSH. Neste caso você adicionaria mais uma regra, mantendo as regras anteriores:

# iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
# iptables -A INPUT -p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT
# iptables -A INPUT -p tcp --syn -j DROP
# iptables -A INPUT -p udp -j DROP


Agora tudo o que vem na porta 22 (tanto da Internet quanto da rede local) é aceito, tudo o que vem da rede local é aceito e todo o resto é rejeitado. Você pode adicionar mais linhas para abrir outras portas. Se você quisesse abrir também as portas 1021 e 1080, a lista ficaria assim:

# iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
# iptables -A INPUT -p tcp --destination-port 1021 -j ACCEPT
# iptables -A INPUT -p tcp --destination-port 1080 -j ACCEPT

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


Isso permite que você mantenha disponíveis apenas os servidores que você realmente quer disponibilizar e nos momentos que quiser. A qualquer tempo você pode dar um iptables -F e readicionar apenas as regras para fechar tudo.

    Próxima página

Páginas do artigo
   1. Um firewall simples com o Iptables
   2. Compartilhando conexão com a rede interna
   3. Automatizando a inicialização do firewall
   4. Direcionando portas para hosts da rede interna
Outros artigos deste autor

Utilizando RPM para detecção de intrusos

Conceito de NAT detalhadamente

Como instalar e usar o MS Office 97 no Linux

Configurando o SendMail

Leitura recomendada

Montando regras iptables

A teoria por trás do firewall

Shorewall, uma excelente opção para firewall Linux

Conexões de entrada e saída com 2 links em um servidor

Trabalhando com CARP nos BSD's

  
Comentários
[1] Comentário enviado por wilbil em 17/06/2003 - 09:37h

agora fica uma boa pergunta para vc
liberei a porta 80,21 que possuo um servidor apache
e um proftp do mais novo que tem no site

a pergunta e a seguinte agora quero liberar a porta 3128
para a rede interna e nao liberar para a rede externa?

# iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT
# iptables -A INPUT -p tcp --destination-port 21 -j ACCEPT
# iptables -A INPUT -p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT
# iptables -A INPUT -p tcp --syn -j DROP

[2] Comentário enviado por naoexistemais em 22/06/2003 - 07:02h

Caro Wilbil,

# liberando porta 3128 para sua rede
iptables -A INPUT -p tcp --syn -s 192.168.0.0/24 --dport 3128 -j ACCEPT
# fechando para o resto
iptables -A INPUT -p tcp --syn -j DROP

falou,

[3] Comentário enviado por Lauro em 14/08/2003 - 21:44h

Estou tendo um problema...

Quando eu crio um script com as regras de firewall e conexão, após rodá-lo ele funciona direitinho, mais ao colocálo pra rodar automaticamente no /etc/rc.d/rc.local, quando a máquina reinicia, ao voltar do boot não consigo fazer o logon no meu window manager... eu digito o login a senha e ao iniciar o carregamento do KDE ou do GNOME ele trava e não carrega o window manager...

Ai pra voltar a carregar normalmente só tirando ele do rc.local... senão não rola...

O que pode estar acontecendo?
Existe alguma incompatibilidade que gere essa pane no X?

[4] Comentário enviado por lacierdias em 19/11/2003 - 15:11h

Amigo sou bem novato em linux e uso RedHat 9 por isso vou te fazer uma pergunta q vai parecer imbecil mas respode pq estou deseperado...

Meu rc.local é assim:

#!/bin/sh

touch /var/lock/subsys/local
modprobe iptable_nat
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward

Como pode observar é só o Nat e alem disso tenho no mesmo server um dns rodando tb mas ta tudo beleza minha duvida é a onde coloco os parametros do firewall gostaria q responde-se com detalhes e se possivel for me mandasse um e-mail com o arquivo pronto ( rc.local rodando Nat e Firewall) para eu poder estuda-lo melhor. Obrigado desdeja pela atenção.

[5] Comentário enviado por vanervainer em 10/02/2004 - 16:36h

O comando correto para ver se o iptables estah realmente carregado não é
#modprobe iptable_nat ?

[6] Comentário enviado por voodooguito em 11/02/2004 - 15:13h

Se eu quizer manda de uma porta para outra seria algo parecido com isso.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 500 -j DNAT --to-dest 192.168.0.2 --dport 22

iptables -A FORWARD -p tcp -i eth0 --dport 500 -d 192.168.0.2 --dport 22 -j ACCEPT

entendeu?
eu quero loga no servidor na porta 500 e ele me direcionar para a porta 22 do ssh numa maquina interna
obrigado.

[7] Comentário enviado por guilhermejr em 03/03/2004 - 14:15h

Oi
Voce ensia a fazer a redirecionamento de uma porta para uma máquina especifica, tem como eu redirecionar a porta para toda a rede?

[8] Comentário enviado por betolinux em 20/05/2004 - 21:37h

Estou com uma problema gostaria muito de uma resposta por favor.
tenho um servidor linux que tem internet via radio, compartilho a internet e arquivos para rede interna mas tambem compartilho a internet
para rede externa mas a rede externa encherga minha rede interna.
Eu gostaria que ela so pegasse a internet.
GOSTARIA DE SABER SE TEM ALGUM ARQUIVO EXECUTAVEL,PARA RODAR NESSES COMPUTADORES DOS USUARIOS EXTERNO.
MUITO OBRIGADO.. ENVIAR A RESPOSTA P/ LAROE7@HOTMAIL.COM

[9] Comentário enviado por Xxoin em 11/08/2004 - 22:44h

O artigo é excelente!
Parabéns ao sr Carlos Morimoto, autor do artigo...

Link para o original:
http://guiadohardware.net/artigos/256/

[10] Comentário enviado por aredejrf em 13/08/2004 - 09:46h

Estou com um problema, se puderem ajudar...

Tenho um servidor Oracle em outra maquina servido Oracle IAS Intrastructure e Portal 10g. Costumo acessar, via browser, o ambiente do Oracle Portal com por exemplo http://servidorX.minhaempresa.com.br:9999 na rede interna da minha empresa. Estou precisando abrir esse acesso para ser feito fora da empresa.

Supondo o IP do servidor Oracle como 13.0.5.111 em uma rede 13.0.5.0 com mascara 255.255.255.0 , como posso permitir o acesso externo a porta 9999 desse servidor para usuarios fora da rede interna???

Agradeço a qualquer ajuda
Ricardo


[11] Comentário enviado por Ilovelinux2004 em 12/09/2004 - 22:41h

Valeu, vou precisar na minha empresa.

[12] Comentário enviado por cabelomst em 03/02/2005 - 23:06h

trabalho em um tele centro com um servidor debian temos 18 terminais e mais dois computadores com windows como faço para colocalos na rede e compartilhar a internet?
ip servidor 192.168.0.1 eth1
uso dhcp3
e temos conecção via satelite (parabólica )
se alguem puder ajudar agradeço!!!
jadilson espirito santo

[13] Comentário enviado por [Evandro] em 09/05/2005 - 17:25h

Respondendo ao guilhermejr

Para redirecionar portas de toda a rede para uma porta específica como você perguntou, tente assim:

#iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 500 -j REDIRECT --to-port 22
onde eth0 é a a interface de sua rede interna, 500 é a porta que as máquinas da sua rede irão solicitar conexão e 22 é a porta que o servidor irá redirecionar.
Após inserir essa regra no iptables, basta dar um echo 1 > /proc/sys/net/ipv4/ip_forward .

abraços a todos

[14] Comentário enviado por LostGirl em 11/11/2005 - 14:31h

No meu caso eu tenho ips liberados para acesso total a internet e sites liberdados para todos os ips da rede...

so que preciso bloquear alguns ip's para nao ter acesso a internet ^^

[15] Comentário enviado por thekila em 07/07/2006 - 09:20h

alguem me tira uma duvida..

Quando eu to excutando a linha -A FORWARD -i [interface] -o

O -o significa negação? eu nao achei nada disso no manual.

Abraços

[16] Comentário enviado por rhandamanthys em 27/08/2006 - 19:12h

aew pessoal eu quero sabe o que o portal 22 faz?

[17] Comentário enviado por JefersonLopes em 06/09/2006 - 14:49h

Luis, não leva a mal não, mas, isso é PLAGIO.

Deveria ter a consideração de pelo menos colocar o nome e e-mail do autor do Artigo original.


Prá quem quiser ver o original, segue o link:

http://www.guiadohardware.net/artigos/256/

[18] Comentário enviado por heitormsilva em 17/12/2006 - 00:36h

Pó sacanagem hein, ele fez algumas pequenas modificações mas a maior parte continua idêntica ao original.

Ow coloca pelo menos as referências ao autor né.

Isso tá me lembrando uma enorme corporação em que o "Ctrl + C" & "Ctrl + V", funciona bem pra kramba....

[19] Comentário enviado por heitormsilva em 17/12/2006 - 00:39h

rhandamanthys , a porta 22 não faz nada assim como todas as outras portas.

A porta 22 é a porta padrão do serviço SSH.

[20] Comentário enviado por heitormsilva em 17/12/2006 - 00:44h

Respondendo ao thekila ,

O "-o" é o oposto do "-i" que é o parametro de interface de entrada.

Tudo isso esta no manual sim, olha direitinho que sempre esta lá :)

[21] Comentário enviado por jgilcustodio em 29/12/2006 - 09:28h

Eu consegui compartilhar mais preciso tirar uma duvida urgente, quando eu bloqueio todas as páginas e libero somento a uol por exemplo a paginal principal abre, mas as outras não, gostaria de saber que paramentro tenho que usar para ele abrir as outras páginas com link da uol tambem??? Ou se tem um jeito de deixar liberado por palavra-chve???

Obbrigado!!!

[22] Comentário enviado por marceloespindola em 07/07/2007 - 15:31h

Pessoal estou escrevendo um artigo aqui para o viva o linux sobre scrippt de firewall, ele está completo, pois levei muito tempo para desenvolve-lo e tinha objetivo de reunir as principais soluções e dúvidas sobre firewall iptables/netfilter para este artigo, mas como quero construir um bom artigo ainda está em fase de construção para o vivaolinux, entretanto estou disponibilizando no endereço

http://marcelolinux.blogspot.com/2007/07/meu-primeiro-artigo-do-vivaolinux.html

os arquivos e o artigo referente a script de firewall completo.

[23] Comentário enviado por alfameck em 29/01/2009 - 20:42h

Consegui valeu.

[24] Comentário enviado por Uiglas em 19/04/2014 - 23:03h

Pessoal como eu faria para criar um script de um firewall iptables que apenas o serviço HTTP , porta 80, pudesse ser executado em toda a rede??


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts