[OpenBSD]

[Anterior: Opções em Tempo de Execução] [Conteúdo] [Próximo: Enfileiramento de Pacotes e Priorização]

PF: Âncoras


Conteúdo


Introdução

Além do conjunto de regras principal, o PF pode ainda avaliar subconjuntos de regras. Subconjuntos podem ser manipulados em tempo real através do uso do pfctl(8), provendo um modo conveniente de alterar um conjunto de regras ativo de forma dinâmica. Assim como as tabelas são usadas para guardar listas dinâmicas de endereços. Um subconjunto de regras é incorporado ao conjunto de regras principais com a utilização de um anchor.

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

Âncoras

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

Por exemplo:

ext_if = "fxp0"

block on $ext_if
pass  out on $ext_if
anchor goodguys

Esse conjunto de regras define uma política "negar por padrão" na interface fxp0 para o tráfego que entra e sai. O tráfego de saída é aceito e uma regra de âncora é criada com o nome goodguys. Âncoras podem ter suas regras populadas três maneiras:

A regra load instrui o pfctl a inserir na âncora especificada as regras lidas 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 -

As regras podem ser salvas e carregadas a partir de arquivos de 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 de regras principal, coloque as regras de âncora em um bloco delimitado por chaves:

anchor "goodguys" {
   pass in proto tcp from 192.168.2.3 to port 22
}

Âncoras na linha 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 na linha, o nome da âncora torna-se 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 de regras principal) e é usada dentro da âncora.

Regras podem ser carregadas na âncora usando a mesma sintaxe e opções que regras carregadas no conjunto de regras principais. Um problema, no entanto, é que, a não ser que você esteja usando âncoras na linha, quaisquer macros usadas também devem estar definidas dentro da âncora; macros definidas no conjunto de regras 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/*"

Essa sintaxe faz com que cada regra dentro de cada âncora vinculada à âncora spam seja avaliada. As âncoras filho são avaliadas em ordem alfabética, mas não são recursivas. Âncoras sempre são avaliadas em relação à âncora em que estão definidas.

Cada âncora, bem como o conjunto de regras principal, existe separadamente dos outros conjuntos de regras. Operações executadas em um conjunto de regras, como a liberação de regras, não afetam regras em outros conjuntos de regras. Além disso, remover um ponto de ancoramento do conjunto de regras principal não causa a destruição da âncora ou qualquer âncora filha vinculada a ela. Uma âncora não é destruída até que todas as suas regras sejam liberadas usando o pfctl(8) e que não existam âncoras filha dentro da âncora.

Opções de Âncoras

Regras anchor podem opcionalmente especificar interface, protocolo, endereço de origem e destino, etiqueta, etc., usando a mesma sintaxe das outras regras. Quando tais informações são dadas, regras anchor somente são processadas se o pacote corresponder à definição da regra anchor. Por exemplo:
ext_if = "fxp0"

block on $ext_if
pass  out on $ext_if
anchor ssh in on $ext_if proto tcp port 22

As regras na âncora ssh somente são avaliadas em pacotes TCP com destino a porta 22, vindos da interface fxp0. As regras são então adicionadas à âncora (anchor) da seguinte forma:

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

Portanto, mesmo que a regra de filtragem não especifique uma interface, protocolo ou porta, a máquina 192.0.2.10 só pode se conectar via SSH por causa da definição na regra anchor.

A mesma sintaxe pode ser aplicada em âncoras na linha.

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
   }
}

Manipulação de Âncoras

A manipulação de âncoras é feita via pfctl. Ele pode ser usado para adicionar ou remover regras em uma âncora sem precisar recarregar o conjunto de regras principal.

Para listar todas as regras na âncora nomeada ssh:

# pfctl -a ssh -s rules

Para liberar todas as regras da mesma âncora:

# pfctl -a ssh -F rules

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

[Anterior: Opções em Tempo de Execução] [Conteúdo] [Próximo: Enfileiramento de Pacotes e Priorização]


[voltar] www@openbsd.org
$OpenBSD: anchors.html,v 1.17 2013/01/13 15:45:16 ajacoutot Exp $