Академический Документы
Профессиональный Документы
Культура Документы
Atenção: este documento apesar de datado, é ainda considerado prático, e a melhor introdução ao
IPFIREWALL(4) disponível publicamente na Internet. Todas as informações aqui disponíveis continuam
válidas e aplicáveis nas versões mais recentes do FreeBSD. Contudo, uma série de recursos não são
documentados neste documento, a saber:
• Controle de Banda e QoS com WF2Q+
• ;Suporte ALTQ;
• Blocos OR;
• Tabelas e análise binária avançada;
• Grupos de Regras;
• Marcação de Pacotes;
• Filtro de Camada 2;
• Filtro de Camada 7 em conjunto com Netgraph;
• Balanceamento e Redundância de Firewall (IPFW TEE);
• Recursos antispoof nativos;
• Filtro IPv6;
• Outros de menor relevância;
O leitor deste documento é fortemente indicado a obter mais informações sobre os recursos acima. As
fontes de informação recomendadas são o histórico da lista de discussões FUGBR e o livro FreeBSD:
Poder para Servir, de Patrick Tracanelli e Jean M. Melo, este que por sua vez documenta todos os tópicos
não abordados aqui, com amplos detalhes.
Este documento está em plena sincronia com a versão 0.4 deste HOWTO. A diferença entre a versão 0.3 e a
0.4 são correções ortográficas em língua inglesa.
Este documento encontrase disponível no website da FreeBSD Brasil por referência histórica
(especialmente links referenciados por engines de busca). O endereco permanente deste documento em
sua versão original é:
http://free.bsd.com.br/~eksffa/freebsd/ipfw.txt
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
V.0.3br_pt
Sumário.
4.3.1. icmptypes
4.3.2. tcpflags, setup & established
4.3.3. ipoptions
5. Logs (Logging)
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
2. Acionando o Ipfirewall(4);
options IPFIREWALL
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Assim você vai automaticamente adicionar uma regra pra permitir todo o
tráfego da rede, ao invés de bloquea-lo, evitando assim que você perca a
conexão com a máquina remota. De qualquer forma, é recomendável que se carregue
o ipfirewall(4) dessa maneira em máquinas locais também, especialmente se elas
estiverem conectadas em rede, pra não perder uma conexão em andamento.
Pra você fazer isso, basta adicionar duas linhas no seu rc.conf, uma
que vai acionar o firewall na inicialização da máquina, e outra pra definir o
tipo de firewall que vai ser iniciado. No caso firewall do tipo aberto (OPEN).
Então basta adicionar as seguintes entradas no seu /etc/rc.conf:
firewall_enable="YES"
firewall_type="OPEN"
options IPFIREWALL_DEFAULT_TO_ACCEPT
Ainda existem outras opções pro ipfirewall(4) que são possíveis se nós
formos acionar o firewall de forma estática no kernel, até o início da série
4.x do FreeBSD algumas dessas opções não podiam ser acionadas se não fosse de
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
forma estática no kernel, mas nas versões mais recentes foram definidas
algumas variávies do kernel, mutáveis via sysctl(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=#
options IPV6FIREWALL
options IPV6FIREWALL_VERBOSE
options IPV6FIREWALL_VERBOSE_LIMIT=100
options IPV6FIREWALL_DEFAULT_TO_ACCEPT
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Ainda que você defina ou não o tipo de firewall que você vai estar
trabalhando, sempre que a opção firewall_enable="YES" é adicionada no rc.conf e
o sistema é iniciado, o /etc/rc.firewall é lido e executado também, a partir
das configurações definidas no rc.conf, e os seguintes comandos são sempre
adicionados ao ipfw(8):
${fwcmd} add 100 pass all from any to any via lo0
${fwcmd} add 200 deny all from any to 127.0.0.0/8
Essa regra permite que todo tráfego externo seja aceito como entrada
(com excessão pro loopback, já que a rede localhost é previamente bloqueada) e
todo o tráfego interno seja aceito como saída. A mesma função do
IPFIREWALL_DEFAULT_TO_ACCEPT no kernel. Se a política aberta é definida no
kernel, a regra número 65535 vai ser automaticamente carregada como "allow ip
from any to any" no lugar de "deny ip from any to any", posteriormente
adicionando a regra número 65000. Isso cria uma redundância de política de
firewall aberta. Então, é mais indicado definir o tipo de firewall como
"UNKNOWN" (desconhecido) se você adicionou a política aberta
(IPFIREWALL_DEFAULT_TO_ACCEPT) no kernel, e não quer permitir mais nenhuma
regra do rc.firewall. Para isso, inclua as seguintes linhas no seu
/etc/rc.conf:
firewall_enable="YES"
firewall_type="UNKNOWN"
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
firewall_enable="YES"
firewall_type="/etc/rc.firewall.rules"
Dessa forma você vai poder definir sua própria configuração de firewall
no arquivo /etc/rc.firewall.rules, o qual será carregado sempre que seu
firewall for iniciado. Se você preferir ainda que seu firewall seja iniciado de
forma silenciosa, basta incluir no rc.conf:
firewall_quiet="YES"
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Dessa forma, você vai estar listando todas as regras ativas no momento,
seguindo a ordem do número da regra. Por exemplo:
Dessa forma, ainda que, a regra número 00103 tenha sido adicionada
antes da regra 00101, a de número menor será mostra antes, porque a ordem das
regras também influi na forma como o ipfirewall(4) vai se comportar.
Pra mostrar a data e hora da última vez que um pacote coincidiu com uma
regra basta usar a opção timestamp do ipfw(8):
root@eeviac~# date
Sat Sep 22 19:12:24 GMT 2001
Ou seja, nesse caso, a última vez que a regra 00101 bloqueou um pacote
foi na madrugada do dia anterior, a regra 00102 bloqueou um pacote também aos
33 minutos de 2 dias atrás, e o último pacote permitido pelo firewall foi há 9
segundos. Detalhe no comando date posterior que ilustra a data corrente.
ou
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
"deny" | "drop" - Qualquer pacote que combinar com uma regra cuja ação
seja "deny" ou "drop" são silenciosamente bloqueados pelo firewall, e o
processamento das regras *pra esse pacote* termina.
Essa regra nega todos os pacotes vindos de qualquer origem e indo pra
qualquer destino.
"reset" - Quando um pacote encontra uma regra com essa ação, o pacote é
bloqueado, e o ipfirewall(4) tenta enviar um sinal (flag) de TCP Reset (RST)
pro endereço de origem do pacote. O processamento das regras *pra esse pacote*
termina. Como esse tipo de regra apenas se aplica pra pacotes TCP, o protocolo
especificado na regra deve ser "tcp", para que apenas tais pacotes sejam
processados por essa regra, e não todos (proto "all") os protocolos de pacotes
IP.
Vale notar que o uso do "reset" pode ser muito interessante pra enganar
ferramentas que escaneiam as redes (network scanners), já que normalmente podem
detectar um serviço por trás de uma porta filtrada, mesmo que ele esteja por
trás de um firewall de bloqueio. Por outro lado, se alguém estiver praticando
um ataque do tipo "network flood" em uma porta específica a qual o
ipfirewall(4) está configurado para responder com pacotes RST, isso duplicaria
o uso da sua banda de rede. Uma solução simples é bloquear, com uma regra
prévia o endereço da máquina que está agindo dessa forma, endereço esse obtido
de forma dinâmica por monitoramento.
"count" - Todos os pacotes que combinarem com uma regra cuja ação seja
"count", determinará que o ipfirewall(4) incremente o contagem de pacotes, ou
seja, a saída de "ipfw show" indicará mais uma ocorrência de pacotes nessa
regra. Motivos estatísticos óbvios. O processamento das regras do firewall
continuam a buscar por outras regras que combinem com os pacotes.
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Essa regra faria com que todo o tráfego vindo da rede 192.168.1.0/24 e
indo pra qualquer destino seja processado pelas regras a partir da regra de
número 1800
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
32 255.255.255.255 1 1
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
31 255.255.255.254 2 1
30 255.255.255.252 4 2
29 255.255.255.248 8 6
28 255.255.255.240 16 14
27 255.255.255.224 32 30
26 255.255.255.192 64 62
25 255.255.255.128 128 126
24 255.255.255.0 256 254
...
Vamos ver, de forma sucinta como usar a tabela acima. Vamos descobrir
então qual é a faixa de IPs que compõe uma subrede cujo endereço seja:
172.16.100.32/28
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
sempre.
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
"unreach <código>" - Qualquer pacote que combine com uma regra cuja
ação seja "unreach", serã respondido com um código 'ICMP unreach' (código ICMP
de indisponibilidade), e posteriormente a leitra do conjunto de regras será
terminada. As possibilidades de códigos pro 'ICMP unreach' pode ser indicada
por número ou por nome. Segue agora uma breve lista de 'ICMP unreach codes' (os
códigos em questão) e seus nomes correspondentes. Se você não sabe onde esses
códigos são utilizados, não tem porque você tentar usa-los:
net 0 net-prohib 9
host 1 host-prohib 10
protocol 2 tosnet 11
port 3 toshost 12
needfrag 4 filter-prohib 13
srcfail 5 host-precedence 14
net-unknown 6 precedence-cutoff 15
host-unknown 7
isolated 8
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
podemos usar a opção literal "via", seguida do nome da interface. Dessa forma,
se estivermos usando uma placa de rede 3Com 3c59x PCI, sua interface será
"xl0". Pra filtrarmos qualquer pacote, vindos especialmente dessa interface,
com origem e destinos quaisqueres, o seguinte seria o suficiente:
add 1200 allow all from any to any out via any
root@eeviac~# ipfw add 7000 allow all from any to any out via xl0
root@eeviac~# ipfw list | grep 7000
07000 allow ip from any to any out xmit xl0
root@eeviac~#
Portanto, você pode usar "recv" ou "xmit" no lugar de "via" quando você
for criar alguma regra que faça uso de "in" e "out", contudo isso não é
preciso, o ipfirewall(4) distingui se a interface está recebendo o transmitindo
o dado, e, além do que, essa definição pode confundir usuários não experientes.
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
5 - Redirect (Redireção)
8 - Echo Request (Pedido de Echo)
9 - Router Advertisement (SPAM de roteamento? :-))
10 - Router Solicitation (Pedido de Roteamento)
11 - Time-to-Live Exceeded (TTL Excedido)
12 - IP header bad (Cabeçalho IP malformado)
13 - Timestamp Request (Pedido de Timestamp)
14 - Timestamp Reply (Resposta de Timestamp)
15 - Information Request (Pedido de Informação)
16 - Information Reply (Resposta de Informação)
17 - Address Mask Request (Pedido de Máscara de Rede)
18 - Address Mask Reply (Resposta de Máscara de Rede)
Se você ficou curioso pra saber como esses tipos ICMP, especialmente o
tipo 3, correspondem aos códigos de indisponibilidade que podem ser criados com
a opção "unreach", então, saiba simplesmente que o tipo 3 identifica qualquer
um desses códigos, ou seja, todos. Usar filtros de pacotes ICMP é muito útil,
especialmente pra controlar ping; por exemplo, você pode permitir que qualquer
cliente dentro da sua rede interna pingue qualquer estação pra fora da rede,
enquanto você bloqueia que qualquer estação externa pingue o seu gateway, ou
qualquer outro cliente interno. As três regras a seguir definem isso
facilmente:
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
A <flag> SYN é a mais interessante, visto que ela é enviada quando uma
conexão TCP é iniciada. Por ser tão importante, existe inclusive uma opção
separada do ipfw(8) dedicada especialmente pra definir pacotes TCP cujo
cabeçalho tenha a flag SYN ajustada. Essa opção se chama "setup". É claro que
só podemos trabalhar com a opção "setup" quando o protocolo indicado é o "tcp".
OU SIMPLESMENTE:
Em cada uma dessas regras, a mesma ação é tomada: todos os pacotes TCP
SYN vindos de qualquer (any) origem para qualquer (any) destino serão negados.
Vale a pena ilustrarmos a necessidade do protocolo ser "tcp" quando
trabalharmos essas regras.
4.3.3. ipoptions;
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Quando você for usar a opção "frag" pra filtrar (e bloquear) os pacotes
fragmentados, tem duas regrinhas básicas que você deve seguir. A primeira é que
você não pode usar "frag" quando também estiver usando a opção "tcpflags"; você
define qualquer pacote fragmentado, ou não define nenhum. A segunda: você
também não pode utilizar o "frag" se estiver especificando portas TCP ou UDP;
você bloqueia todos os pacotes fragmentados, não importando pra qual porta ou
serviço eles estejam sendo enviados. Dito isso, podemos facilmente definir uma
regra pra negar todos os pacotes fragmentados que estiverem entrando na rede:
Uma poderosa função que outros firewall (como o IPFilter) não possuem é
a filtragem de pacotes baseada em GID/UID. O Ipfirewall(4) tem a capacidade de
filtrar pacotes de acordo com o UID ou GID do dono do processo o qual originou
uma conexão. Por motivos lógicos só se pode filtrar pacotes que tenham sido
gerados por processos locais. As opções a serem utilizadas são "gid" ou "uid"
seguidos do GID/UID ou do nome do usuário/grupo que estivermos filtrando.
Essas regras permitem que apenas o usuário 'patrick' vai poder utilizar
a alias de IP (Apelido de IP, IP-Alias ou IP vhost) 172.168.0.10 pra
estabelecer conexões TCP pra fora da rede. Ninguém mais será permitido pendurar
Bots, Clientes de IRC ou qualquer outra coisa que precise estabelecer conexão
TCP (quase tudo) nesse endereço IP. O protocolo UDP também pode ser usado para
filtragem de pacotes baseada em UID/GID, contudo nenhum outro protocolo fora
esses dois podem.
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
5. Logs (Logging);
Mas logar também tem o seu lado negativo, se você não for cuidadoso.
Dependendo do tipo de dado que você está logando você pode se perder com a
abundância de mensagens, 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 atividade má intencionada, e por
incrível que pareça ainda é sinônimo de perigo pra administradores imprudentes.
Por isso a importância de se definir que tipos de regras serão logadas.
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 acesso, e a frequência de pacotes em um serviço como esse é muito
grande.
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=#
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
options IPFIREWALL_VERBOSE_LIMIT=10
!ipfw
*.* /var/log/ipfw/ipfw.log
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Atente pra usar <TAB> (tecla tab) nesse arquivo ao invés de espaços
simplesmente. Mesmo assumindo que usar “tabs” não é obrigatório no FreeBSD pro
arquivo /etc/syslog.conf, é de bom costume fazê-lo, caso você trabalhe também
com outros UNIX, cuja maioria não aceita espaços no syslog.conf(5). Portanto
mesmo você podendo ignorar a mensagem de advertência no início do
/etc/syslog.conf, é sempre bom manter o bom hábito seguro de usar o
syslog.conf(5) da forma indicada por ele.
*.err;kern.debug;auth.notice;mail.crit /dev/console
*.err root
*.notice;news.err root
*.alert root
*.emerg *
Então vamos resumir o que deve ser feito quando você for configurar
seus logs pelo arquivo de configuração syslog.conf(5):
Insira a linha com “!ipfw” e indique o caminho pra onde as informações
referentes às atividades do Firewall devem ser logadas.
Não altere as mensagens que serão enviadas ao usuário Root se ele estiver
logado. Indique os mesmos alertas pra um usuário que você usa com mais
frequência.
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Uma vez que tudo esteja pronto pra utilizar as funções de logs do
ipfirewall(4), vamos começar a definir quais regras nós queremos logar quando
elas forem filtradas. Existem dois parâmetros básicos pra usarmos em conjunto
com nossas regras pra definirmos que queremos logar *aquela* regra. Vejamos:
"log" – É o parâmetro mais comum. Toda vez que uma regra que for
definida o “log” for acionada, então a ação definida (“action”) por aquela
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
regra será logada todas as vezes que um pacote coincidir a regra. Por isso tome
muito cuidado pra não defnir “log” pra uma regra que a terão pacotes
frequentementes assimilados a ela, como por exemplo:
Por outro lado, definir “log” pra uma regra geral de negação é uma
pedida considerável:
Sempre que uma regra é logada, as informações geradas pra tal pacote
são:
Por definição, uma regra de firewall sua, quando logada, deve parecer
com o seguinte:
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Vamos assumir que estamos usando uma política de firewall fechado (ou
seja, firewall_type no /etc/rc.conf não está definido como “OPEN” e não existe
a entrada IPFIREWALL_DEFAULT_TO_ACCEPT no kernel do sistema). Nesse caso, as
duas regras anteriores vão permitir o roteamento dos pacotes desejados. A regra
número 1000 vai permitir todos os pacotes que sejam parte de uma conexão TCP já
estabelecida, e então a verificação das regras subsequentes vai cessar para
aqueles pacotes. Se, por outro lado algum pacote não fizer parte de uma conexão
iniciada, a regra 1000 não será assumida, e então a verificação passa pra regra
seguinte. Na regra número 2000, se o pacote for do tipo TCP SYN, e for
destinado à porta 22 (serviço SSH), a regra vai permitir que ele seja roteado.
Nesse caso, pacotes TCP SYN iniciam uma conexão TCP, por isso a importância de
deixa-los passar. Os pacotes subsequentes relacionados ao serviço SSH serão
permitidos pela regra 1000, já que eles farão parte de uma conexão já
estabelecida. Você pode experimentar uma configuração parecida usando
'stateless':
Vamos dar uma olhada em um exemplo memos simples, que envolve conexões
ssh, email, FTP e DNS pra rede 172.16.0.0/27:
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
- Protocolo
- Endereço & Porta IP
- Destino & Porta IP
- Tempo da regra esgotado
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
duração pra cada tipo de regra dinâmica pode ser verificado utilizando as
variáveis corretas do sysctl(8). Posteriormente podemos modificar esses
valores. Eis a listagem dos valores padrões dessas variáveis do sysctl:
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
regra 1000 falha, e a filtragem pelo firewall continua pra regra seguinte.
Pacotes TCP SYN spoofados são usados com muita frequência em taques de
rede. A ação mais comum desse tipo de ataque consiste em enviar inúmeros
pacotes TCP SYN (SYN FLOODs) pra uma determinada estação na rede, de modo que
toda a conexão fique em estado de espera, por estarem esperando suas respostas
em fila. Dessa forma o tráfego de rede controlado pelo kernel fica saturado,
evitando o roteamento de novas conexões legítimas. Mesmo considerando que o
Stack TCP/IP do FreeBSD é desenvolvido de forma à eliminar randomicamente
conexões TCP que estiverem em fila de espera de forma inativa, esse tipo de
ataque pode ser devastador dependendo da política de eliminação das filas
adotado no sistema (via sysctl(8)) e dependendo também da largura de banda da
rede. Vamos assumir que, se os pacotes TCP SYN chegarem ao servidor de forma
muito rápida, eles vão fazer pedidos falsos de conexões de forma mais rápida do
que eles podem ser eliminados da fila, não sobrando recursos o suficiente pra
tratarmos todas as conexões legítimas que também estiverem chegando.
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
certeza que o Stack TCP/IP do FreeBSD não seria sobrecarregado por tantas
tentativas de conexões, a criação das regras dinâmicas do ipfirewall(4)
poderiam ser saturadas, de forma a colocar pacotes em espera. A melhor forma de
evitar isso é diminuindo o tempo de vida das regras dinâmicas iniciadas por
pacotes TCP SYN, utilizando sysctl(8), como foi mostrado anteriormente, e
ainda, aumentar o número máximo de regras dinâmicas, através de uma outra
variável do sysctl(8):
net.inet.ip.fw.dyn_count
Dessa forma só os pacotes TCP SYN que saírem pelo seu firewall poderão
ser roteados, ou seja, os pedidos que entrarem serão automaticamente negados.
Esse é o mesmo tipo de proteção que o NAT e proxies transparentes de forma
geral oferecem pras máquinas internas.
Já podemos entender facilmente essa regra, que cria uma regra dinâmica
pra cada pedido de echo que nossas estações internas façam pra fora. Quando a
resposta chega ela é permitida pela regra dinâmica que estabeleceu a conexão
entre as duas pontas, e se alguém de fora tenta pingar uma máquina interna, a
regra padrão nega essa ação. O protocolo ICMP usa a variável
net.inet.ip.fw.dyn_short_lifetime do sysctl(8). Se a resposta do ping demorar
mais que 5 segundos pra chegar a regra vai ser descarregada e o pacote não vai
poder ser roteado. Se você considera que as respostas de ping levarão mais que
5 segundos pra acontecer, então você, como administrador da rede deve elevar o
valor da variável no sysctl(8). De qualquer forma a maioria dos atrasos de rede
levam menos de 1 segundo, a não ser que seja IRC ;-)
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
A regra 2000 ainda poderia ter definido uma faixa de rede com permissão
pra fazer o ping, caso existisse mais de uma rede por trás do firewall, e
apenas uma delas poderiam pingar máquinas externas. Na verdade escolhemos a
regra assim porque é a forma que mais se aproxima do nosso exemplo inicial de
controle do ping.
Vamos dar uma olhada na saída que você devei encontrar quando listar as
regras dinâmicas de um firewall 'stateful' no seu FreeBSD:
Mesmos depois que uma regra dinâmica foi descarregada, você ainda pode
lista-la com o comando “ipfw list”, contudo a regra inativa vai ter um valor de
tempo de vida (“T”) igual a zero (T 0, #). Uma vez descarregada, a regra não
vai mais aceitar pacotes, simplesmente porque ela não existe mais, até que a
mesma regra seja reiniciada, ou ressucitada pela mesma entrada “keep-state” da
regra que a originou inicialmente. Uma vez descarregadas, as regras também
podem ser substituídas por novas regras dinâmicamente ativadas. A não ser que
todas as regras dinâmicas continuem em pleno uso, elas serão continuamente
substituídas por novas regras, especialmente se o número de regras dinâmicas
alcançou o máximo permitido pelas variáveis do sysctl(8).
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Não vamos comentar a listagem acima, cabe a você entender o que está
acontecendo com o firewall. Note que existe conexões cujo tempo de vida já se
esgotou, e ainda assim a mesma foi listada.
Bom, quando você começar usar regras 'stateful' em grande escala, você
vai perceber o quanto a saída de um comando pra listar as regras do ipfw(8) vão
se tornar perturbadoras, devido ao enorme número de regras dinâmicas criadas. O
ipfw(8) lista todas as regras dinâmicas, mesmo que já descarregadas pra
oferecer controle total do firewall ao administrador, contudo nem sempre você
quer analisar as regras dinâmicas, e apenas as estáticas, já que são essas que
criam as dinâmicas. Nesse caso uma solução óbvia do mundo Unix seria:
OU
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Por exemplo, se nós quisermos restringir 20% dos pedidos de echo (echo
requests) do ICMP, poderíamos usar a seguinte regra:
add 1000 prob 0.8 allow icmp from any to any in icmptypes 8
Podemos também querer negar 50% dos pacotes TCP SYN pro servidor web,
dessa forma simulando um tráfego pesado na interface ep0. Faríamos da seguinte
forma:
add 1000 prob 0.5 allow tcp from any to any in setup via ep0
7.2. Dummynet;
options DUMMYNET
Depois de compilado o nosso kernel com mais essa opção (além das opções
típicas do ipfirewall(4)), o administrador do sistema vai poder especificar a
criação de túneis (chamados “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 irão trafegar por endereços
específicos de rede. A criação desses túneis é feita com o comando “pipe” do
ipfw(8). O tráfego é redirecionado à esses tuneis por meio do comando “pipe
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Note que, assim como nas regras de firewall, o “pipe” é apenas mais uma
ação pro ipfw(8), exatamente como “add” ou “delete”, portanto antes de cada
comando é feita uma chamada ao ipfw(8) (/sbin/ipfw pipe 10... por exemplo).
Esse túnel simples que criamos logo acima vai limitar o fluxo de
informações pra uma velocidade máxima de 100 Kilobits por segundo. Existem
várias maneiras distintas de indicarmos as medidas de velocidade de tráfego:
bit/s, Byte/s, Kbit/s, Kbyte/s, Mbit/s, Mbyte/s. Cada túnel de limitação de
banda deve usar a opção “bw” (de bandwidth – banda).
Uma outra maneira de controlar tráfego é usar a opção “delay” que força
um atraso na comunicação, simulando o que se conhece como “lag” do sistema:
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
eksffa@eeviac~#
... mas não vamos definir uma MTU menor pra device, com o ifconfig(8),
nem vamos diminuir o tamanho da fila (queue), que seria nossa melhor opção. A
fila pros pacotes então seria 1500 bytes (12000 bits) x 50, ou seja, 600Kbits
de fila. Pra um túnel que esta limitando a banda à 56Kbit por segundo, levaria
aproximadamente 10.7 segundos pra uma fila de 600Kbit ser preenchida. Esse é um
atraso inaceitável pra por o tráfego em andamento. Pra evitar esse tipo de
problema é recomendável ajustar manualmente o tamanho das filas (queue), em
'slots' que é mais fácil pra uma comparação com o padrão (que sabemos ser 50)
ou em ®Kbits” que é uma melhor atribuição à quantidade de dados. A segunda
opção é a melhor, porque além de ser um valor mais compreensível, o uso de
'slots' requer que o administrador também defina o valor pra MTU da interface,
utilizando o ifconfig(8), já que esse valor equivale à variável de
multiplicação no tamanho da queue (fila). Lembre-se, quanto menor a banda
disponível, menor deve ser a fila. No nosso exemplo acima, uma configuração
rasoável pra fila seria:
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
Por exemplo, vamos assumir a mesma idéia anterior de uma rede atrás de
um firewall onde cada estação deve ter uma banda de 100Kbit/s. Se nós
simplesmente direcionarmos todo o tráfego pra um túnel, o valor do tráfego será
a somatória de todas as estações, e não valores individuais. Pra utilizar
máscaras pras estações às quais o tráfego deve ser separado por filas
específicas, dessa maneira limitando a banda de forma separada, faremos o
seguinte:
Existem dois motivos pra termos túneis pra entrada e pra saída do
tráfego, mas uma delas nós vamos discutir posteriormente. A primeira questão
que deve nos prender atenção no momento é que cada túnel define uma máscara
diferente. O túnel 10 define a máscara 0x000000ff pros endereços de origem,
simplesmente porque a regra 1000 direciona todo o tráfego que sai (out) pela
rede interna, ou seja a máscara *deve* fazer menção ao endereço de origem,
porque cada origem faz diferença quando queremos filas distintas pra cada
estação que origina o fluxo. Da mesma forma o tráfego que está chegando (in)
deve ser separado em filas (queue) disntas de acordo com cada endereço de
destino.
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
que os bits iniciais são os bits altos, ou seja, os bits imutáveis da subrede.
Aqui nós definimos os bits altos como os últimos bits da máscara, porque cada
túnel roteia os dados de trás pra frente em relação à rede. O valor em
hexadecimal que nós especificamos corresponde à mascara decimal 0.0.0.255. Bem
simples portanto: o último octeto indica que apenas uma estação será atribuída
por fila (256 menos 255 = 1). Dessa forma é atribuida uma fila específica por
controle de banda pra cada endereço de estação com número distinto (no seu
último octeto). É claro que estamos supondo aqui que a rede em questão não
deverá ter mais que 254 estações, mas caso existam, a máscara deverá ser
redefinida. Então se você quer definir 254^2 estações na rede que o firewall
vai estar controlando, aí a máscara teria que ser 0.0.255.255 (0000ffff). Isso
define que qualquer endereço com um único bit diferente entre os dois últimos
octetos (ou seja os 16 últimos bits baixos) deverá ter sua própria fila de
pacotes.
net.inet.ip.fw.one_pass: 1
Vamos lembrar que as regras que não especificam se o pacote deve ser
examinado na entrada ou saída pelo firewall (usando as opções “in” e “out”),
serão sempre verificadas pro tráfego de entrada *E* de saída. Isso implica em
algumas consequências. Quando uma regra redireciona o tráfego pra um túnel sem
usar “in” ou “out”, a regra será duplicada, um túnel pros pacotes que saem e um
pros que entram. Outra coisinha, quando as regras não são definidas por
interface (usando “via”) todas as regras são aplicadas à todas as interfaces,
mesmo se definidos entrada e saída (“in”, ”out”), simplesmente porque, imagine
seu gateway com múltiplas interfaces de rede, uma pra rede verdadeira
(Internet) e duas pra redes internas. Todo tráfego definido como “in” é o que
entra pelas interfaces pra máquina firewall, ou seja, se vem da internet pro
gateway, ENTRA pelo firewall; Se vem das redes locais pro gateway, ENTRA pelo
firewall. Uma breve ilustração:
_________
|
|
REDE INTERNA <== (OUT) | | (IN) <== INTERNET
REDE INTERNA ==> (IN) | | (OUT) ==> INTERNET
| ________ |
firewall
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
add 1000 deny icmp from any to 12.18.123.0/24 in via xl0 icmptypes 8
add 1010 check-state
add 1020 allow icmp from 12.18.123.0/24 to any out via xl0 icmptypes 8
keep-state
add 1030 deny icmp from any to any
add 1000 deny icmp from any to 12.18.123.0/24 in via xl0 icmptypes 8
add 1010 allow icmp from 12.18.123.0/24 to any out via xl0 icmptypes 8
add 1020 allow icmp from any to 12.18.123.0/24 in via xl0 icmtypes 0
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.
IPFWHOWTO
R)
http://www.freebsdbrasil.com.br
Reprodução integral ou parcial permitida desde que as fontes originais sejam mencionadas.