NewsGeneration: um serviço oferecido pela RNP desde 1997


ISSN 1518-5974
Boletim bimestral sobre tecnologia de redes
produzido e publicado pela  RNP – Rede Nacional de Ensino e Pesquisa
15 de janeiro de 1999 | volume 3, número 1

volta à página inicial de NewsGeneration

Nesta edição:

NewsGeneration:



IP Firewall no FreeBSD

Antonio Paulo Salgado Forster <>

Rede Nacional de Ensino e Pesquisa (RNP)

Introdução ao IPFW
O Kernel
As regras
Configuração do Syslogd
Conclusão
Sites relacionados

Dando continuidade ao artigo sobre IPFW da última edição do RNP News Generation de 1998, neste artigo temos uma descrição do IPFW do FreeBSD. Assim como no Linux, o FreeBSD possui um filtro de pacotes, implementado a nível de kernel, bastante poderoso (mais ainda que o IPFW do Linux), que permite ao administrador da rede (ou máquina) elevar o nível de segurança de sua rede, controlando a entrada e saída dos pacotes.
O FreeBSD possui muitas vantagens sobre outros sistemas operacionais utilizados como servidores de rede, sendo que dentre elas, podemos citar a estabilidade queé muito superior a de outros sistemas abertos.
Muito do que foi dito no artigo anterior pode ser aplicado a este, o que o deixará mais enxuto, evitando assim redundância de informações.

^

Introdução ao IPFW

Um filtro de pacotes pode elevar o nível de segurança de uma rede por fazer a filtragem nas camadas 2 e 3 do protocolo TCP/IP, ou seja, nos cabeçalhos do IP e dos protocolos da camada de transporte utilizados (TCP, UDP, ICMP e outros). Como qualquer informação que entra ou sai de uma rede TCP/IP, obviamente, estará dentro de um pacote IP, o filtro de pacotes poderá bloquear a entrada (ou saída) dessa informação. Apesar disso, não devemos encarar o filtro de pacotes como 100% eficaz ou pensar que, só pela sua existência, uma rede estará totalmente segura e não poderá ser comprometida.

As ameaças são muitas, e devemos sempre nos precaver contra intrusos, não importando a sua origem: rede externa, rede interna ou dial-ups. Normalmente, o filtro de pacotes diferencia quem pode e quem não pode acessar alguma máquina ou serviço, analisando o IP origem, o destino, e o serviço a ser acessado. Ele não provê nenhum tipo de serviço de autenticação de usuário, por exemplo. Portanto, ele deve ser considerado como uma parte de um sistema de proteção, e não como o sistema de proteção por si só.

^

O Kernel

Assim como no caso do Linux, apresentado no volume 2, número 8, o kernel do sistema deve ser recompilado com algumas opções para que o filtro de pacotes possa ser ativado. Demonstraremos esse processo nessa seção.

Alguns dias antes desse artigo ser iniciado, foi-nos disponibilizado uma cópia dos CD's do FreeBSD 3.0, que foi utilizado nesse exemplo. A seqüencia de comandos a seguir fará a compilação do kernel do FreeBSD, já instalando-o.

# cd /sys/i386/conf
> Vai para o diretório de configuração;

# cp GENERIC HOSTNAME
> Copia o arquivo de configuração do códico fonte;

# grep FIREWALL LINT >> HOSTNAME
> Copia para o arquivo de configuração a ser utilizado as opções relativas ao IPFW;

# config HOSTNAME
> Prepara o Makefile para compilação do núcleo;

# cd ../../compile/HOSTNAME
> Muda para o diretório de compilação do núcleo;

# make
> Compila o kernel;

# make install
> Instala o novo kernel

Antes da máquina sofrer um reboot com o novo kernel, algumas alterações de configuração ainda devem ser feitas:

Após esses passos, a máquina poderá sofrer o reboot para que o novo kernel entre em funcionamento.

^

As regras

Como foi dito acima, o IPFW do FreeBSD assume, em sua configuração default um deny ALL. Portanto, um arquivo de regras inicial deve ser criado antes do boot. A sintaxe, um pouco mais amigável que a do ipfwadm, gerenciador do IPFW do Linux, foi vista também no exemplo da seção anterior. Abaixo, temos o help do comando /sbin/ipfw, o gerenciador do IPFW do FreeBSD.

# ipfw
usage: ipfw [options]

flush
add [number] rule
delete number ...
list [number ...]
show [number ...]
zero [number ...]
rule: action proto src dst extras...
action:
{allow|permit|accept|pass|deny|drop|reject|unreach code|
reset|count|skipto num|divert port|tee port|fwd ip} [log]
proto: {ip|tcp|udp|icmp|}
src: from [not] {any|ip[{/bits|:mask}]} [{port|port-port},[port],...]
dst: to [not] {any|ip[{/bits|:mask}]} [{port|port-port},[port],...]
extras:
fragment (may not be used with ports or tcpflags)
in
out
{xmit|recv|via} {iface|ip|any}
{established|setup}
tcpflags [!]{syn|fin|rst|ack|psh|urg},...
ipoptions [!]{ssrr|lsrr|rr|ts},...
icmptypes {type[,type]}...

Como pode-se perceber, o IPFW do FreeBSD oferece uma série de opções não vistas no IPFW do Linux, como por exemplo, rejeitar um pacote enviando à origem uma mensagem via ICMP (action=reject), fazer uma filtragem mais detalhada de pacotes TCP através das TCP flags, ou filtrar pacotes IP com opções de Source Routing ativadas. Abaixo temos um exemplo real de regras utilizando o ipfw(8).

# Bloqueia pacotes com opções de Source Routing e Record Route do Cabecalho IP ativadas.
add 00001 deny tcp from any to any ipoptions ssrr,lsrr,rr

# Regra anti-spoofing de saída: só permite a saída de pacotes que realmente estejam utilizando o endereço real da máquina como origem
add 00002 deny ip from not HOSTNAME to any via xl0 out

# Bloqueio de pacotes com combinações estranhas de flags do protocolo TCP
add 00003 deny tcp from any to HOSTNAME tcpflags syn,fin
add 00004 deny tcp from any to HOSTNAME tcpflags syn,rst


# Bloqueio de pacotes com endereço origem de classes de endereçamento IP reservadas
add 00005 deny ip from 10.0.0.0/8 to HOSTNAME via xl0 in
add 00006 deny ip from 172.16.0.0/12 to HOSTNAME via xl0 in
add 00007 deny ip from 192.168.0.0/16 to HOSTNAME via xl0 in


# Permite qualquer pacote TCP de conexão já estabelecida
add 00008 permit tcp from any to any established

# Permite pacotes com origem/destino 127.0.0.1 desde que o tráfego seja feito pela interface de loopback
add 00009 permit ip from 127.0.0.1 to 127.0.0.1 via lo0
add 00010 deny ip from 127.0.0.1 to 127.0.0.1 via lo0
add 00011 permit ip from HOSTNAME to HOSTNAME via lo0
add 00012 deny ip from HOSTNAME to HOSTNAME via lo0


# Permite a saída de pacotes tcp, e queries de DNS
add 00013 permit tcp from HOSTNAME to any via xl0 out
add 00014 permit udp from HOSTNAME to any 53 via xl0 out


# Permite a entrada de DNS responses
add 00015 permit udp from any 53 to HOSTNAME via xl0 in

# Permite conexões TCP vindas da rede local (no exemplo: xxx.yyy.zzz.www) com destino aos serviços de FTP, SSH e SMTP, gerando logs de tais conexões
add 00016 permit log tcp from xxx.yyy.zzz.www/24 to HOSTNAME 20,21,22,25 setup via xl0 in
add 00017 permit tcp from xxx.yyy.zzz.www/24 to HOSTNAME 21,22,23,25 via xl0 in


# Permite a entrada de pacotes ICMP dos tipos echo, echo reply e destination unreachable
add 00018 permit icmp from any to HOSTNAME via xl0 in icmptypes 0,3,8

# Permite a saída de pacotes ICMP
add 00019 permit icmp from HOSTNAME to any

# Bloqueia qualquer outro tipo de pacote senão os permitidos acima, gerando logs dos mesmos.
add 65534 deny log all from any to any

^

Configuração do Syslogd

O IPFW do FreeBSD, em modo verbose, envia os logs ao console e ao syslog daemon com a prioridade/facilidade kern.crit. Assim como no exemplo citado no artigo anterior, o arquivo de configuração deve ser editado para que as mensagens sejam direcionadas corretamente:

Arquivo /etc/syslog.conf:


kern.crit /var/log/ipfw



Alguns exemplos de logs gerados pelo IPFW do FreeBSD:


Jan 12 18:21:49 HOSTNAME /kernel: ipfw: 65534 Deny TCP xxx.yyy.zzz.37:1049 xxx.yyy.zzz.37:80 out via lo0
Jan 12 18:22:03 HOSTNAME /kernel: ipfw: 65534 Deny TCP xxx.yyy.zzz.37:1050 xxx.yyy.zzz.37:80 out via lo0
Jan 12 18:26:08 HOSTNAME /kernel: ipfw: 65534 Deny TCP xxx.yyy.zzz.37:1051 xxx.yyy.zzz.37:234 out via lo0
Jan 12 18:31:43 HOSTNAME /kernel: ipfw: 65534 Deny TCP xxx.yyy.zzz.37:1052 xxx.yyy.zzz.37:312 out via lo0
Jan 12 18:34:21 HOSTNAME /kernel: ipfw: 65534 Deny TCP xxx.yyy.zzz.38:24208 xxx.yyy.zzz.37:342 in via xl0
Jan 12 18:34:24 HOSTNAME /kernel: ipfw: 65534 Deny TCP xxx.yyy.zzz.38:24208 xxx.yyy.zzz.37:342 in via xl0
Jan 12 18:34:33 HOSTNAME /kernel: ipfw: 6 Forward to xxx.yyy.zzz.33:80 TCP xxx.yyy.zzz.38:24209
xxx.yyy.zzz.37:80 in via xl0

^

Conclusão

O IPFW do FreeBSD, como foi apresentado brevemente nesse artigo, possui muitas funcionalidades não encontradas em outros filtros de pacotes, comerciais ou não, o que torna o seu uso bastante eficaz. Algumas outras funcionalidades como NAT e Forwarding (no caso de um FreeBSD agindo como roteador) que não foram abordades neste artigo podem ser facilmente utilizadas a partir da leitura da documentação que acompanha o sistema operacional, que é bastante completa por sinal.

Como sempre, vale lembrar que um filtro de pacotes por si só não garante a segurança de uma rede, e nem mesmo de uma máquina; é sempre necessário que um administrador esteja por trás disso, fazendo um monitoramento de perto sobre o que está acontecendo em seu sistema.

^

Sites relacionados

Site Oficial do FreeBSD no Brasil
Handbook do FreeBSD sobre firewalls (Inglês)

^

NewsGeneration, um serviço oferecido pela RNP – Rede Nacional de Ensino e Pesquisa
Copyright © RNP, 1997 – 2004