maridalvas2
Novato XPZ
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 Fabricio 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 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 seja 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 ultimas 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.
Vamos então à segunda receita, para compartilhar a conexão. Ela é ainda mais simples e também permite ativar ou desativar o compartilhamento a qualquer momento.
Em primeiro lugar você deve configurar as suas placas de rede e modem e verificar se tanto a conexão com a Internet quando a conexão com os micros da rede local estão funcionando normalmente. O compartilhamento da conexão em sí pode ser feito com apenas três comandos:
Para compartilhar a conexão do modem com a rede local:
modprobe iptable_nat
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
Para compartilhar uma conexão via ADSL ou cabo instalada na eth0:
modprobe iptable_nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
Para desativar o compartilhamento, vale o de sempre: iptables - F
Isso mesmo, é só isso... O compartilhamento e ativado ou desativado imediatamente, sem que seja necessário reiniciar a conexão. Rápido, prático e confiável.
As três linhas respectivamente ativam o módulo nat do iptables, responsável pela tradução de endereços, avisam para o iptables que ele deve direcionar todas as conexões recebidas para a interface ppp0 (o modem) ou eth0 (a primeira placa de rede) e devolver as respostas para os clientes e confirmam a ativação no arquivo de configuração do TCP/IP.
Não faz mal se você acessa via modem e não fica permanentemente conectado. A regra mantém o compartilhamento ativo mesmo que você desconecte e reconecte várias vezes.
Se os clientes da rede já estiverem configurados para acessar a web através do endereço IP usado pelo servidor (192.168.0.1 se você quiser substituir uma máquina Windows compartilhando através do ICS) você já deve ser capaz de acessar a web automaticamente nos demais PCs da rede.
Uma observação é que estas regras não incluem um servidor DHCP, você deve configurar os clientes com endereço IP fixo ou então ativar o serviço DHCPD na sua distribuição. No Mandrake ou Red Hat basta ativar o serviço no painel de controle e o DHCP já irá funcionar automaticamente.
A configuração nos clientes fica: Endereço IP: Qualquer endereço dentro da faixa de endereços usada pelo servidor. Ex: 192.168.0.3 Servidor DNS: Os endereços dos servidores DNS do seu provedor. Ex: 200.177.250.10 Gateway Padrão: O endereço do servidor. Ex: 192.168.0.1 Domínio: O domínio do seu provedor. Ex: terra.com.br
As linhas de compartilhamento da conexão não conflitam com as regras de firewall que vimos anteriormente, você deve apenas ter o cuidado de colocá-las no inicio da seqüência. Neste caso nosso script completo ficaria assim:
# Carrega os módulos
modprobe iptables
modproble iptable_nat
# Compartilha a conexão
modprobe iptable_nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
# Abre algumas portas (opcional)
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
# Abre para a rede local
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
Se você quiser que o PC também não responda a pings, adicione a linha:
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
Mais uma linha interessante de se adicionar, que protege contra pacotes danificados (usados em ataques DoS por exemplo) é:
iptables -A FORWARD -m unclean -j DROP
(esta linha deve ser adicionada antes das demais)
Agora já temos 10 comandos, fora os para abrir portas específicas. Não seria muito prático ficar digitando tudo isso cada vez que precisar reiniciar o micro. Para automatizar isso, basta colar todos os comandos dentro de um arquivo de texto. Você pode salvá-lo como por exemplo: /usr/local/bin/meu_firewall
Em seguida, dê permissão de execução para o arquivo (chmod +x /usr/local/bin/meu_firewall) e você terá um shell script que pode ser chamado a qualquer momento. Basta digitar: meu_firewall
Para tornar a inicialização realmente automática, você precisa apenas colocar o comando num dos arquivos de inicialização do sistema. Abra o arquivo /etc/rc.d/rc.local e adicione a linha:
/usr/local/bin/meu_firewall
No Debian e Kurumin você pode usar o arquivo /etc/init.d/bootmisc.sh
As regras que vimos acima funcionam como um firewall de bloqueio. Ou seja, o servidor não deixa que ninguém acesse os compartilhamentos de arquivos ou conectem o backorifice instalado na máquina com o Windows 98, mas não impedem que os usuários baixem e-mails com vírus ou que acessem uma página web que explore alguma das vulnerabilidades do IE por exemplo. Ao usar clientes Windows o ideal é complementar o firewall com um bom antivírus.
Vamos agora a um último passo que é fowardar certas portas para os hosts da rede interna. Isso permite que você rode um servidor de FTP ou crie um servidor de Counter Strike por exemplo em qualquer um dos micros da rede e não apenas no servidor que está diretamente conectado à internet. O servidor simplesmente direciona todas as requisições recebidas na porta para o micro especificado, de forma transparente. Também aprendemos a fazer isso no Coyote, lembra? Mas ele utiliza o ipchains, uma versão antiga do firewall, por isso os comandos são diferentes.
O foward de portas também usa o Nat, por isso você também deve carregar o módulo caso não tenha feito anteriormente:
modprobe iptable_nat
Em seguida vem as regras para fazer o forward da porta.
Neste caso estou direcionando a porta 22 (do SSH) na conexão com a internet (eth0) para o micro 192.168.0.2 da rede local:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p tcp -i eth0 --dport 22 -d 192.168.0.2 -j ACCEPT
Neste outro caso estou direcionando as portas 25 (SMTP), 110 (POP3) e telnet (23) na conexão com a internet (eth0) para o micro 192.168.0.2 da rede local:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p tcp -i eth0 --dport 25 -d 192.168.0.2 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 110 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p tcp -i eth0 --dport 110 -d 192.168.0.2 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p tcp -i eth0 --dport 23 -d 192.168.0.2 -j ACCEPT
Basta alterar a regra, adicionando a porta e a máquina da rede interna para onde ele deve ser redirecionada. Se você acessa via modem, basta substituir o "eth0" em ambas as linhas por "ppp0". Esta regra pode ser usada em conjunto com as anteriores, mas deve ir sempre logo no início do arquivo, antes das regras para compartilhar a conexão e, claro, antes das regras para fechar tudo
Você pode repetir o comando várias vezes para direcionar varias portas diferentes para várias máquinas. Naturalmente uma mesma porta não pode ser fowardada duas vezes.
Também é possível fowardar ranges de portas. No Unreal Tournament por exemplo você precisa abrir as portas UDP 7777, 7778 e 7779 neste caso as regras seriam:
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 7777:7779 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p udp -i eth0 --dport 7777:7779 -d 192.168.0.2 -j ACCEPT
Qual que coisa to ake pra ajuda
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 Fabricio 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 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 seja 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 ultimas 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.
Vamos então à segunda receita, para compartilhar a conexão. Ela é ainda mais simples e também permite ativar ou desativar o compartilhamento a qualquer momento.
Em primeiro lugar você deve configurar as suas placas de rede e modem e verificar se tanto a conexão com a Internet quando a conexão com os micros da rede local estão funcionando normalmente. O compartilhamento da conexão em sí pode ser feito com apenas três comandos:
Para compartilhar a conexão do modem com a rede local:
modprobe iptable_nat
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
Para compartilhar uma conexão via ADSL ou cabo instalada na eth0:
modprobe iptable_nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
Para desativar o compartilhamento, vale o de sempre: iptables - F
Isso mesmo, é só isso... O compartilhamento e ativado ou desativado imediatamente, sem que seja necessário reiniciar a conexão. Rápido, prático e confiável.
As três linhas respectivamente ativam o módulo nat do iptables, responsável pela tradução de endereços, avisam para o iptables que ele deve direcionar todas as conexões recebidas para a interface ppp0 (o modem) ou eth0 (a primeira placa de rede) e devolver as respostas para os clientes e confirmam a ativação no arquivo de configuração do TCP/IP.
Não faz mal se você acessa via modem e não fica permanentemente conectado. A regra mantém o compartilhamento ativo mesmo que você desconecte e reconecte várias vezes.
Se os clientes da rede já estiverem configurados para acessar a web através do endereço IP usado pelo servidor (192.168.0.1 se você quiser substituir uma máquina Windows compartilhando através do ICS) você já deve ser capaz de acessar a web automaticamente nos demais PCs da rede.
Uma observação é que estas regras não incluem um servidor DHCP, você deve configurar os clientes com endereço IP fixo ou então ativar o serviço DHCPD na sua distribuição. No Mandrake ou Red Hat basta ativar o serviço no painel de controle e o DHCP já irá funcionar automaticamente.
A configuração nos clientes fica: Endereço IP: Qualquer endereço dentro da faixa de endereços usada pelo servidor. Ex: 192.168.0.3 Servidor DNS: Os endereços dos servidores DNS do seu provedor. Ex: 200.177.250.10 Gateway Padrão: O endereço do servidor. Ex: 192.168.0.1 Domínio: O domínio do seu provedor. Ex: terra.com.br
As linhas de compartilhamento da conexão não conflitam com as regras de firewall que vimos anteriormente, você deve apenas ter o cuidado de colocá-las no inicio da seqüência. Neste caso nosso script completo ficaria assim:
# Carrega os módulos
modprobe iptables
modproble iptable_nat
# Compartilha a conexão
modprobe iptable_nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
# Abre algumas portas (opcional)
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
# Abre para a rede local
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
Se você quiser que o PC também não responda a pings, adicione a linha:
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
Mais uma linha interessante de se adicionar, que protege contra pacotes danificados (usados em ataques DoS por exemplo) é:
iptables -A FORWARD -m unclean -j DROP
(esta linha deve ser adicionada antes das demais)
Agora já temos 10 comandos, fora os para abrir portas específicas. Não seria muito prático ficar digitando tudo isso cada vez que precisar reiniciar o micro. Para automatizar isso, basta colar todos os comandos dentro de um arquivo de texto. Você pode salvá-lo como por exemplo: /usr/local/bin/meu_firewall
Em seguida, dê permissão de execução para o arquivo (chmod +x /usr/local/bin/meu_firewall) e você terá um shell script que pode ser chamado a qualquer momento. Basta digitar: meu_firewall
Para tornar a inicialização realmente automática, você precisa apenas colocar o comando num dos arquivos de inicialização do sistema. Abra o arquivo /etc/rc.d/rc.local e adicione a linha:
/usr/local/bin/meu_firewall
No Debian e Kurumin você pode usar o arquivo /etc/init.d/bootmisc.sh
As regras que vimos acima funcionam como um firewall de bloqueio. Ou seja, o servidor não deixa que ninguém acesse os compartilhamentos de arquivos ou conectem o backorifice instalado na máquina com o Windows 98, mas não impedem que os usuários baixem e-mails com vírus ou que acessem uma página web que explore alguma das vulnerabilidades do IE por exemplo. Ao usar clientes Windows o ideal é complementar o firewall com um bom antivírus.
Vamos agora a um último passo que é fowardar certas portas para os hosts da rede interna. Isso permite que você rode um servidor de FTP ou crie um servidor de Counter Strike por exemplo em qualquer um dos micros da rede e não apenas no servidor que está diretamente conectado à internet. O servidor simplesmente direciona todas as requisições recebidas na porta para o micro especificado, de forma transparente. Também aprendemos a fazer isso no Coyote, lembra? Mas ele utiliza o ipchains, uma versão antiga do firewall, por isso os comandos são diferentes.
O foward de portas também usa o Nat, por isso você também deve carregar o módulo caso não tenha feito anteriormente:
modprobe iptable_nat
Em seguida vem as regras para fazer o forward da porta.
Neste caso estou direcionando a porta 22 (do SSH) na conexão com a internet (eth0) para o micro 192.168.0.2 da rede local:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p tcp -i eth0 --dport 22 -d 192.168.0.2 -j ACCEPT
Neste outro caso estou direcionando as portas 25 (SMTP), 110 (POP3) e telnet (23) na conexão com a internet (eth0) para o micro 192.168.0.2 da rede local:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p tcp -i eth0 --dport 25 -d 192.168.0.2 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 110 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p tcp -i eth0 --dport 110 -d 192.168.0.2 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p tcp -i eth0 --dport 23 -d 192.168.0.2 -j ACCEPT
Basta alterar a regra, adicionando a porta e a máquina da rede interna para onde ele deve ser redirecionada. Se você acessa via modem, basta substituir o "eth0" em ambas as linhas por "ppp0". Esta regra pode ser usada em conjunto com as anteriores, mas deve ir sempre logo no início do arquivo, antes das regras para compartilhar a conexão e, claro, antes das regras para fechar tudo
Você pode repetir o comando várias vezes para direcionar varias portas diferentes para várias máquinas. Naturalmente uma mesma porta não pode ser fowardada duas vezes.
Também é possível fowardar ranges de portas. No Unreal Tournament por exemplo você precisa abrir as portas UDP 7777, 7778 e 7779 neste caso as regras seriam:
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 7777:7779 -j DNAT --to-dest 192.168.0.2
iptables -A FORWARD -p udp -i eth0 --dport 7777:7779 -d 192.168.0.2 -j ACCEPT
Qual que coisa to ake pra ajuda