Data: 21/01/2009
Autor: Humberto Galiza - galiza at pop-ba.rnp.br
Resumo
Este guia tem como objetivo construir um simples firewall com suporte nativo a IPv6. Para tal, serão utilizados o Debian GNU/Linux como sistema operacional e o IP6tables com filtro de pacotes. Para o melhor entendimento, é necessário um conhecimento prévio básico sobre esse novo protocolo. Assim, é recomendado ler [1] antes de continuar.Introdução
É muito importante a utilização de firewall's quando em se tratando de IPv6, especialmente se tivermos em uma rede local (LAN) com endereços IPv6 válidos. Isto se deve ao fato de, ao contrário do IPv4, onde os hosts da nossa rede interna estavam protegidos através da utilização de endereços IP privados (RFC 1918), no IPv6 geralmente os endereços válidos são utilizados e qualquer um que tenha conectividade IPv6 pode alcançar todos os hosts da nossa rede interna que tenham IPv6 habilitado. No Linux, o suporte nativo a firewalls IPv6 vem desde o kernel 2.4.+. Em versões anteriores, somente podemos efetuar filtros do tipo IPv6-in-Ipv4 pelo protocolo 41. Desde o Kernel 2.6.20, a conectividade IPv6 está totalmente funciona (sem problemas com os NATs IPv4 como em versões anteriores). Mais informações podem ser encontradas:- Netfilter project
- Maillist archive of netfilter users
- Maillist archive of netfilter developers
- Unofficial status informations
Requisitos
Uma vez que estamos utilizando Debian GNU/Linux com referência, basta fazer:# aptitude install iptablespara instalar o filtro de pacotes IP6tables. Caso esteja utilizando outra distro, poderá usar o gerenciador de pacotes da mesma, ou então compilar a partir do código fonte, que pode ser baixado em: Netfilter project Agora, depois de instalado o pacote, iremos carregar o módulo do IP6tables:
# modprobe ip6_tablesVerifique a carga do módulo:
# lsmod | grep ip6_tables ip6_tables 14340 3 ip6table_mangle,ip6t_LOG,ip6table_filterFeito isso, vamos testar nossa instalação. Abra um terminal do linux e digite:
# ip6tables -L
Configuração
O uso de Ip6tables é semelhante ao do Iptables (para IPv4). Seguem abaixo alguns exemplos de utilização:- Inserindo um regra de LOG no canal de entrada (INPUT):
ip6tables --table filter --append INPUT -j LOG --log-prefix "INPUT:" --log-level 7
- Inserindo um regra de DROP no canal de entrada (INPUT):
# ip6tables --table filter --append INPUT -j DROP
- Permitindo entrada de Ping6 (ping para IPv6):
# ip6tables -A INPUT -i eth0 -p icmpv6 -j ACCEPT
- Permitindo saída de Ping6 (ping para IPv6):
# ip6tables -A OUTPUT -o eth0 -p icmpv6 -j ACCEPT
- Nos kernels mais novos, há a possibilidade de especificarmos o tipo do código ICMP6 que queremos liberar. O exemplo abaixo libera apenas a resposta a ping6:
# ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
#!/bin/bash IPT6="/sbin/ip6tables" PUBIF="eth1" echo "Iniciando o firewall com suporte a IPv6..." $IPT6 -F $IPT6 -X $IPT6 -t mangle -F $IPT6 -t mangle -X #acesso ilimitado a loopback $IPT6 -A INPUT -i lo -j ACCEPT $IPT6 -A OUTPUT -o lo -j ACCEPT # Politica padrao e DROP $IPT6 -P INPUT DROP $IPT6 -P OUTPUT DROP $IPT6 -P FORWARD DROP # Permite todas as conexoes estabilizadas da rede interna para a Internet, # mas nao o contrario. $IPT6 -A OUTPUT -o $PUBIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPT6 -A INPUT -i $PUBIF -m state --state ESTABLISHED,RELATED -j ACCEPT # Liberando ping $IPT6 -A INPUT -i $PUBIF -p ipv6-icmp -j ACCEPT $IPT6 -A OUTPUT -o $PUBIF -p ipv6-icmp -j ACCEPT ############# Regras personalizadas - adicione abaixo ############ ### abrir porta 80 para IPv6 #$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 80 -j ACCEPT ### abrir porta 22 para IPv6 #$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 22 -j ACCEPT ### abrir porta 25 para IPv6 #$IPT6 -A INPUT -i $PUBIF -p tcp --destination-port 25 -j ACCEPT ############ End custome rules ################ # logar todos os outros pacotes que nao satisfacam as regras acima $IPT6 -A INPUT -i $PUBIF -j LOG $IPT6 -A INPUT -i $PUBIF -j DROP
