Beruflich Dokumente
Kultur Dokumente
3br_pt
Se existirem perguntas ou comentários, por favor, envie-os para walt@erudi
tion.net. A versão mais recente desse documento vai estar sempre disponível em www.f
reebsd-howto.com. Os direitos de reprodução desse documento são reservados. Versão em po
rtuguês desse documento sob responsabilidade de Patrick Tracanelli (eksffa@freebsd
brasil.com.br) e Maurício Goto (freebsd-brasil@uol.com.br). A versão mais recente do
mesmo estará sempre disponível em http://free.bsd.com.br/~eksffa/freebsd/ipfw.txt
Sumário.
1. Informacoes gerais sobre a Filtragem de Pacotes de Rede
2. Acionando o Ipfirewall(4)
2.1. O /etc/rc.firewall e firewalls com política aberta (OPEN f
irewalls)
2.2. Carregando Rulesets (conjunto de regras)
2.2.1. Tipos de Firewall pré-definidos
2.2.2. Tipos de Firewall Personalizado
3. Sintaxe de regras básicas do Ipfw(8)
3.1. Listando Regras Ativas
3.2. Comandos básicos e suas funções
3.3. Especificando Protocolos
3.4. Especificando endereços de Origem e de Destino
3.4.1. Uma introdução à Netmask e Bitmask
3.4.2. Especificando Portas e Faixas de Portas
4. Sintaxe de regras avançadas do ipfw(8)
4.1. A ação "unreach"
4.2. Controle de Interface e de Fluxo
4.3. Combinando tipos de pacotes ICMP e TCP específicos
4.3.1. icmptypes
4.3.2. tcpflags, setup & established
4.3.3. ipoptions
4.4. Reconhecendo Pacotes Fragmentados
4.5. Filtragem baeada em UID e GID
5. Logs (Logging)
5.1. Propriedades de Logs
5.2. Configurações de Logs do sistema
5.2.1. Opções do Kernel
5.2.2. Configurando o syslog(8)
5.2.3. Configuração do newsyslog(8) pra fazer rotacionamento
de logs (log rotation)
5.3. Configuração de log nas regras
6. Introdução à filtragem 'Stateless' e 'Stateful' de pacotes
6.1. Configurações 'Stateful' Iniciais
6.2. Configurações 'Stateful' Avançadas
6.3. Anatomia de uma Regra Dinâmica
7. Traffic Shapping (controle de tráfego)
7.1. Probabilidade de Ocorrências (Probability Matching)
7.2. Dummynet
7.2.1. Enfileiramento de pipes (Pipe Queues)
7.2.2. Máscaras de pipes (Pipe Masks)
7.2.3. Remanejamento de pacotes por pipes (Packet Reinj
ection)
8. Fluxo do Tráfego pelo Firewall
Apêndice A: Exemplos de Configurações de Firewall;
2. Acionando o Ipfirewall(4);
O ipfirewall(4) pode ser iniciado de duas formas: você pode adicionar as o
pções apropriadas no seu kernel através do seu arquivo de configurações, e compilar um nov
o kernel pro seu sistema; ou você pode usar o kldload(8) pra carregar dinâmicamente
o módulo base do ipfw(8), o ipfw.ko, no kernel. As duas abordagens funcionam bem p
ra adicionar um firewall(4) com configurações básicas, contudo, a compilação estática propo
ciona, com pouca diferença, uma melhor performance, mas permite ainda que se adici
one opções mais detalhadas de configuração, como por exemplo, a geração e limitação de logs
Pra carregar o ipfw de forma dinâmica, simplesmente use o comando:
root@eeviac~# kldload ipfw
root@eeviac~#
Pra acionar o ipfirewall(4) de forma estática, o equivalente seria adicion
ar a seguinte linha no arquivo de configurações do seu kernel:
options IPFIREWALL
Em seguida a compilação e instalação acionaria o ipfirewall(4) estático no kernel,
logo após a próxima inicialização do sistema.
Contudo, as coisas não são tão simples quanto parecem, se você simplesmente segu
ir os passos descritos acima quando estiver na frente da máquina, vai perceber que
existe a necessidade de algumas opções adicionais pra poder usar a estação. Se você prest
ar atenção nos conceitos de política de firewall citados acima (aberto e fechado), vai
entender porque o uso do equipamento vai se complicar muito, se você não perceber q
ue o firewall usa uma política padrão fechada. Se você simplesmente adicionar o ipfire
wall(4) sem nenhuma configuração posterior, todo o tráfego de rede vai ser bloqueado,
ou seja, nenhum pacote será roteado. Isso fatalmente pode se tornar um tormento se
você for adicionar o firewall remotamente. É claro que esse tipo de dor de cabeça pod
e ser evitada, mesmo considerando que não é recomendado acionar o ipfirewall(4) remo
tamente, tanto de forma estática quanto dinâmica.
Se, de qualquer maneira, você quiser carregar o ipfirewall(4) de um comput
ador remoto, então recomendados que se faça da seguinte forma:
root@eeviac~# kldload ipfw && \
ipfw -q add 65000 allow all from any to any
root@eeviac~#
Assim você vai automaticamente adicionar uma regra pra permitir todo o tráfe
go da rede, ao invés de bloquea-lo, evitando assim que você perca a conexão com a máquin
a remota. De qualquer forma, é recomendável que se carregue o ipfirewall(4) dessa ma
neira em máquinas locais também, especialmente se elas estiverem conectadas em rede,
pra não perder uma conexão em andamento.
Acionar o ipfirewall(4) no kernel, de forma estátita em uma máquina remota,
contudo, requer um pouco mais de trabalho. O motivo é simples, quando você termina d
e instalar um novo kernel, você é obrigado a rebootar a sua máquina, ai sim, a partir
da próxima inicialização ela irá utilizar o novo kernel. Contudo se você somente adicionar
o ipfirewall(4) no kernel, assim que o sistema estiver no ar, ele não vai estar r
oteando os pacotes, ou seja, você não vai conseguir estabelecer uma conexão remota nov
amente com a máquina. Então antes de inicializar o sistema com um novo kernel você tem
que definir alguma maneira pra máquina aceitar a sua conexão, pra que assim você não se
ja bloqueado pelo seu próprio firewall.
Pra você fazer isso, basta adicionar duas linhas no seu rc.conf, uma que v
ai acionar o firewall na inicialização da máquina, e outra pra definir o tipo de firew
all que vai ser iniciado. No caso firewall do tipo aberto (OPEN). Então basta adic
ionar as seguintes entradas no seu /etc/rc.conf:
firewall_enable="YES"
firewall_type="OPEN"
Existem ainda outros tipos de firewall previamente definidos no /etc/rc.
firewall, mas nós vamos tratar deles posteriormente. Por enquanto vamos começar com
uma política de firewall aberta (OPEN). Ainda existe uma alternativa muito boa pra
se definir uma política aberta como padrão pro ipfw(8) no kernel. Você pode simplesme
nte adicionar a seguinte linha no arquivo de configuração do seu kernel:
options IPFIREWALL_DEFAULT_TO_ACCEPT
Nesse caso, as opções que nós adicionamos no rc.conf anteriormente não serão *nece
ssárias*, porque nós não vamos *precisar* do /etc/rc.firewall pra configurar uma polític
a aberta de firewall, porque essa política já vai ser iniciada por padrão no kernel. C
ontudo, ainda que você escolha definir uma política de firewall padrão no kernel, é inte
ressante adicionar aquelas opções ao /etc/rc.conf porque posteriormente nós vamos usar
o /etc/rc.firewall pra carregar nossas próprias regras de configurações de firewall.
Adicionar essas opções ao /etc/rc.conf também é válido se você vai carregar o kernel dinâmi
ente, porque se eventualmente seu sistema for reinicializado, o módulo ipfw.ko não v
ai ser carregado de forma automática. As funções de carregamento do firewall pelo /etc
/rc.conf permite-nos carregar o módulo ipfw.ko automaticamente.
Ainda existem outras opções pro ipfirewall(4) que são possíveis se nós formos aci
onar o firewall de forma estática no kernel, até o início da série 4.x do FreeBSD alguma
s dessas opções não podiam ser acionadas se não fosse de forma estática no kernel, mas nas
versões mais recentes foram definidas algumas variávies do kernel, mutáveis via sysc
tl(8), que não restringem mais essas opções ao kernel estático. Além do IPFIREWALL_DEFAULT
_TO_ACCEPT nós ainda temos as seguintes opções:
options IPFIREWALL_VERBOSE
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE_LIMIT=#
5. Logs (Logging);
5.1. Propriedades de Logs;
As vantagens de manter os logs do firewall ativo são óbvias. A possibilidade
de verificar posteriormente quais conexões foram negadas, de que endereços elas vie
ram, pra que rede ou estação elas estavam indo, se o conteúdo dos pacotes eram fragmen
tados (indicantivo de muitos ataques de negação de serviço DoS), enfim, possibilita sa
ber onde as conexões estão sendo feitas, por quem e quando. Em especial, os logs de
firewall são importantes pra rastrear crackers ou pessoas má intencionadas.
Mas logar também tem o seu lado negativo, se você não for cuidadoso. Dependend
o do tipo de dado que você está logando você pode se perder com a abundância de mensagen
s, e também utilizar muito espaço em disco pros arquivos de logs. Ataques de negação de
serviço que tendem a sobrecarregar discos rígidos é um dos tipos mais antigos de ativi
dade má intencionada, e por incrível que pareça ainda é sinônimo de perigo pra administrad
ores imprudentes. Por isso a importância de se definir que tipos de regras serão log
adas. Normalmente logar pacotes permitidos de serviços públicos (como WWW) não é uma boa
indéia, visto que o próprio serviço (servidor WWW) também mantém logs das atividades de a
cesso, e a frequência de pacotes em um serviço como esse é muito grande.
Por outro lado, o que a maioria dos novos administradores que experiment
am quando eles habilitam o ipfirewall(4) pra logar, é o seu terminal abarrotado co
m mensagens sobre a atividade de pacotes. Esse pequeno inconveniente é o resultado
da combinação de:
- estar logando regras que combinam com pacotes muito frequentes;
- não ter desabilitado logs pro console e pros terminais de root (péssima idéi
a);
- não estar controlando limite de logs com o IPFIREWALL_VERBOSE_LIMIT;
7.2. Dummynet;
Todas as outras funcionalidades pra se implementar Traffic Shapping req
uer o uso do dummynet(4), que foi incorporado na versão 2.2.8 do FreeBSD. Pra isso
precisamos adicionar uma opção ao nosso Kernel:
options DUMMYNET
Depois de compilado o nosso kernel com mais essa opção (além das opções típicas do
pfirewall(4)), o administrador do sistema vai poder especificar a criação de túneis (c
hamados pipes ) pra controle do tráfego. Um túnel nada mais é do que uma regra de Traffic
Shapping que controla o roteamento, canalizando as informações que posteriormente i
rão trafegar por endereços específicos de rede. A criação desses túneis é feita com o coman
ipe do ipfw(8). O tráfego é redirecionado à esses tuneis por meio do comando pipe <pipe
#> no ipfw(8). Vamos então criar um túnel simples:
pipe 10 config bw 100Kbit/s
Note que, assim como nas regras de firewall, o pipe é apenas mais uma ação pro i
pfw(8), exatamente como add ou delete , portanto antes de cada comando é feita uma cham
ada ao ipfw(8) (/sbin/ipfw pipe 10... por exemplo).
Esse túnel simples que criamos logo acima vai limitar o fluxo de informações p
ra uma velocidade máxima de 100 Kilobits por segundo. Existem várias maneiras distin
tas de indicarmos as medidas de velocidade de tráfego: bit/s, Byte/s, Kbit/s, Kbyt
e/s, Mbit/s, Mbyte/s. Cada túnel de limitação de banda deve usar a opção bw (de bandwidth
nda).
Uma outra maneira de controlar tráfego é usar a opção delay que força um atraso n
omunicação, simulando o que se conhece como lag do sistema:
pipe 10 config delay 100
O valor que segue a opção delay é o tempo de atraso que nós desejamos, definido e
milisegundos. Nesse exemplo todo o tráfego roteado através desse túnel terá um atraso d
e 100ms.
Existe ainda a possibilidade de proporcionarmos uma taxa de perca de pac
otes, função essa igual à prob que comentalos logo acima. Por exemplo, pra conseguirmos
uma taxa de 20% de pacotes perdidos (equivalente a prob 0.8 ) podemos criar o segui
nte túnel:
pipe 10 config plr 0.2
"plr" significa "packet loss rate" (taxa de perca de pacotes), portanto
o valor indica à que taxa os pacotes não serão roteados, oposto da opção prob do ipfw(8),
e indica a taxa dos pacotes que serão roteados. Pra evitar qualquer confusão com a u
tilização de prob ou ®plr , aconselhamos que o administrador assuma uma escolha pessoal e
tre as duas possibilidades. Ambas são igualmente efetivas, e co-existem porque a p
rimeira é nativa do ipfirewall(4) enquanto a segunda faz parte do dummynet(4).
_________
| |
REDE INTERNA <== (OUT) | | (IN) <== INTERNET
REDE INTERNA ==> (IN) | | (OUT) ==> INTERNET
| ________ |
firewall