[Vorige: Verkeersomleiding (Port Forwarding)] [Inhoud] [Volgende: Runtime Opties]
Een veel voorkomende conventie in PF regelsets is om voor elke netwerkinterface een macro te definiëren. Als een netwerkkaart ooit moet vervangen worden door één die een verschillende driver gebruikt, bijvoorbeeld een 3Com vervangen door een Intel, dan kan de macro bijgewerkt worden en de filterregels zullen nog steeds werken zoals voorheen. Een ander voordeel ontstaat bij de installatie van dezelfde regelset op meerdere machines. Bepaalde machines kunnen verschillende netwerkkaarten hebben, en macro's gebruiken om de netwerkinterfaces te definiëren laat toe dat de regelsets geïnstalleerd worden met minimale aanpassing. Het wordt aanbevolen macro's te gebruiken om in regelsets informatie te definiëren die aan verandering onderhevig is, zoals poortnummers, IP adressen en interfacenamen.
# defineer macro's voor elke netwerkinterface
IntIF = "dc0"
ExtIF = "fxp0"
DmzIF = "fxp1"
Een andere veel voorkomende conventie is macro's gebruiken om IP adressen en netwerkblokken te definiëren. Dit kan het onderhoud van een regelset aanzienlijk verminderen wanneer er IP adressen veranderen.
# definieer onze netwerken
IntNet = "192.168.0.0/24"
ExtAdd = "24.65.13.4"
DmzNet = "10.0.0.0/24"
Als het interne netwerk ooit uitgebreid wordt of hernummerd wordt in een verschillend IP blok, dan kan de macro bijgewerkt worden:
IntNet = "{ 192.168.0.0/24, 192.168.1.0/24 }"
Zodra de regelset opnieuw wordt geladen, zal alles werken zoals voorheen.
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
Bekijk nu de volgende vereenvoudiging:
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 }
De regelset werdt herleid van acht lijnen naar twee. De dingen worden zelfs nog beter wanneer macro's samen met een lijst gebruikt worden:
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
Merk op dat macro's en lijsten het pf.conf bestand vereenvoudigen, maar de lijnen worden in werkelijkheid door pfctl(8) ontvouwen in meerdere regels. Dus, het bovenstaande voorbeeld ontvouwt eigenlijk tot de volgende regels:
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
Zoals u kan zien is de PF ontvouwing uitsluitend een gemak voor de schrijver en onderhouder van het pf.conf bestand, en geen werkelijke vereenvoudiging van de regels verwerkt door pf(4).
Macro's kunnen gebruikt worden om meer dan alleen adressen en poorten te definiëren; ze kunnen gelijk waar in een PF regels bestand gebruikt worden:
pre = "pass in quick on ep0 inet proto tcp from "
post = "to any port { 80, 6667 } keep state"
# David's classroom
$pre 21.14.24.80 $post
# Nick's home
$pre 24.2.74.79 $post
$pre 24.2.74.178 $post
Ontvouwt tot:
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
Om een "default deny" beleid te definiëren, worden twee regels gebruikt:
block in all
block out all
Dit kan nu gereduceerd worden tot:
block all
Wanneer er geen richting wordt opgegeven, zal PF veronderstellen dat de regel van toepassing is op pakketten die in beide richtingen bewegen.
Gelijkaardig kunnen de "from any to any" en "all" zinssneden uit een regel gelaten worden, bijvoorbeeld:
block in on rl0 all
pass in quick log on rl0 proto tcp from any to any port 22 keep state
kan vereenvoudigd worden tot:
block in on rl0
pass in quick log on rl0 proto tcp to port 22 keep state
De eerste regel blokkeert alle binnenkomende pakketten van gelijk waar naar gelijk waar op rl0, en de tweede regel laat TCP verkeer binnen op rl0 naar poort 22.
Een regelset die gebruikt wordt om pakketten te blokkeren en te antwoorden met een TCP RST of ICMP Unreachable antwoord, zou er als volgt kunnen uitzien:
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
Dit kan vereenvoudigd worden tot:
block return
Wanneer PF het return sleutelwoord ziet, is het slim genoeg om het gepaste antwoord te sturen, of helemaal geen antwoord, afhankelijk van het protocol van het pakket dat geblokkeerd wordt.
De volgorde waarin sleutelwoorden gespecificeerd worden, is in de meeste gevallen flexibel. Bijvoorbeeld, een regel geschreven als:
pass in log quick on rl0 proto tcp to port 22 \
flags S/SA keep state queue ssh label ssh
Kan ook geschreven worden als:
pass in quick log on rl0 proto tcp to port 22 \
queue ssh keep state label ssh flags S/SA
Andere, gelijkaardige variaties zullen ook werken.
[Vorige: Verkeersomleiding (Port Forwarding)] [Inhoud] [Volgende: Runtime Opties]