[Precedente: Reindirizzamento (Port Forwarding)] [Indice] [Successivo: Opzioni Runtime]
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.
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
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.
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.
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]