[Vorige: Firewall Redundantie met CARP en pfsync] [Inhoud]
[ COMP1 ] [ COMP3 ]
| | ADSL
---+------+-----+------- fxp0 [ OpenBSD ] ep0 -------- ( 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 router is een Pentium 100 met twee netwerkkaarten: een 3com 3c509B (ep0) en een Intel EtherExpress Pro/100 (fxp0). De router heeft een ADSL verbinding 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 = "fxp0"
ext_if = "ep0"
tcp_services = "{ 22, 113 }"
icmp_types = "echoreq"
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
comp3 = "192.168.0.3"
De eerste twee lijnen definiėren de netwerkinterfaces waarop filtering zal gebeuren. De derde en vierde lijnen 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 toegelaten worden de firewall machine te bereiken. De vijfde lijn definieert de loopback en RFC 1918 adresblokken. Tenslotte definieert de laatste lijn het IP adres van COMP3.
Opmerking: Als de ADSL Internetverbinding PPPoE vereiste, dan zou filtering en NAT moeten plaatsvinden op de tun0 interface en niet op ep0.
set block-policy return
set loginterface $ext_if
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.
set skip on lo0
scrub in all
nat on $ext_if from $int_if:network to any -> ($ext_if)
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.
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021
Merk op dat deze regel alleen FTP verbindingen naar poort 21 zal opvangen. Als gebruikers regelmatig verbinden naar FTP servers op andere poorten, dan moet er een lijst gebruikt worden om de bestemmingspoort te specificeren, bijvoorbeeld: from any to any port { 21, 2121 }.
De tweede omleidingsregel vangt pogingen op door iemand op het Internet om te verbinden naar TCP poort 80 op de firewall. Legitieme pogingen om deze poort te benaderen zullen komen van gebruikers die proberen de webserver van het netwerk te bereiken. Deze verbindingspogingen moeten omgeleid worden naar COMP3:
rdr on $ext_if proto tcp from any to any port 80 -> $comp3
block all
Op dit ogenblik zal niets doorheen de firewall gaan, zelfs niet vanaf het interne netwerk. De volgende regels zullen de firewall openen volgens de bovenstaande doelstellingen en ook alle benodigde virtuele interfaces openen.
Vervolgens zullen de RFC 1918 adressen geblokkeerd worden om in of uit de externe interface te gaan. Deze adressen mogen nooit voorkomen op het publieke Internet, en het filteren ervan zal ervoor zorgen dat de router deze adressen niet vanuit het interne netwerk naar buiten "lekt", en ook gelijk welke binnenkomende pakketten blokkeert met een bronadres in één van die netwerken.
block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets
Merk op dat block drop gebruikt wordt om PF op te dragen om niet te antwoorden met een TCP RST of ICMP Unreachable pakket. Aangezien de RFC 1918 adressen niet bestaan op het Internet, zal gelijk welk pakket dat naar die adressen verstuurd wordt, er toch nooit geraken. De quick optie wordt gebruikt om PF op te dragen geen moeite te doen om de rest van de filterregels te evalueren als één van de bovenstaande regels overeenstemt; pakketten naar en van $priv_nets netwerken zullen onmiddellijk gedropt worden.
Open nu de poorten gebruikt door die netwerkdiensten die beschikbaar zullen zijn voor het Internet:
pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services flags S/SA keep state
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.
Bovenop een rdr regel te hebben die webserver-verkeer doorgeeft naar COMP3, MOETEN we dit verkeer ook doorheen de firewall laten gaan:
pass in on $ext_if proto tcp from any to $comp3 port 80 \
flags S/SA synproxy state
Voor een bijkomend beetje veiligheid, zullen we gebruik maken van de TCP SYN Proxy om deweb server verder te beschermen.
Opdat actieve modus FTP verbindingen zouden werken van binnen de LAN, moet de volgende regel aanwezig zijn om de ftp-data verbinding, geļnitieerd door de FTP server, terug naar de client toe te laten. Aangezien FTP verbindingen ge-proxied worden door ftp-proxy, zal het eigenlijk de ftp-data verbinding zelf aannemen en vervolgens de gegevens omleiden naar de client in de LAN.
pass in on $ext_if inet proto tcp from port 20 to ($ext_if) \
user proxy flags S/SA keep state
ICMP verkeer moet nu doorgelaten worden:
pass in inet proto icmp all icmp-type $icmp_types keep state
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 bepaalde omgevingen gepast zijn.
pass in on $int_if from $int_if:network to any keep state
De bovenstaande regel zal gelijk welke interne machine toelaten om pakketten doorheen de firewall te sturen; hij zal echter de firewall niet toestaan een verbinding te initiėren naar een interne machine. Is dit een goed idee? Dat hangt af van enkele van de fijnere details van de netwerksetup. Als de firewall ook een DHCP server is, kan hij een adres moeten "pingen" om de beschikbaarheid ervan te verifiėren alvorens het toe te kennen. De firewall toelaten te verbinden naar het interne netwerk laat ook toe dat iemand die naar de firewall ge-ssh't heeft vanaf het Internet, vervolgens machines op het netwerk benadert. Hou in het achterhoofd dat het niet toelaten aan de firewall om rechtstreeks met het netwerk te communiceren, geen groot beveiligingsvoordeel vormt; als iemand toegang verkrijgt tot de firewall, kan hij waarschijnlijk toch de filterregels aanpassen. Door de volgende regel toe te voegen, zal de firewall verbindingen naar het interne netwerk kunnen initiėren:
pass out on $int_if from any to $int_if:network keep state
Merk op dat als deze lijnen allebei aanwezig zijn, de keep state optie niet nodig is; alle pakketten zullen doorheen de interne interface kunnen gaan omdat er een regel is om pakketten in beide richtingen door te laten. Als de pass out lijn er echter niet staat, dan moet de pass in lijn keep state bevatten. Er is ook wat prestatievoordeel aan toestand bijhouden: Toestandstabellen worden gecontroleerd voordat regels geėvalueerd worden, en als een toestandsovereenstemming gevonden wordt, wordt het pakket doorheen de firewall gelaten zonder doorheen regelset-evaluatie te gaan. Dit kan een prestatievoordeel bieden op een zwaar belaste firewall, hoewel in een eenvoudig systeem als dit het onwaarschijnlijk is om voldoende belasting te genereren om van belang te zijn.
Laat tenslotte verkeer naar buiten op de externe interface:
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state
TCP, UDP en ICMP verkeer wordt toegestaan om de firewall te verlaten naar het Internet. Toestandsinformatie wordt bijgehouden zodat de terugkerende pakketten binnen gelaten zullen worden doorheen de firewall.
# macro's
int_if = "fxp0"
ext_if = "ep0"
tcp_services = "{ 22, 113 }"
icmp_types = "echoreq"
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
comp3 = "192.168.0.3"
# opties
set block-policy return
set loginterface $ext_if
set skip on lo0
# scrub
scrub in all
# nat/rdr
nat on $ext_if from $int_if:network to any -> ($ext_if)
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
port 8021
rdr on $ext_if proto tcp from any to any port 80 -> $comp3
# filterregels
block all
block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets
pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services flags S/SA keep state
pass in on $ext_if proto tcp from any to $comp3 port 80 \
flags S/SA synproxy state
pass in on $ext_if inet proto tcp from port 20 to ($ext_if) \
user proxy flags S/SA keep state
pass in inet proto icmp all icmp-type $icmp_types keep state
pass in on $int_if from $int_if:network to any keep state
pass out on $int_if from any to $int_if:network keep state
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state
|
[Vorige: Firewall Redundantie met CARP en pfsync] [Inhoud]