[OpenBSD]

[Precedente: Reindirizzamento (Port Forwarding)] [Indice] [Successivo: Opzioni Runtime]

PF: Ottimizzazione delle regole di configurazione


Indice


Introductione

PF offre molte opportunità per semplificare le regole di configurazione. Qualche esempio è dato dall'uso di macro e liste. Inoltre, il linguaggio e la grammatica delle regole di configurazione offrono qualche possibilità per semplificarle ulteriormente. Come premessa generale, tanto più semplice è la regola e tanto più facile è capirla e aggiornarla.

Utilizzare le Macro

Le Macro sono utili perchè forniscono nelle regole di configurazione un'alternativa all'hard-coding di indirizzi, numeri di porte, nomi di interfaccie ecc. E' cambiato un indirizzo IP di un server? Nessun problema, c'è da aggiornare solo la marco; non c'è bisogno di far confusione tra le regole di configurazione per le quali si è speso tempo ed energia nell'adattarle ai propri bisogni.

Una convenzione comune nelle regole di configurazione di PF è di definire una macro per ogni interfaccia di rete. Se una scheda di rete dovesse essere sostituita con un driver differente, per esempio lo scambio tra una 3Com e una Intel, la macro può essere aggiornata e le regole del filtro funzioneranno come prima. Un altro beneficio si ha quando si installano le stesse regole di configurazione su diversi computer. Alcuni pc possono avere schede di rete differenti e usare le macro per definire le interfaccie di rete consente alle regole di configurazione di essere installate con minimi cambiamenti. Usare macro nelle regole di configurazione per definire informazioni soggette a cambiamento come numero di porta, indirizzo IP e nome dell'interfaccia è una pratica raccomandata.

# definizione delle macro per ogni interfaccia di rete
IntIF = "dc0"
ExtIF = "fxp0"
DmzIF = "fxp1"

Un'altra convenzione comune è usare macro per definire indirizzi IP e subnet. Questo riduce in modo drastico il tempo di aggiornamento delle regole di configurazione quando cambiano gli indirizzi IP.

# define our networks
IntNet = "192.168.0.0/24"
ExtAdd = "24.65.13.4"
DmzNet = "10.0.0.0/24"

Se la rete locale dovesse espandersi o fosse divisa in differenti blocchi IP, la macro potrebbe essere aggiornata:

IntNet = "{ 192.168.0.0/24, 192.168.1.0/24 }"

Una volta che le regole di configurazione saranno caricate ogni cosa funzionerà come prima.

Usare le Liste

Diamo un'occhiata a un buon set di regole per gestire nelle vostre regole di configurazione gli indirizzi dell' RFC 1918 che per evitare problemi non dovrebbero mai circolare in Internet:
block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 127.0.0.0/8
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 10.0.0.0/8

Diamo un'occhiata alla seguente semplificazione:

block in  quick on tl0 inet from { 127.0.0.0/8, 192.168.0.0/16, \
   172.16.0.0/12, 10.0.0.0/8 } to any
block out quick on tl0 inet from any to { 127.0.0.0/8, \
   192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }

Le regole di configurazione sono state ridotte da otto a due. Un'ulteriore miglioramento si ha quando le macro vengono usate insieme alle liste:

NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
   10.0.0.0/8 }"
ExtIF = "tl0"
block in  quick on $ExtIF from $NoRouteIPs to any
block out quick on $ExtIF from any to $NoRouteIPs

Da notare che le macro e le liste semplificano il file pf.conf ma attualmente le regole vengono comunque espanse da pfctl(8) in regole multiple. Così l'esempio precedente si espande nelle seguenti regole:

block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 10.0.0.0/8
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 127.0.0.0/8

Come si può vedere, l'espansione di PF è molto utile per chi scrive e aggiorna le regole del file pf.conf ma non è una semplificazione delle regole processate da pf(4).

Le macro possono essere usate per definire più che semplici indirizzi e porte; possono essere usate ovunque nelle regole di PF:

pre = "pass in quick on ep0 inet proto tcp from "
post = "to any port { 80, 6667 } keep state"

# La classe di David
$pre 21.14.24.80 $post

# Casa di Nick
$pre 24.2.74.79 $post
$pre 24.2.74.178 $post

Si espandono in:

pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 6667 keep state

Grammatica PF

La grammatica di Packet Filter è abbastanza flessibile da consentire grande elasticità nelle regole di configurazione. PF è in grado di desumere determinate keyword così da evitare necessariamente di esplicitarle, e anche l'ordine delle keyword non è vincolante evitando di dover memorizzare una rigida sintassi.

Eliminazione di Keyword

Per definire una policy "default deny" si usano due regole:

block in  all
block out all

Queste possono essere ridotte a:

block all

Quando non è specificata alcuna direzione, PF assume che le regole siano applicate ai pacchetti che transitano in entrambe le direzioni.

In modo simile sia "from any to any" che "all" possono essere tralasciate da una regola, per esempio:

block in on rl0 all
pass  in quick log on rl0 proto tcp from any to any port 22 keep state

possono semplificarsi in:

block in on rl0
pass  in quick log on rl0 proto tcp to port 22 keep state

La prima regola blocca tutti i pacchetti provenienti da ovunque a ovunque attraverso l'interfaccia r10, e la seconda regola consente il traffico TCP attraverso la porta 22 sull'interfaccia r10.

Semplificazione Return

Una regola di configurazione usata per bloccare pacchetti e risposte TCP RST o ICMP Unreachable appare così:

block in all
block return-rst in proto tcp all
block return-icmp in proto udp all
block out all
block return-rst out proto tcp all
block return-icmp out proto udp all

Queste possono essere semplificate con:

block return

Quando PF vede la keyword return, è in grado di capire se inviare la risposta appropriata o non rispondere affatto in funzione del protocollo bloccato.

Ordinare le Keyword

In molti casi l'ordine con il quale le keyword vengono specificate è flessibile. Per esempio, una regola scritta come:

pass in log quick on rl0 proto tcp to port 22 \
   flags S/SA keep state queue ssh label ssh

Può anche essere scritta come:

pass in quick log on rl0 proto tcp to port 22 \
   queue ssh keep state label ssh flags S/SA

Possono funzionare anche altre simili variazioni.

[Precedente: Reindirizzamento (Port Forwarding)] [Indice] [Successivo: Opzioni Runtime]


[back] www@openbsd.org
$OpenBSD: shortcuts.html,v 1.2 2008/03/20 15:57:35 saad Exp $