[Anterior: Listas e Macros]
[Conteúdo]
[Próximo: Filtragem de Pacotes]
PF: Tabelas
Conteúdo
Introdução
Uma tabela é usada para armazenar um grupo de endereços IPv4 e/ou IPv6.
Pesquisas em tabelas são muito rápidas e consumem menos memória e tempo de
processamento do que as listas.
Por essa razão, uma tabela é ideal para armazenar uma grande quantidade
de endereços, já que o tempo de pesquisa em uma tabela com
50.000 endereços é apenas ligeiramente maior do que em uma contendo
50 endereços. Tabelas podem ser usadas nos seguintes caminhos:
- endereço de origem e/ou destino em regras de filtragem.
- endereços de tradução e redirecionamento com regras de
nat-to e rdr-to, reespectivamente.
- endereço de destino em opções route-to, reply-to
e dup-to das regras de filtragem.
Tabelas são criadas no
pf.conf
ou utilizando o
pfctl(8).
Configuração
No pf.conf, tabelas são criadas usando a diretiva table.
Os atributos a seguir podem ser especificados para cada tabela:
- const - uma vez criada, o conteúdo da tabela não pode ser
alterado. Quando esse atributo não é especificado,
o pfctl(8) pode ser usado para adicionar ou remover endereços da
tabela a qualquer momento, mesmo quando o sistema estiver
em execução no nível de segurança
(securelevel(7))
dois ou maior.
- persist - faz com que o kernel mantenha a tabela na memória
mesmo quando nenhuma regra faz referência a ela. Sem esse atributo,
o kernel removerá automaticamente a tabela quando a última regra
referenciando-a for liberada.
Exemplo:
table <goodguys> { 192.0.2.0/24 }
table <rfc1918> const { 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8 }
table <spammers> persist
block in on fxp0 from { <rfc1918>, <spammers> } to any
pass in on fxp0 from <goodguys> to any
Endereços também podem ser especificados usando o modificador de negação
(ou "not") desta forma:
table <goodguys> { 192.0.2.0/24, !192.0.2.5 }
A tabela goodguys agora corresponde a todos os endereços na
rede 192.0.2.0/24, exceto 192.0.2.5.
Note que nomes de tabelas são sempre colocados entre < >.
Tabelas também podem ser populadas via arquivos de texto contendo uma
lista de endereços IP e redes:
table <spammers> persist file "/etc/spammers"
block in on fxp0 from <spammers> to any
O arquivo /etc/spammers deve conter uma lista de endereços IP
e/ou blocos de rede
CIDR,
um por linha.
Toda linha começando com # é tratada como um comentário e é
ignorada.
Manipulação com o pfctl
Tabelas podem ser manipuladas em tempo real usando o
pfctl(8).
Por exemplo, para adicionar entradas à tabela <spammers> criada
acima:
# pfctl -t spammers -T add 218.70.0.0/16
Caso a tabela <spammers> ainda não exista, ela será criada.
Para listar os endereços na tabela:
# pfctl -t spammers -T show
O argumento -v também pode ser usado com -Tshow
para mostrar as estatísticas de cada entrada da tabela. Para remover
endereços de uma tabela:
# pfctl -t spammers -T delete 218.70.0.0/16
Para mais informações sobre manipulação de tabelas com o pfctl,
por favor leia a página de manual
pfctl(8).
Especificação de Endereços
Além de especificar máquinas através de endereços IP, elas também podem
ser referenciadas pelo nome da máquina. Quando o nome da máquina é
resolvido para um endereço IP, todos os endereços IPv4 e IPv6
resultantes são inseridos na tabela. Endereços IP também podem ser
inseridos na tabela especificando-se um nome de interface válido ou a
palavra-chave self.
A tabela conterá então todos os endereços IP atribuídos àquela interface
ou à máquina, respectivamente (incluindo endereço de loopback).
Uma limitação ao especificar endereços é que 0.0.0.0/0 e
0/0 não funcionam em tabelas.
A alternativa é escrever esses endereços manualmente ou fazer uso de uma
macro.
Correspondência de Endereços
Uma pesquisa de endereço em uma tabela retorna a entrada que corresponda
mais precisamente ao endereço. Isso permite a criação de tabelas como:
table <goodguys> { 172.16.0.0/16, !172.16.1.0/24, 172.16.1.100 }
block in on dc0
pass in on dc0 from <goodguys>
Qualquer pacote chegando em dc0 terá seu endereço de origem
comparado aos endereços da tabela <goodguys>:
- 172.16.50.5 - o correspondente mais próximo é 172.16.0.0/16; o
pacote corresponde à tabela e será aceito
- 172.16.1.25 - a entrada mais próxima é !172.16.1.0/24; o pacote
corresponde a uma entrada na tabela, mas essa entrada está negada
(usa o modificador "!"); portanto o pacote não corresponde à tabela
e será bloqueado
- 172.16.1.100 - corresponde exatamente a 172.16.1.100; o pacote
corresponde à tabela e será aceito
- 10.1.4.55 - não corresponde a nenhuma entrada na tabela e, portanto,
será bloqueado
[Anterior: Listas e Macros]
[Conteúdo]
[Próximo: Filtragem de Pacotes]
www@openbsd.org
$OpenBSD: tables.html,v 1.17 2013/02/25 08:23:50 ajacoutot Exp $