[Anterior: Opções em Tempo de Execução] [Conteúdo] [Próximo: Enfileiramento de Pacotes e Priorização]
Â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.
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 }"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.
anchor "goodguys" {
anchor {
pass in proto tcp from 192.0.2.3 to port 80
}
pass in proto tcp from $allow to port 22
}
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.
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
}
}
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]