[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ões, 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 as tabelas são usadas para guardar listas dinâmicas de endereços, 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 com uma regra de filtragem que utilize a opção quick ou com 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 de saída é aceito e uma regra anchor é criada com nome goodguys. Regras podem ser inseridas na âncora de três maneiras:

load instrui o pfctl a inserir, na âncora especificada, as 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 o 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
Para carregar regras diretamente do conjunto principal, coloque as regras anchor em um bloco delimitado por parênteses:
anchor "goodguys" {
   pass in proto tcp from 192.168.2.3 to port 22
}

Regras anchor inline também podem conter mais âncoras.

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" {
   anchor {
      pass in proto tcp from 192.0.2.3 to port 80
   }
   pass in proto tcp from $allow to port 22
}
Com âncoras inline, o nome da âncora se torna opcional. Note que a âncora aninhada no exemplo acima não tem um nome. Também note que a macro $allow é criada fora da âncora (no conjunto principal) e é usada dentro da âncora.

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, a não ser que esteja usando âncoras inline, 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 ancoramento 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 anchor. 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.

A mesma sintaxe pode ser aplicada para âncoras inline.

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" in proto tcp {
   anchor proto tcp to port 80 {
      pass from 192.0.2.3
   }
   anchor proto tcp to port 22 {
      pass from $allow
   }
}

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.12 2007/12/01 10:39:11 tobias Exp $