NAT com firewall - simples, rápido e funcional
Para todos aqueles que não tem profundas experiências com o Linux, mas querem compartilhar sua conexão e ao mesmo tempo manter sua rede segura contra ataques externos.
Parte 3: Bloqueando acesso externo
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 os
comandos:
# 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 Kazaa 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 usá-la para permitir que alguém se conecte rapidamente via ssh na sua maquina 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
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.
# 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 Kazaa 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 usá-la para permitir que alguém se conecte rapidamente via ssh na sua maquina 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
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.