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.