$FreeBSD: doc/en_US.ISO8859-1/articles/dialup-firewall/article.sgml,v
1.32 2003/11/05 10:59:33 ceri Exp $
FreeBSD is a registered trademark of the FreeBSD Foundation.
Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the " or the ® symbol.
Este artigo documenta como configurar um firewall utilizando uma conexão discada com o FreeBSD e o IPFW, e especificamente como implementar um firewall de filtragem de pacotes em cima de um endereço IP atribuido dinâmicamente. Este documento não aborda a configuração da sua conexão PPP propriamente dita.
Dialup Firewalling with FreeBSD
Este documento aborda o processo necessário para configurar um firewall de filtragem
de pacotes com o freebsd quando o seu IP é atribuido dinâmicamente pelo seu provedor.
Realizei todo o esforço possível para fazer este documento tão informativo e correto
quanto possível, seus emails com comentários e sugestões são bem vindos e devem ser
enviados para <marcs@draenor.org>.
A primeira coisa que você necessitará fazer é recompilar o seu kernel. Se você precisa de maiores informações sobre como recompilar o kernel, então o melhor lugar para iniciar é a sessão sobre configuração do kernel no Handbook. Você precisa adicionar as seguintes opções ao seu arquivo de configuração do kernel:
Habilita o código de firewall no kernel.
Habilita a nova versão do IPFW.
Importante: Só faça isso se você estiver executando o FreeBSD 4.X, este é o padrão nas versões mais recentes do FreeBSD.
Envia os pacotes logados para o sistema de log.
Limita o numero de vezes que uma regra é logada. Isto previne que o seu arquivo de log se encha com muitas entradas repetidas. 100 é um valor razoável de se usar, mas você pode ajustá-lo baseado nas suas necessidades.
Habilita o divert sockets, o qual será abordado mais tarde.
Existem alguns outros itens opcionais os quais você pode compilar no seu Kernel para algum acréscimo de segurança. Eles não são requeridos para colocar o firewall para funcionar, mas alguns usuários mais paranóicos podem desejar utilizá-los.
Esta opção ignora os pacotes TCP com SYN e FIN. Isto impede que ferramentas tais como o security/nmap de identificar a pilha TCP/IP de uma maquina, mas isto quebra o suporte as extensões previstas na RFC1644. Isto não é recomendado se a máquina for executar um servidor web.
Não reboot após você ter recompilado o kernel. Nós precisaremos rebootar apenas uma vez, ao completar a instalação do firewall.
Agora nós precisamos realizar algumas alterações no /etc/rc.conf para instrui-lo sobre o firewall. Simplesmente adicione as seguintes linhas:
firewall_enable="YES" firewall_script="/etc/firewall/fwrules" natd_enable="YES" natd_interface="tun0" natd_flags="-dynamic"
Para maiores informações sobre a função destas instruções, consulte o /etc/defaults/rc.conf e leia o rc.conf(5)
Você já pode estar utilizando a tradução de endereços de rede (NAT) integrante do PPP. Se este é o caso então você terá que desabilitá-lo, e após irá utilizar o natd(8) para fazer o mesmo, como mostrado nos exemplos.
Se você já tiver um bloco de entradas para iniciar automaticamente o PPP, ele provavelmente irá se parecer com este:
ppp_enable="YES" ppp_mode="auto" ppp_nat="YES" ppp_profile="profile"
Você necessitará desabilitar especificamente o ppp_nat certificando-se de que você tenha a entrada ppp_nat="NO" no seu /etc/rc.conf. Você também necessitará remover qualquer entrada nat enable yes ou alias enable yes que você tenha no seu /etc/ppp/ppp.conf.
Nós estamos próximos do final agora. Tudo o que resta agora é definir as regras do firewall e então nós poderemos rebootar a maquina e o firewall deverá estar de pé e rodando quando ela subir. Eu faço desta forma, outras pessoas podem desejar algo ligeiramente diferente quando forem implementar as suas próprias regras de base. O que eu tentei fazer foi escrever um conjunto de regras que se aplique a maioria dos usuários dialup. Você pode obviamente modificá-las adequando-as as suas necessidades, utilizando as regras seguintes como ponto de partida para a criação das suas proprias regras. Primeiro, vamos iniciar com um firewall fechado básico. O que você precisa fazer é negar tudo por padrão, e então liberar o acesso apenas às coisas que você realmente precisar. As regras devem estar dispostas de forma a liberar primeiro e então negar. A premissa é que você adicione as regras para o que for liberado, e então tudo mais é negado. :)
Agora, vamos criar o diretório /etc/firewall. Entre no diretório e edite o arquivo fwrules como nós especificamos no rc.conf. Por favor observe que você pode alterar este nome de arquivo para qualquer coisa que deseje. Este guia apenas dá apenas um exemplo de nome de arquivo.
Agora, vamos examinar um arquivo com exemplos de regras de firewall, as quais estão devidamente comentadas.
# Define o caminho completo do comando de firewall (assim como no # /etc/rc.firewall) para facilitar a referencia. Ajuda a tornar o # script mais simples de ser lido. fwcmd="/sbin/ipfw" # Força uma limpeza das regras atuais antes de recarregar. $fwcmd -f flush # Desvia todos os pacotes através da interface de tunel. $fwcmd add divert natd all from any to any via tun0 # Libera todas as conexões que possuem uma regra dinâmica construida # para ela, mas nega as conexões estabelecidas que não possuirem uma # regra dinâmica. Consulte o ipfw(8) para maiores detalhes. $fwcmd add check-state $fwcmd add deny tcp from any to any established # Libera todas as conexões do localhost $fwcmd add allow tcp from me to any out via lo0 setup keep-state $fwcmd add deny tcp from me to any out via lo0 $fwcmd add allow ip from me to any out via lo0 keep-state # Libera todas as conexões iniciadas a partir da minha placa de rede $fwcmd add allow tcp from me to any out xmit any setup keep-state $fwcmd add deny tcp from me to any $fwcmd add allow ip from me to any out xmit any keep-state # O acesso de qualquer pessoa na internet esta liberado para os # seguintes serviços na maquina. Este exemplo libera especificamente # conexões destinadas ao sshd e a um servidor web. $fwcmd add allow tcp from any to me dst-port 22,80 in recv any setup keep-state # Isto envia um RESET para todos os pacotes de ident. $fwcmd add reset log tcp from any to me 113 in recv any # Habilita o ICMP: remova o tipo 8 se você não desejar que # seu servidor responda a pings $fwcmd add allow icmp from any to any icmptypes 0,3,8,11,12,13,14 # Nege todo o restante. $fwcmd add deny log ip from any to any
Agora você tem um firewall completamente funcional o qual irá permitir conexões nas portas 22 e 80 e irá logar qualquer outra tentativa de conexão. Agora, você já esta apto a rebootar o seu equipamento com segurança e o seu firewall deverá subir perfeitamente. Se você achar que isto está incorreto de alguma forma ou experimentar algum problema, ou tiver alguma sugestão para melhorar esta página, por favor envie-me um email.
6.1. porque você esta utilizando o natd(8) e o ipfw(8) quando você poderia estar utilizando os filtros integrantes do ppp(8)?
Eu tenho que ser honesto e dizer que não existe nenhuma razão especial para o porque eu estou utilizando o ipfw e o natd ao invés de utilizar o recurso de filtragem nativo do ppp. Nas discussões que eu tive com outras pessoas sobre este assunto, o consenso parece ser de que enquanto o ipfw é certamente mais poderoso e mais configurável do que a capacidade nativa de filtragem do ppp, o que ele compensa na funcionalidade perde em na facilidade de se customizar. Uma das razões de porque eu o utilizo é porque eu prefiro ter a filtragem de pacotes realizada a nível de kernel do que a nível de um programa userland.
6.2. Eu recebo mensagens do tipo limit 100 reached on entry 2800 e depois disso eu nunca mais vejo entradas de negação no meu log. O meu firewall continua funcionando ?
Isto significa somente que a contagem máxima de log para esta regra foi atingida. A
regra propriamente dita continua funcionando, mas não será mais logada até que você
resete a contagem do log. Você pode resetar esta contagem com o comando ipfw resetlog. Alternativamente, você pode aumentar o limite de log no seu
arquivo de configuração do kernel com a opção IPFIREWALL_VERBOSE_LIMIT como descrito anteriormente. Você também pode
alterar este limite (sem ter que recompilar seu kernel e sem ter que rebootar) utilizando
o sysctl(8) para ajustar o
valor da variável net.inet.ip.fw.verbose_limit.
6.3. Se eu estou utilizando internamente um endereço privado, como por exemplo da rede 192.168.0.0, eu posso adicionar uma linha de comando semelhante a $fwcmd add deny all from any to 192.168.0.0:255.255.0.0 via tun0 as regras do firewall para prevenir tentativas externas de conexão as máquinas internas?
A resposta simples é não. A razão para isto é que o natd está fazendo a tradução de endereços para qualquer coisa que esteja sendo desviada através do dispositivo tun0. Tanto quanto os pacotes entrantes falarão apenas com o IP atribuido dinâmicamente e não com a rede interna. De qualquer forma, observe que você pode adicionar uma regra semelhante a $fwcmd add deny all from 192.168.0.4:255.255.0.0 to any via tun0, ao seu firewall para negar o acesso de um equipamento da sua rede interna a um endereço fora dela.
Este tutorial assume que você está executando o userland-ppp, então o conjunto de regras disponibilizado opera com a interface tun0 , a qual corresponde a primeira conexão realizada com o ppp(8) (também conhecido como user-ppp). Conexões adicionais irão utilizar tun1, tun2, etc.
Você também deve observar que o pppd(8) por sua vez utiliza a interface ppp0, assim se você iniciar a conexão com o pppd(8) você precisa subistituir as ocorrencias de tun0 nas regras por ppp0. Uma forma rápida de editar as regras do firewall para refletir esta mudança é mostrada abaixo. O arquivo original de regras deve ser backupeado como fwrules_tun0.
% cd /etc/firewall
/etc/firewall% su
Password:
/etc/firewall# mv fwrules fwrules_tun0
/etc/firewall# cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules
Para saber se você está utilizando o ppp(8) ou o pppd(8) você pode examinar a saida do comando ifconfig(8) quando a conexão estiver ativa. Por exemplo, para uma conexão estabelecida com o pppd(8) você deve ver algo semelhante a isto (abaixo seguem apenas as linhas relevantes):
% ifconfig
(omitido...)
ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xff000000
(omitido...)
Por outro lado, para uma conexão estabelecida com o ppp(8) (user-ppp) você deve ver alguma coisa semelhante a isto:
% ifconfig
(omitido...)
ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
(skipped...)
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
(IPv6 stuff skipped...)
inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xffffff00
Opened by PID xxxxx
(omitido...)
Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.