[OpenBSD]

[Vorige: Verkeersomleiding (Port Forwarding)] [Inhoud] [Volgende: Runtime Opties]

PF: Afkortingen om Regelsets aan te maken


Inhoudsopgave


Inleiding

PF biedt vele manieren waarop een regelset kan vereenvoudigd worden. Enkele goede voorbeelden zijn door gebruik te maken van macro's en lijsten. Bovendien biedt de regelset-taal, of grammatica, ook enkele afkortingen om een regelset eenvoudiger te maken. Als algemene vuistregel geldt: hoe eenvoudiger een regelset is, hoe gemakkelijker hij te begrijpen en te onderhouden is.

Macro's Gebruiken

Macro's zijn nuttig omdat ze een alternatief bieden voor het hard coderen van adressen, poortnummers, interfacenamen, enz. in een regelset. Is er een IP adres van een server veranderd? Geen probleem, pas gewoon de macro aan; niet nodig om te knoeien aan de filterregels, waaraan u zoveel tijd en energie hebt besteed om ze perfect op uw noden af te stemmen.

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.

Lijsten Gebruiken

Laten we een goede set van regels bekijken om in uw regelset te hebben om RFC 1918 adressen te behandelen die gewoon niet op het Internet zouden mogen rondzweven, en wanneer ze dat toch doen, gewoonlijk problemen proberen te veroorzaken:
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

PF Grammatica

Packet Filter's grammatica is erg flexibel, wat op zijn beurt enorme flexibiliteit toelaat in een regelset. PF kan bepaalde sleutelwoorden afleiden, wat betekent dat ze niet expliciet vermeld moeten worden in een regel, en de volgorde van de sleutelwoorden wordt versoepeld zodat het niet noodzakelijk is om stricte syntaxis te memoriseren.

Eliminatie van Sleutelwoorden

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.

Return Vereenvoudiging

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.

Volgorde van Sleutelwoorden

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]


[terug] www@openbsd.org
$OpenBSD: shortcuts.html,v 1.9 2007/11/19 10:43:15 tobias Exp $