[Vorige: Adrespools en Load Balancing]
[Inhoud]
[Volgende: Loggen]
PF: Pakketmarkering (Policy Filtering)
Inhoudsopgave
Inleiding
Pakketmarkering is een manier om pakketten met een interne identifier te
markeren die later kan gebruikt worden in filter- en veralingsregel criteria.
Met markering is het mogelijk om dingen te doen zoals het aanmaken van
"trusts" tussen interfaces en bepalen of pakketten verwerkt zijn door
vertalingsregels.
Het is ook mogelijk om regel-gebaseerd filteren te verlaten en te beginnen
met beleid-gebaseerd filteren.
Markeringen Toekennen aan Pakketten
Om een markering aan een pakket toe te voegen, gebruikt u het tag
sleutelwoord:
pass in on $int_if all tag INTERNAL_NET keep state
De markering INTERNAL_NET zal toegevoegd worden aan gelijk welk
pakket dat overeenstemt met de bovenstaande regel.
Een markering kan ook toegekend worden door gebruik van een
macro.
Bijvoorbeeld:
name = "INTERNAL_NET"
pass in on $int_if all tag $name
Er zijn een stel van voorgedefinieerde macro's die ook kunnen gebruikt worden.
- $if - De interface
- $srcaddr - Bron-IP adres
- $dstaddr - Bestemmings-IP adres
- $srcport - De bronpoort specificatie
- $dstport - De bestemmingspoort specificatie
- $proto - Het protocol
- $nr - Het regelnummer
Deze macro's worden ontvouwen bij het laden van de regelset en NIET in
runtime.
Markering volgt deze regels:
- Markeringen zijn "sticky". Zodra een markering aangebracht wordt op een
pakket door een overeenstemmende regel, wordt deze nooit meer verwijderd.
Ze kan echter vervangen worden door een verschillende markering.
- Omwille van de "stickiness" van een markering kan een pakket een
markering hebben zelfs al gebruikt de laatste overeenstemmende regel het
tag sleutelwoord niet.
- Op een pakket wordt slechts een maximum van één markering per keer
aangebracht.
- Markeringen zijn interne identifiers. Markeringen worden niet
over de draad verzonden.
- De namen van markeringen kunnen tot 63 tekens lang zijn.
In OpenBSD 4.0 en ouder zijn deze namen beperkt tot 15 tekens.
Neem de volgende regelset als voorbeeld.
(1) pass in on $int_if tag INT_NET
(2) pass in quick on $int_if proto tcp to port 80 tag INT_NET_HTTP
(3) pass in quick on $int_if from 192.168.1.5
- Pakketten die binnenkomen op $int_if zal een markering van
INT_NET gegeven worden door regel #1.
- TCP pakketten die binnenkomen op $int_if en bestemd zijn voor
poort 80 zal eerst een markering van INT_NET gegeven worden door
regel #1. Die markering zal vervolgens vervangen worden door de
INT_NET_HTTP markering door regel #2.
- Pakketten die binnenkomen op $int_if vanaf 192.168.1.5 zullen
op één van twee mogelijke manieren gemarkeerd worden.
Als het pakket bestemd is voor TCP poort 80, zal het overeenstemmen met
regel #2 en gemarkeerd worden met INT_NET_HTTP.
Anders zal het pakket overeenstemmen met regel #3, maar gemarkeerd worden met
INT_NET.
Omdat het pakket overeenstemt met regel #1, wordt de INT_NET
markering toegepast en die wordt niet verwijderd tenzij een volgende
overeenstemmende regel een markering specificeert
(dit is de "stickiness" van een markering).
Zoeken naar Aangebrachte Markeringen
Om te zoeken naar voorheen aangebrachte markeringen, gebruikt u het
tagged sleutelwoord:
pass out on $ext_if tagged INT_NET
Buitengaande pakketten op $ext_if moeten gemarkeerd zijn met de
INT_NET markering om overeen te stemmen met de bovenstaande regel.
Inverse overeenstemming kan ook gedaan worden door de ! operator
te gebruiken:
pass out on $ext_if ! tagged WIFI_NET
Beleid Filtering
Beleid filtering neemt een andere aanpak om een filterregelset te schrijven.
Een beleid wordt gedefinieerd dat de regels opstelt voor welke types van
verkeer doorgelaten worden en welke types geblokkeerd worden.
Pakketten worden vervolgens ingedeeld in het beleid op basis van de
traditionele criteria van bron/bestemmings-IP adres/poort, protocol, enz.
Onderzoek bijvoorbeeld het volgende firewall beleid:
- Verkeer vanaf de interne LAN naar het Internet is toegelaten
(LAN_INET) en moet vertaald worden (LAN_INET_NAT)
- Verkeer vanaf de interne LAN naar de DMZ is toegelaten (LAN_DMZ)
- Verkeer vanaf het Internet naar servers in de DMZ is toegelaten
(INET_DMZ)
- Verkeer vanaf het Internet dat omgeleid wordt naar
spamd(8) is toegelaten (SPAMD)
- Alle ander verkeer wordt geblokkeerd
Merk op hoe het beleid alle verkeer omvat dat doorheen de firewall
zal passeren.
Het item tussen haakjes duidt de markering aan die gebruikt zal worden
voor dat beleidsitem.
Regels moeten nu geschreven worden om pakketten in het beleid in te delen.
block all
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ
pass in on $ext_if proto tcp from <spamd> to port smtp \
tag SPAMD rdr-to 127.0.0.1 port 8025
Nu worden de regels die het beleid definiëren, ingesteld.
pass in quick on $ext_if tagged SPAMD
pass out quick on $ext_if tagged LAN_INET_NAT
pass out quick on $dmz_if tagged LAN_DMZ
pass out quick on $dmz_if tagged INET_DMZ
Nu de gehele regelset opgesteld is, zijn veranderingen een kwestie van
de indelingsregels te wijzigen.
Als er bijvoorbeeld een POP3/SMTP server wordt toegevoegd aan de DMZ,
zal het nodig zijn om indelingsregels voor POP3 en SMTP verkeer toe te
voegen, zoals:
mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ
Email verkeer zal nu doorgelaten worden als onderdeel van het INET_DMZ
beleidsitem.
De volledige regelset:
# macro's
int_if = "dc0"
dmz_if = "dc1"
ext_if = "ep0"
int_net = "10.0.0.0/24"
dmz_net = "192.168.0.0/24"
www_server = "192.168.0.5"
mail_server = "192.168.0.10"
table <spamd> persist file "/etc/spammers"
# indeling -- deel pakketten in op basis van het gedefinieerde firewall
# beleid.
block all
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ
pass in on $ext_if proto tcp from <spamd> to port smtp \
tag SPAMD rdr-to 127.0.0.1 port 8025
# beleid afdwingen -- pass/block gebaseerd op het gedefinieerde firewall
# beleid.
pass in quick on $ext_if tagged SPAMD
pass out quick on $ext_if tagged LAN_INET_NAT
pass out quick on $dmz_if tagged LAN_DMZ
pass out quick on $dmz_if tagged INET_DMZ
|
Ethernet Frames Markeren
Markering kan uitgevoerd worden op het Ethernet-niveau indien de machine
die markering/filtering doet ook fungeert als een
bridge(4).
Door bridge(4) filterregels te creëren die het tag sleutelwoord
gebruiken, kan men PF laten filteren op basis van bron- of
bestemmings-MAC adres.
Bridge(4) regels worden aangemaakt met het
ifconfig(8) commando. Voorbeeld:
# ifconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
tag USER1
En vervolgens in pf.conf:
pass in on fxp0 tagged USER1
[Vorige: Adrespools en Load Balancing]
[Inhoud]
[Volgende: Loggen]
www@openbsd.org
$OpenBSD: tagging.html,v 1.17 2011/01/29 15:46:37 ajacoutot Exp $