[Vorige: Firewall Redundantie met CARP en pfsync] [Inhoud]
[ COMP1 ] [ COMP3 ]
| |
---+------+-----+------- xl0 [ OpenBSD ] fxp0 -------- ( Internet )
|
[ COMP2 ]
Er zijn een aantal computers in het interne netwerk; het diagramma toont er drie maar het werkelijke aantal is irrelevant. Deze computers zijn gewone werkstations die gebruikt worden voor web surfen, e-mail, chatten, enz., behalve COMP3 die ook een kleine webserver draait. Het interne netwerk gebruikt het 192.168.0.0 / 255.255.255.0 netwerkblok.
De OpenBSD firewall is een Celeron 300 met twee netwerkkaarten: een 3com 3c509B (xl0) en een Intel EtherExpress Pro/100 (fxp0). De firewall heeft een kabelverbinding naar het Internet en gebruikt NAT om deze verbinding te delen met het interne netwerk. Het IP adres op de externe interface wordt dynamisch toegekend door de Internet Service Provider.
int_if="xl0"
tcp_services="{ 22, 113 }"
icmp_types="echoreq"
comp3="192.168.0.3"
De eerste regel definiëert de interne netwerkinterface waarop filtering zal gebeuren. Door deze hier te definiëren, kunnen we als we dit systeem moeten verplaatsen naar een systeem met andere hardware, alleen die regel veranderen en zal de rest van de regelset nog steeds bruikbaar zijn. (In dit voorbeeld zal de externe interface worden behandeld door de egress interface groep. Deze wordt automatisch ingesteld op iedere interface die een default route heeft, in dit geval fxp0.) De tweede en derde regel sommen de TCP poortnummers op van de diensten die geopend zullen worden voor het Internet (SSH en ident/auth) en de ICMP pakket-types die zullen doorgelaten worden op de firewall machine. Tenslotte definieert de laatste lijn het IP adres van COMP3.
Opmerking: Als de Internetverbinding PPPoE vereiste, dan zou filtering en NAT moeten plaatsvinden op de pppoe0 interface en niet op de egress interface (fxp0).
set block-policy return set loginterface egress
Elk Unix systeem heeft een "loopback" interface. Dit is een virtuele netwerkinterface die door toepassingen gebruikt worden om binnen het systeem met elkaar te communiceren. Op OpenBSD is de loopback interface lo(4). Het wordt als de beste gewoonte beschouwd om al het filteren op loopback interfaces uit te schakelen. Met set skip zullen we dat tot stand brengen.
Merk op dat we hier alle lo interfaces overslaan, hierdoor hoeven we ons later, mochten we bijkomende loopback interfaces toevoegen, geen zorgen te maken over het wijzigen van dit gedeelte van ons bestaande regelsbestand.set skip on lo
anchor "ftp-proxy/*"
Nu voegen we de regel toe die nodig is om FTP-verbindingen om te leiden zodat ze worden gezien door ftp-proxy(8):
pass in quick on $int_if inet proto tcp to any port ftp \
divert-to 127.0.0.1 port 8021
Deze regel onderschept FTP-verbindingen naar poort 21 en leidt ze om naar ftp-proxy(8) die draait op poort 8021 en, door het gebruik van het quick keyword, zullen packets die matchen niet verder worden gecontroleerd door de volgende regels van de regelset. Indien gebruikers regelmatig verbinding maken naar FTP-servers op andere poorten, dan zou een lijst gebruikt moeten worden om de doel-poort aan te geven, bijvoorbeeld: to any port { 21, 2121 }.
Merk op dat zowel de anker als de ftp-proxy(8) omleidingsregel voor alle match regels voor NAT moeten staan, anders werkt ftp-proxy(8) niet zoals u verwacht.
Nu gaan we verder met enkele match regels. Op zichzelf bepaalt een match regel niet of een packet mag worden doorgelaten of niet. In plaats daarvan, zullen voor de packets die overeenkomen met deze regel de paramaters worden onthouden; deze worden vervolgens gebruikt in iedere pass regel die dit packet behandelt.
Dit is krachtig: parameters zoals NAT of queueing kunnen worden toegepast op bepaalde klasses van packets en vervolgens kunnen de toegangsrechten apart gedefinieerd worden.
Om NAT uit te voeren voor het volledige interne netwerk wordt de volgende match regel gebruikt:
match out on egress inet from !(egress:network) to any nat-to (egress:0)
In dit geval zou "!(egress:network)" eenvoudig vervangen kunnen worden door "$int_if:network", naar indien u meerdere interne interfaces zou toevoegen, zou u meerdere NAT-regels moeten toevoegen, terwijl met deze constructie NAT wordt uitgevoerd voor alle beschermde interfaces.
Aangezien het IP adres op de externe interface dynamisch toegekend wordt, worden er haakjes gezet rond de vertalingsinterface zodat PF zal merken wanneer het adres verandert. De toevoeging :0 wordt gebruikt zodat alleen het eerste adres wordt gebruikt voor de vertaling, mocht de externe interface meerdere adressen hebben.
Tenslotte wordt de protocolfamilie inet (IPv4) opgegeven. Dit voorkomt het vertalen van inet6 (IPv6) packets die mogelijk worden ontvangen.
Nu de regels die de toegang bepalen. Start met het standaard niet toestaan:
block in log
Op dit ogenblik zal alle verkeer dat op een interface probeert binnen te komen, geblokkeerd worden, zelfs dat van het interne netwerk. Deze packets worden tevens gelogd. Volgende regels zullen de firewall openen volgens de bovenstaande doelstellingen en ook alle benodigde virtuele interfaces openen.
Hou in het achterhoofd dat pf verkeer kan blokkeren dat binnenkomt of buitengaat op een interface. Het kan uw leven vereenvoudigen als u ervoor kiest om verkeer in één richting te filteren, veeleer dan te proberen het overeind te houden wanneer u bepaalde dingen inwaarts filtert, en andere dingen uitwaarts. In ons geval zullen we verkiezen om inwaarts verkeer te filteren, maar zodra het verkeer toegelaten wordt in een interface, zullen we niet proberen het te blokkeren als het weer naar buiten gaat, dus we zullen het volgende doen:
Door quick te gebruiken wordt voorkomen dat packets worden gecontroleerd door de volgende regels, wat de prestaties verbetert.pass out quick
Het is goed om de spoofed address protection te gebruiken:
antispoof quick for { lo $int_if }
Open nu de poorten gebruikt door die netwerkdiensten die beschikbaar zullen zijn voor het Internet. Eerst het verkeer dat bestemd is voor de firewall zelf:
pass in on egress inet proto tcp from any to (egress) \
port $tcp_services
Het specificeren van de netwerkpoorten in de macro $tcp_services maakt het eenvoudig om bijkomende diensten te openen voor het Internet door eenvoudigweg de macro te bewerken en de regelset te herladen. UDP diensten kunnen ook geopend worden door een $udp_services macro aan te maken en een filterregel toe te voegen die gelijkaardig is aan de bovenstaande en proto udp specificeert.
De volgende regel vangt alle pogingen op om door iemand op Internet een verbinding te maken met poort 80 op de firewall. Legitieme poginen om deze poort te bereiken zijn van gebruiks die de webserver op het netwerk te bereiken. Deze verbindingspogingen moeten worden omgeleid naar COMP3:
pass in on egress inet proto tcp to (egress) port 80 rdr-to $comp3
ICMP verkeer moet doorgelaten worden:
pass in inet proto icmp all icmp-type $icmp_types
Gelijkaardig aan de $tcp_services macro, kan de $icmp_types macro gemakkelijk bewerkt worden om de types van ICMP pakketten te veranderen die zullen toegestaan worden de firewall te bereiken. Merk op dat deze regel van toepassing is op alle netwerkinterfaces.
Nu moet verkeer naar en vanuit het interne netwerk doorgelaten worden. We zullen aannemen dat gebruikers op het interne netwerk weten wat ze aan het doen zijn en dat ze geen problemen gaan veroorzaken. Dit is niet noodzakelijk een geldige veronderstelling; een veel meer beperkende regelset zou voor vele omgevingen gepast zijn.
pass in on $int_if
TCP, UDP en ICMP verkeer wordt toegestaan om de firewall te verlaten naar het Internet dankzij de "pass out" regel hierboven. Toestandsinformatie wordt bijgehouden zodat de terugkerende pakketten binnen gelaten zullen worden doorheen de firewall.
# macro's
int_if="xl0"
tcp_services="{ 22, 113 }"
icmp_types="echoreq"
comp3="192.168.0.3"
# opties
set block-policy return
set loginterface egress
set skip on lo
# FTP Proxy regels
anchor "ftp-proxy/*"
pass in quick on $int_if inet proto tcp to any port ftp \
divert-to 127.0.0.1 port 8021
# match-regels
match out on egress inet from !(egress:network) to any nat-to (egress:0)
# filterregels
block in log
pass out quick
antispoof quick for { lo $int_if }
pass in on egress inet proto tcp from any to (egress) \
port $tcp_services
pass in on egress inet proto tcp to (egress) port 80 rdr-to $comp3
pass in inet proto icmp all icmp-type $icmp_types
pass in on $int_if
|
[Vorige: Firewall Redundantie met CARP en pfsync] [Inhoud]