[OpenBSD]

[Anterior: Scrub (Normalização de Pacotes)] [Conteúdo] [Próximo: Fila de Pacotes e Priorização]

PF: Âncoras


Conteúdo


Introdução

Além das regras padrão, o PF pode ainda avaliar subconjuntos de regras. Subconjuntos podem ser manipudados em tempo real através do uso do pfctl(8), provendo um modo conveniente de alterar um conjunto de regras de forma dinâmica. Assim como tabelas são udadas para guardar listas dinâmicas de endereço, um subconjunto de regras é usado para guardar conjuntos dinâmicos de regras de filtragem nat, rdr e binat.

Subconjuntos de regras são vinculados ao conjunto principal utilizando-se de âncoras. Existem quatro tipos de regras anchor:

Âncoras podem ser aninhadas o que permite ao subconjunto de regras ser encadeado junto. Regras anchor serão avaliadas de forma relativa à âncora que as carregou. Por exemplo, regras anchor no conjunto de regras principal criarão pontos de referência tendo o conjunto de regras principal como pai, e regras anchor carregadas de arquivos chamados através da diretiva load anchor criarão pontos de ancoramento tendo esta âncora como pai.

Âncoras

Uma âncora é uma coleção de regras de filtragem e/ou tradução, tabelas, e outras âncoras que possuam nomes definidos. Quando o PF encontra uma regra anchor no arquivo principal, ele avalia as regras contidas no ponto de ancoramento como se estivesse avaliando regras no arquivo principal. O processamento então continuará no conjunto principal a não ser que o pacote case uma regra de filtragem que utilize a opção quick ou uma regra de tradução na âncora, que nesse caso será a última regra para o pacote, abortando a avaliação das demais regras tanto no arquivo principal quanto na âncora.

Por exemplo:

ext_if = "fxp0"

block on $ext_if all
pass  out on $ext_if all keep state
anchor goodguys

Estas regras definem uma política "negar por padrão" na interface fxp0 para tráfego entrando e saindo. O tráfego é então aceito e uma regra anchor é criada com nome goodguys. Regras podem ser inseridas na âncora de duas maneiras:

load instrui pfctl a inserir na âncora especificada regras carregadas de um arquivo texto. A regra load deve ser colocada depois da regra anchor. Exemplo:

anchor goodguys
load anchor goodguys:ssh from "/etc/anchor-goodguys-ssh"

Para adicionar regras a uma âncora usando pfctl, o seguinte tipo de comando pode ser usado:

# echo "pass in proto tcp from 192.0.2.3 to any port 22" \
   | pfctl -a goodguys -f -

Regras podem ser salvas e carregadas de arquivos texto:

# cat >> /etc/anchor-goodguys-www
pass in proto tcp from 192.0.2.3 to any port 80
pass in proto tcp from 192.0.2.4 to any port { 80 443 }

# pfctl -a goodguys -f /etc/anchor-goodguys-www

Regras de filtragem e tradução podem ser carregadas no conjunto principal usando-se a mesma sintaxe e opções que as regras do arquivo principal. Uma diferença porém, é que as macros usadas também devem estar definidas na âncora, macros definidas no arquivo pai não são visíveis na âncora.

Uma vez que âncoras podem ser aninhadas, é possível especificar que todas as âncoras filho dentro de uma âncora especificada sejam avaliadas:

anchor "spam/*"

Esta sintaxe faz com que cada regra dentro de cada âncora anexada a âncora spam seja avaliada. As âncoras filho serão avaliadas em ordem alfabética mas não são recursivas. Âncoras são avaliadas sempre relativamente a âncora em que estão definidas.

Cada âncora, bem como o arquivo principal, existem separados dos outros subconjuntos de regras. Operações executadas num grupo de regras, como remover as regras, não afetam regras agrupadas em outros subconjuntos. Além disso, remover um ponto de âncoramento do conjunto principal de regras não causa destruição da âncora ou qualquer âncora filho vìnculado a ela. Uma âncora não é destruída até que seja removida usando pfctl(8) e que não tenha âncoras filho dentro da âncora.

Opções de Âncoras

Regras anchor podem opcionalmente especificar interface, protocolo, endereço de origem e destino, marcações, etc., usando a mesma sintaxe das regras de filtragem. Quando estas opções forem usadas, regras anchor somente são processadas caso o pacote case com a definição da regra. Por exemplo:
ext_if = "fxp0"

block on $ext_if all
pass  out on $ext_if all keep state
anchor ssh in on $ext_if proto tcp from any to any port 22

Regras na âncora ssh somente são avaliadas para pacotes TCP com destino a porta 22 vindos da interface fxp0. Regras são então adicionadas à anchor assim:

# echo "pass in from 192.0.2.10 to any" | pfctl -a ssh -f -

Portando, mesmo que a regra de filtragem não especifique interface, protocolo ou porta, o host 192.0.2.10 só poderá se conectar com SSH por causa da definição na regra anchor.

Manipulando Âncoras

A manipulaçao de âncoras é feita via pfctl. Ele pode ser usado para adicionar ou remover regras numa âncora sem precisar recarregar o arquivo principal.

Para listar todas regras na âncora nomeada ssh:

# pfctl -a ssh -s rules

Para remover todas regras de filtragem da mesma âncora:

# pfctl -a ssh -F rules

Para uma listagem completa de comandos, por favor consulte pfctl(8).

[Anterior: Scrub (Normalização de Pacotes)] [Conteúdo] [Próximo: Fila de Pacotes e Priorização]


[voltar] www@openbsd.org
$OpenBSD: anchors.html,v 1.5 2005/12/24 10:04:36 saad Exp $