[OpenBSD]

[Precedente: Scrub (Packet Normalization)] [Indice] [Successivo: Packet Queueing e Prioritization]

PF: Ancore


Indice


Introduzione

Oltre le regole principali PF può valutare ulteriori regole secondarie. Dato che queste regole secondarie possono essere modificate in tempo reale con pfctl(8), forniscono l'opportunità di alterare dinamicamente le regole di configurazione attive. Considerando che una tabella è usata per conservare una lista dinamica di indirizzi, un set di regole secondarie è usato per conservare un set dinamico di regole di filtraggio, nat, rdr, e binat.

Le regole secondarie sono collegate alle regole di configurazione principali usando ancore. Ci sono quattro tipi di anchor:

Le ancore possono essere annidate permettendo così alle regole secondarie di essere incatenate tra loro. Regole ancora saranno valutate in funzione dell'ancora dalla quale sono caricate. Per esempio regole ancora nel set di regole principali creano punti di attacco delle ancore al set di regole principali, regole ancora caricate da files con la direttiva load anchor creano punti di ancoraggio con quell'ancora che le ha generate.

Ancore

Un ancora è una collezione di regole di filtraggio e/o traslazione, tabelle ed altre ancore alle quali è stato assegnato un nome. Quando PF incontra una regola ancora nelle regole di configurazione principali valuterà le regole contenute nel punto di ancoraggio allo stesso modo di come valuta le regole principali. La valutazione di eventuali corrispondenze proseguirà nel set di regole principali a meno che il pacchetto non abbia una corrispondenza con una regola con l'opzione quick o una regola di traslazione all'interno dell'ancora nel qual caso la corrispondenza sarà considerata finale e termineranno le vautazioni delle regole sia nell'ancora che nel set di regole principali.

Per esempio:

ext_if = "fxp0"

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

Queste regole configurano la policy di default deny sulla fxp0 per il traffico dei pacchetti entranti e uscenti. Al traffico in uscita è applicata l'opzione keep state e viene creata un ancora di nome goodguys. Le ancore possono essere riempite di regole usando tre metodi:

La regola load consente a pfctl di riempire un ancora specificata leggendo le regole da un file di testo. La regola load deve essere preceduta dalla regola ancora. Esempio:

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

Per aggiungere regole a un ancora usando pfctl, può essere usato il seguente comando:

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

Le regole possono anche essere salvate e caricate da un file di testo:

# 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

Per caricare regole direttamente dalle regole principali, racchiudere le regole ancora tra parentesi graffe:

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

Le ancore in linea possono contenere ulteriori ancore.

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
}
Con le regole in linea il nome dell'ancora è opzionale. Da notare come l'ancora annidata dell'esempio precedente non abbia un nome. Inoltre c'è da notare come la macro $allow sia creata fuori dall'ancora (tra le regole principali) e sia usata nell'ancora.

Le regole di filtraggio e traslazione possono essere caricate in un ancora usando la stessa sintassi e le stesse opzioni delle regole caricate nel set di regole principali. Tuttavia c'è una differenza, le macros utilizzate nell'ancora devono essere definite all'interno dell'ancora; macro definite nel set di regole principali generatrici dell'ancora non sono visibili dalle regole dell'ancora.

Dato che le ancore possono essere annidate, è possibile specificare che tutte le ancore generate da una specifica ancora siano valutate:

anchor "spam/*"

Questa sintassi impone che ogni regola appartenente a ogni ancora legata all'ancora spam venga valutata. Le ancore figlie saranno valutate in ordine alfabetico ma non in modo ricorsivo discendente. Le regole ancora sono sempre valutate in modo relativo rispetto all'ancora dalla quale sono definite.

Ogni ancora, come le regole di configurazione principali, esiste indipendentemente dalle altre regole. Le operazioni eseguite su un set di regole, come il cancellare le regole, non hanno alcun effetto sulle altre regole. Inoltre, rimuovere un punto di ancoraggio dal set di regole principali non cancella ne l'ancora ne eventuali ancore figlie legate all'ancora. L'ancora è intatta fin quando non viene ripulita di tutte le regole e dalle eventuali ancore figlie usando pfctl(8).

Opzioni ancora

Le regole ancora possono specificare con la stessa sintassi delle altre regole di filtraggio, interfaccia, protocollo, indirizzo sorgente e destinazione, tag ecc. Quando vengono date queste informazioni, le regole ancora sono processate solo se il pacchetto ha corrispondenza con la definizione della regola ancora. Per esempio:
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

Le regole nell'ancora ssh sono valutate solo per pacchetti TCP in ingresso alla scheda fxp0 e destinati alla porta 22. Le regole possono essere aggiunte all'ancora nel seguente modo:

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

Così anche se la regola del filtro non specifica interfaccia, protocollo o porta, per la definizione della regola ancora l'host 192.0.2.10 potrà effettuare solo una connessione SSH.

La stessa sintassi può essere applicata alle ancore in linea.

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

Modifica delle ancore

La modifica delle ancore è ottenuta con pfctl. Può essere usata per aggiungere o togliere delle regole all'ancora senza dover ricaricare le regole di configurazione principali.

Per vedere la lista delle regole nell'ancora ssh:

# pfctl -a ssh -s rules

Per ripulire tutte le regole da una stessa ancora:

# pfctl -a ssh -F rules

Per l'intera lista di comandi, vedere pfctl(8).

[Precedente: Scrub (Packet Normalization)] [Indice] [Successivo: Packet Queueing e Prioritization]


[back] www@openbsd.org
$OpenBSD: anchors.html,v 1.3 2008/02/22 10:12:26 tobias Exp $