diff --git a/nl_NL.ISO8859-1/books/handbook/firewalls/Makefile b/nl_NL.ISO8859-1/books/handbook/firewalls/Makefile new file mode 100644 index 0000000000..331f5bf8ec --- /dev/null +++ b/nl_NL.ISO8859-1/books/handbook/firewalls/Makefile @@ -0,0 +1,15 @@ +# +# Build the Handbook with just the content from this chapter. +# +# $FreeBSD$ +# + +CHAPTERS= firewalls/chapter.sgml + +VPATH= .. + +MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX} + +DOC_PREFIX?= ${.CURDIR}/../../../.. + +.include "../Makefile" diff --git a/nl_NL.ISO8859-1/books/handbook/firewalls/chapter.sgml b/nl_NL.ISO8859-1/books/handbook/firewalls/chapter.sgml new file mode 100644 index 0000000000..6126a1ff3d --- /dev/null +++ b/nl_NL.ISO8859-1/books/handbook/firewalls/chapter.sgml @@ -0,0 +1,3148 @@ + + + + + + + Joseph J. + Barbish + Bijgedragen door + + + + + Brad + Davis + Omgezet naar SGML en bijgewerkt door + + + + + Siebrand + Mazeland + Vertaald door + + + + + Firewalls + + firewall + + + beveiliging + + firewalls + + + + Inleiding + + Firewalls bieden de mogelijkheid om inkomend en uitgaand + verkeer op een systeem te filteren. Een firewall gebruikt + daarvoor een of meer groepen regels (rules) om + netwerkpakketten te inspecteren als ze binnenkomen of weggaan + door netwerkverbindingen en staat dat verkeer dan toe of + blokkeert het. De regels van een firewall kunnen + één of meerdere eigenschappen van pakketten + onderzoeken waaronder, maar niet uitsluitend, het protocol, het + bron- of bestemmingsadres en de bron- en bestemmingspoort. + + Firewalls kunnen de veiligheid van een host of netwerk enorm + vergroten. Ze kunnen één of meer van de volgende + dingen doen: + + + + Applicaties, diensten en machines op een intern + netwerk te beschermen tegen ongewild verkeer van het + internet. + + + + Toegang tot internet voor interne hosts te limiteren + of uitschakelen. + + + + Ondersteuning bieden voor netwerkadres vertaling + (network address translation of + NAT), waarmee er vanaf een intern + netwerk met private IP adressen een + internetverbinding gedeeld kan worden met één + IP adres of met een groep van publieke + adressen die automatisch wordt toegewezen. + + + + Na het lezen van dit hoofdstuk weet de lezer: + + + + Hoe pakketfilteringsregels op de juiste wijze + samengesteld kunnen worden; + + + + De verschillen tussen de firewalls die bij &os; + worden geleverd; + + + + Hoe de OpenBSD firewall PF te + gebruiken en in te stellen; + + + + Hoe IPFILTER te gebruiken en + in te stellen; + + + + Hoe IPFW te gebruiken en in te + stellen. + + + + Er wordt aangenomen dat de lezer van dit hoofdstuk: + + + + Basisbegrip heeft van FreeBSD en + internetconcepten. + + + + + + Firewallconcepten + + Er zijn twee basismogelijkheden om sets met regels te maken + voor firewalls: inclusief of + exclusief. Een exclusieve firewall staat al het + verkeer door behalve het verkeer dat past bij de set met regels. + Een inclusieve firewall doet het tegenovergestelde. Die staat + alleen verkeer toe dat past bij de regels en blokkeert al het + overige verkeer. + + Inclusieve firewalls zijn in het algemeen veiliger dan + exclusieve firewalls omdat ze het risico op het toestaan van + ongewild verkeer door een firewall aanzienlijk reduceren. + + Als een browser wordt gebruikt om naar een website te gaan, + dan gebeurt er veel voordat data van een website op een scherm + wordt weergegeven. Een browser ontvangt niet één + bestand dat alle data bevat en zo weergegeven kan worden op + een scherm. Er vinden meerdere rondes van sturen en ontvangen + van pakketten met informatie plaats. Als alle pakketten met + data eindelijk zijn aangekomen, dan wordt de data uit die + pakketten gecombineerd tot dat wat op het scherm wordt getoond. + Iedere dienst (DNS, HTTP, + etc.) heeft zijn eigen poortnummer. Poortnummer 80 is voor + HTTP diensten. Een firewall kan ingesteld + worden om alleen de start van een verzoek dat afkomstig is van + het LAN naar het internet toe te + staan. + + De beveiliging kan nog verder vergroot worden met een + stateful firewall. Een stateful firewall houdt + bij welke connecties er door de firewall tot stand zijn gekomen + en laat alleen verkeer door dat bij een bestaande connectie hoort + of onderdeeel is van een connectie in opbouw. Het nadeel van een + stateful firewall is dat die kwetsbaar kan zijn voor Ontzegging + van Dienst (DoS) aanvallen als er een groot aantal nieuwe + verbindingen binnen korte tijd wordt opgezet. Met de meeste + firewalls is het mogelijk een combinatie te maken van stateful en + niet stateful gedrag om een optimale firewall voor een site te + maken. + + + + Firewallsoftware + + &os; heeft drie soorten firewallsoftware in de + basisinstallatie. Dat zijn IPFILTER (ook bekend als IPF), + IPFIREWALL (ook bekend als IPFW) en PF (de pakketfilter van + OpenBSD). IPFIREWALL heeft + ingebouwde mogelijkheden om bandbreedte te regelen met de + DUMMYNET traffic shaper. IPFILTER heeft geen + traffic shaper om bandbreedte te regelen, maar dit kan + wel gedaan worden met de port ALTQ. DUMMYNET en + ALTQ worden meestal gebruikt door ISPs en + bedrijven. IPF, IPFW en PF gebruiken regels om de toegang van + pakketten tot een systeem te regelen, hoewel ze dat op andere + manieren doen en de syntaxis voor regels anders is. + + De voorbeeldregels voor IPFW (in + /etc/rc.firewall) die meekomen met de + basisinstallatie zijn verouderd en gecompliceerd en ze maken + geen gebruik van stateful regels op de interface die in + verbinding staat met internet. Daar wordt alleen gebruik + gemaakt van staatloze regels die alleen poorten voor diensten + open of dicht kunnen zetten. De stateful regels die in dit + onderdeel staan zijn de opvolger van dat wat in + /etc/rc.firewall met het basissysteem + meekomt. + + Stateful regels hebben technisch geavanceerde + inspectiemogelijkheden om bescherming te bieden tegen de + overvloed aan methoden die door aanvallers gebruikt + worden. + + Zowel IPF, IPFW als PF kunnen nog steeds de staatloze + regels gebruikt blijven worden. Die verouderde regels worden + in dit onderdeel niet behandeld. Hier worden alleen de nieuwe, + moderne stateful regels en de volgorde waarin die van + toepassing zijn behandeld. + + We raden aan de mogelijkheden van beide firewalls te + bestuderen om te bepalen welke firewall in een situatie het + beste past. + + De schrijver van dit artikel geeft de voorkeur aan IPFILTER + omdat daarmee stateful regels minder complex zijn toe te passen + in een omgeving waar NAT wordt gebruikt en + IPF heeft een ingebouwde ftp proxy waardoor de regels voor het + veilig gebruiken van FTP eenvoudiger worden. Daarnaast past + het beter bij het kennisniveau van een onervaren + firewallgebruiker. + + Omdat alle firewalls gebaseerd zijn op het inspecteren van + aangegeven controlevelden in pakketten, moet iemand die + firewallregels opstelt begrijpen hoe TCP/IP + werkt, welke waarde de controlevelden kunnen hebben en hoe die + waarden gebruikt worden in normaal verkeer. Op de volgende + link wordt een prima uitleg gegeven: . + + + + De Packet Filter (PF) Firewall + + Vanaf juli 2003 is de OpenBSD firewalltoepassing + PF geporteerd naar &os; 5.3. + PF is een complete en volledige firewall die + ALTQ bevat om bandbreedte management uit te + voeren op een vergelijkbare wijze als dummynet in + IPFW. Het OpenBSD project zorgt voor een + erg goed gebruikershandboek voor PF dat niet in dit onderdeel + wordt opgenomen omdat dat niet nodig is. + + Voor oudere 5.X versies van &os; staat + PF in de &os; portscollectie: security/pf. + + Meer informatie staat op de PF voor &os; + website: . + + Het OpenBSD PF gebruikershandboek staat hier: . + + + PF in &os; 5.X staat op het niveau van OpenBSD versie + 3.5. De port uit de &os; portscollectie is op het niveau van + OpenBSD versie 3.4. Houd dit in gedachten bij het doornemen + van het gebruikershandboek. + + + + PF Inschakelen + + PF zit in de basisinstallatie van &os; voor versies vanaf + 5.3 als aparte run time laadbare module. PF + laadt dynamisch in de kernel als laadbare module als + pf_enable="YES" in + rc.conf staat. In de laadbare module is + &man.pflog.4; logging ingeschakeld. + + + + Kernelopties + + Het is niet verplicht om PF in te schakelen door het mee + te compileren in de &os; kernel. Dit wordt alleen beschreven + als achtergrondinformatie. Door PF in de kernel te + compileren wordt de laadbare module niet gebruikt. + + Voorbeeld kernelinstellingen voor PF staan beschreven in + de /usr/src/sys/conf/NOTES kernel source + en worden hier weergegeven: + + device pf +device pflog +device pfsync + + device pf schakelt ondersteuning voor de + Packet Filter firewall in. + + device pflog schakelt het + optionele &man.pflog.4; pseudo netwerkdevice in dat gebruikt + kan worden om verkeer te loggen naar een &man.bpf.4; + descriptor. De &man.pflogd.8; daemon kan gebruikt worden om + de logboekinformatie naar disk te schrijven. + + device pfsync schakelt het + optionele &man.pfsync.4; pseudo netwerkdevice in waarmee de + state wijzigingen gemonitord kunnen worden. + Omdat dit geen onderdeel is van de laadbare module, moet dit + in een aangepaste kernel gebouwd worden om het te kunnen + gebruiken. + + Deze instellingen worden pas actief nadat een kernel + waarvoor deze instellingen zijn gemaakt is gebouwd en + geïnstalleerd. + + + + Beschikbare Opties voor rc.conf + + De volgende instellingen moeten in /etc/rc.conf + staan om PF bij het booten te activeren: + + pf_enable="YES" # Schakel PF in (laad module als nodig) +pf_rules="/etc/pf.conf" # bestand met regels voor pf +pf_flags="" # aanvullende vraagen voor opstarten pfctl +pflog_enable="YES" # start pflogd(8) +pflog_logfile="/var/log/pflog" # waar pflogd het logboekbestand moet opslaan +pflog_flags="" # aanvullende vlaggen voor opstarten pflogd + + Als er een LAN achter de firewall staat en er pakketten + doorgestuurd moeten worden naar computers op dat LAN of als + NAT actief is, dan moet de volgende optie ook ingesteld + worden: + + gateway_enable="YES" # Schakel in als LAN gateway + + + + + De IPFILTER (IPF) Firewall + + Darren Reed is de auteur van IPFILTER, dat niet afhankelijk + is van één besturingssysteem. IPFILTER is een + open source applicatie die is geporteerd naar &os;, NetBSD, + OpenBSD, SunOS, HP/UX en Solaris besturingssystemen. IPFILTER + wordt actief ondersteund en onderhouden en er worden regelmatig + nieuwe versies uigebracht. + + IPFILTER is gebaseerd op een firewall aan de kernelkant en + een NAT mechanisme dat gecontroleerd en + gemonitord kan worden door programma's in userland. De + firewallregels kunnen ingesteld of verwijderd worden met het + hulpprogramma &man.ipf.8;. De NAT regels + kunnen ingesteld of verwijderd worden met &man.ipnat.1;. Het + programma &man.ipfstat.8; kan actuele statistieken leveren voor + de kernelonderdelen van IPFILTER. &man.ipmon.8; kan acties van + IPFILTER wegschrijven naar logboekbestanden van het + systeem. + + IPF is oorspronkelijk geschreven met logica die regels + verwerkte volgens het principe de laatst passende regel + wint en gebruikte toen alleen staatloze regels. In de + loop der tijd is IPF verbeterd en zijn de opties + quick en keep + state toegevoegd waarmee de logica van het + verwerken van regels drastisch is gemoderniseerd. In de + officiële documentatie van IPF worden de verouderde + regels en verwerkingslogica behandeld. De moderne functies + worden alleen behandeld als opties, waardoor hun nut dat er een + veiliger firewall mee te maken volledig onderbelicht + blijft. + + De instructies in dit hoofdstuk zijn gebaseerd op regels + die gebruik maken van de optie quick en + de stateful optie keep state. Dit is + het raamwerk waarmee een set van inclusieve firewallregels + wordt samengesteld. + + Een inclusieve firewall staat alleen pakketten toe die + voldoen aan de regels. Op die manier kan er in de hand + gehouden worden welke diensten van binnen de firewall naar + buiten mogen en welke diensten op het private netwerk vanaf + het internet bereikbaar zijn. Al het andere verkeer wordt + vanuit het ontwerp standaard geblokkeerd en gelogd. + Inclusieve firewalls zijn veel veiliger dan exclusieve + firewalls. Het is ook de enige wijze voor de opzet van een + firewall die in dit hoofdstuk wordt behandeld. + + Voor een gedetailleerde uitleg over de verwerking van de + verouderde regels zie + + en . + + De IPF FAQ is te vinden op . + + + IPF Inschakelen + + IPF zit in de basisinstallatie van &os; als een aparte + run time laadbare module. IPF + laadt dynamisch in de kernel als laadbare module als + ipfilter_enable="YES" in + rc.conf staat. Voor de laadbare module + zijn de opties logging en default + pass all ingeschakeld. IPF hoeft niet in de + kernel gecompileerd te worden om het standaardgedrag te + wijzigen naar block all. Dat is mogelijk + door als laatste regel een regel toe te voegen die al het + verkeer blokkeert. + + + + Kernelopties + + Het is niet verplicht om IPF in te schakelen door de + volgende opties in de &os; kernel te compileren. Dit wordt + alleen beschreven als achtergrondinformatie. Door IPF in de + kernel te compileren wordt de laadbare module niet + gebruikt. + + Voorbeeld kernelinstellingen voor IPF staan beschreven in + de /usr/src/sys/i386/conf/LINTin de + kernelbroncode + (/usr/src/sys/arch/conf/LINT + voor &os; 4.X) en worden hier beschreven: + + options IPFILTER +options IPFILTER_LOG +options IPFILTER_DEFAULT_BLOCK + + IPFILTER geeft de compiler + aan dat IPFILTER onderdeel moet zijn van de kern van de + kernel. + + IPFILTER_LOG schakelt de + optie in waarmee IPF verkeer kan loggen door het naar het ip + pakketloggende pseudo–device te schrijven voor iedere + regel met het sleutelwoord log + erin. + + IPFILTER_DEFAULT_BLOCK + wijzigt het standaardgedrag zodat ieder pakket waarop geen + enkele pass regel van toepassing is + wordt geblokkeerd. + + Deze instelling worden pas actief nadat een kernel + waarvoor deze instellingen zijn gemaakt is gebouwd en + geïnstalleerd. + + + + Beschikbare Opties voor rc.conf + + De volgende instellingen moeten in /etc/rc.conf + staan om IPF bij het booten te activeren: + + ipfilter_enable="YES" # Start ipf firewall +ipfilter_rules="/etc/ipf.rules" # laadt regels uit het doelbestand +ipmon_enable="YES" # Start IP monitor log +ipmon_flags="–Ds" # D = start as daemon + # s = log naar syslog + # v = log tcp window, ack, seq + # n = vertaal IP & poort naar namen + + Als er een LAN achter de firewall staat dat gebruik maakt + van IP adressen uit de privaat reeks, dan + moet de volgende optie ook ingesteld worden om + NAT in te schakelen: + + gateway_enable="YES" # Schakel in als LAN gateway +ipnat_enable="YES" # Start ipnat functie +ipnat_rules="/etc/ipnat.rules" # bestand met regels voor ipnat + + + + IPF + + &man.ipf.8; wordt gebruikt om het bestand met + firewallregels te laden. Gewoonlijk wordt er een bestand + aangemaakt waarin de situatieafhankelijke regels staan + waarmee in één keer de bestaande regels kunnen + worden vervangen: + + ipf –Fa –f /etc/ipf.rules + + : verwijder alle interne tabellen + met regels. + + : laad het aangegeven + bestand met regels. + + Hiermee wordt het mogelijk wijzigingen te maken aan het + bestand met eigen regels en met &man.ipf.8; de firewall aan + te passen met verse regels zonder het systeem te booten. + Deze methode is erg handig om nieuwe regels te testen omdat + dit zo vaak als nodig gedaan kan worden. + + In &man.ipf.8; worden alle opties die beschikbaar zijn + toegelicht. + + &man.ipf.8; verwacht dat het bestand met regels een + standaard tekstbestand is. Het accepteert geen bestand met + regels dat is opgesteld als een script dat gebruik maakt van + substitutie. + + Er is wel een mogelijkheid om IPF regels op te stellen + en gebruik te maken van substitutie. Meer informatie staat + in . + + + + IPFSTAT + + &man.ipfstat.8; haalt de totalen van de statistieken op + die horen bij de firewall sinds die is gestart en toont deze. + Het kan ook zijn dat de tellers in tussentijd op nul zijn + gesteld met ipf –Z. + + In &man.ipfstat.8; worden alle details behandeld. + + Standaard ziet &man.ipfstat.8; uitvoer er ongeveer als + volgt uit: + + input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0 +output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0 +input packets logged: blocked 99286 passed 0 +output packets logged: blocked 0 passed 0 +packets logged: input 0 output 0 +log failures: input 3898 output 0 +fragment state(in): kept 0 lost 0 +fragment state(out): kept 0 lost 0 +packet state(in): kept 169364 lost 0 +packet state(out): kept 431395 lost 0 +ICMP replies: 0 TCP RSTs sent: 0 +Result cache hits(in): 1215208 (out): 1098963 +IN Pullups succeeded: 2 failed: 0 +OUT Pullups succeeded: 0 failed: 0 +Fastroute successes: 0 failures: 0 +TCP cksum fails(in): 0 (out): 0 +Packet log flags set: (0) + + Als er als optie voor inkomend of + voor uitgaand wordt meegegeven, dan wordt + de juiste lijst met regels die de kernel op dit moment gebruikt + weergegeven. + + ipfstat –in toont de tabel met + regels voor inkomend verkeer met regelnummers + + ipfstat –on toont de tabel met + regels voor uitgaand verkeer met regelnummers + + De uitvoer ziet er ongeveer als volgt uit: + + @1 pass out on xl0 from any to any +@2 block out on dc0 from any to any +@3 pass out quick on dc0 proto tcp/udp from any to any keep state + + ipfstat –in toont de tabel met + regels voor inkomend verkeer, waarbij voor iedere regel staat + hoe vaak die van toepassing was. + + ipfstat –on toont de tabel met + regels voor uitgaand verkeer, waarbij voor iedere regel staat + hoe vaak die van toepassing was. + + De uitvoer ziet er ongeveer als volgt uit: + + 2451423 pass out on xl0 from any to any +354727 block out on dc0 from any to any +430918 pass out quick on dc0 proto tcp/udp from any to any keep state + + Een van de belangrijkste functies van + ipfstat is de vlag + waarmee de staat-tabel wordt getoond op een wijze die + vergelijkbaar is met de wijze waarop &man.top.1; de draaiende + &os; procestabel toont. Als een firewall wordt aangevallen dan + geeft deze functie de mogelijkheid om de pakketten van de + aanvaller te identificeren en nader te onderzoeken. De + optionele subvlaggen bieden de mogelijkheid om een bron of + bestemmings IP adres, poort of protocol aan + te geven dat gemonitord moet worden. Details zijn na te lezen + in &man.ipfstat.8 + + + + IPMON + + Om &man.ipmon.8; te laten werken zoals bedoeld, moet de + kerneloptie IPFILTER_LOG aan staan. Dit + commando kan op twee verschillende wijzen gebruikt worden. + De standaard is van toepassing als het commando op de + commandoregel wordt ingegeven zonder de optie + . + + De daemon wordt gebruikt als continu een systeemlogboek + bijgewerkt moet worden zodat het mogelijk is om + gebeurtenissen in het verleden te bekijken. Zo zijn &os; en + IPFILTER ingesteld om samen te werken. &os; heeft ingebouwde + mogelijkheden om automatisch syslogs te roteren. Daarom is + het beter om de uitvoer naar &man.syslogd.8; te geschrijven + dan naar een gewoon bestand. In rc.conf + is te zien dat de instelling ipmon_flags + de waarde heeft: + + ipmon_flags="-Ds" # D = start als daemon + # s = log naar syslog + # v = log tcp window, ack, seq + # n = vertaal IP & poort naar namen + + De voordelen van loggen zijn duidelijk. Het biedt de + mogelijkheid om na het feit informatie na te zien als: welke + pakketten heeft de firewall laten vallen, waar kwamen ze + vandaan en waar gingen ze heen? Dit zijn allemaal voordelen + als het gaat om uitvinden waar een aanvaller vandaan komt en + wat hij heeft geprobeerd. + + Zelfs als logging is ingeschakeld logt IPF nog niets uit + zichzelf. De beheerder van de firewall beslist welke actieve + regels iets weg moeten schrijven door het sleutelwoord + log aan die regels toe te voegen. + Gewoonlijk worden alleen deny regels + gelogd. + + Het is heel normaal om als laatste regel een + deny regel aan de set met regels toe + te voegen waar het sleutelwoord log in + staat. Zo krijgt een beheerder alle pakketten te zien waarop + geen enkele regel van toepassing was. + + + + Loggen met IPMON + + &man.syslogd.8; heeft een eigen methode om + logboekgegevens te scheiden. Het maakt gebruik van speciale + groepen die facility en level + heten. &man.ipmon.8; in mode + gebruikt Local0 als + facilitynaam. Alle door &man.ipmon.8; gelogde + gegevens gaan naar Local0. De nu volgende + levels kunnen gebruikt worden om de gelogde gegevens nog + verder uit elkaar te trekken als dat gewenst is. + + LOG_INFO – pakketten gelogd met het sleutelwoord "log" als actie in plaats van pass of block. +LOG_NOTICE – gelogde pakketten die ook zijn doorgelaten +LOG_WARNING – gelogde pakketten die ook geblokkeerd zijn +LOG_ERR – gelogde pakketten die een verkeerde opbouw hebben, "short" + + Om IPFILTER alle gelogde gegevens naar + /var/log/ipfilter.log te laten schrijven, dient + dat bestand te bestaan. Dat kan met het volgende + commando: + + touch /var/log/ipfilter.log + + De syslogfunctie wordt beheerd met instellingen in + /etc/syslog.conf. + syslog.conf biedt aanzienlijke + flexibiliteit in hoe syslog omgaat met systeemberichten die + door softwaretoepassingen als IPF worden gegeven. + + Zo kan de volgende instelling toegevoegd worden aan + /etc/syslog.conf: + + Local0.* /var/log/ipfilter.log + + Local0.* betekent dat alle + logberichten naar de aangegeven plaats geschreven moeten + worden. + + Om de wijzigingen in + /etc/syslog.conf actief te maken kan er + gereboot worden of is het mogelijk de syslogtaak een schop te + geven zodat /etc/syslog.conf opnieuw + wordt ingelezen met kill + –HUP <pid>. Het pid (procesnummer) is + te achterhalen door een overzicht van taken te tonen met + ps –ax. Het pid is het nummer in de + linker kolom voor de regel waarop syslog + staat. + + Vaak wordt vergeten /etc/newsyslog.conf + te wijzigen om het nieuw aangemaakte logbestand + te laten roteren. + + + + De Opmaak van Gelogde Berichten + + Berichten die door ipmon wordt gezonden + bestaan uit velden die gescheiden worden door een spatie. + Velden die in alle berichten zitten zijn: + + + + De datum waarop het pakket is ontvangen. + + + + De tijd waarop het pakket is ontvangen weergegeven + als HH:MM:SS.F voor uren, minuten, seconden en fracties + van een seconde. De fractie kan meerdere cijfers lang + zijn. + + + + De naam van de interface waarop het pakket is + ontvangen, bijvoorbeeld + dc0. + + + + De groep en regelnummer van de regel, bijvoorbeeld + @0:17. + + + + Deze kunnen ingezien worden met + ipfstat -in. + + + + De acties: p voor doorgelaten + (passed), b voor + geblokkeerd (blocked), + S voor een verkeerd pakket + (short packet), n voor + dat er geen enkele regel van toepassing was, + L voor een logregel. De volgorde + waarin deze acties getoond worden is: S, p, b, n, L. Een + hoofdletter P of B + betekent dat het pakket gelogd is vanwege een globale + instelling, niet vanwege één regel in het + bijzonder. + + + + De adressen. Dit zijn eigenlijk drie velden: het + bronadres en poort gescheiden door een komma het symbool + –> en het bestemmingsadres en poort. + 209.53.17.22,80 –> + 198.73.220.17,1722. + + + + Achter PR staat de naam van het + protocol of het nummer, bijvoorbeeld PR + tcp. + + + + Achter len staan de lengte van de + pakketkop en de totale lengte van het pakket, + bijvoorbeeld len 20 40. + + + + Als het pakket een TCP pakket is, dan + is er nog een veld dat begint met een verbindingsstreepje + met daarachter letters die overeenkomen met vlaggen die + ingeschakeld waren. In &man.ipmon.8; is een lijst met + letters en bijbehorende vlaggen te vinden. + + Als het pakket een ICMP pakket is, dan worden aan het + einde twee velden toegevoegd. Het eerste is altijd + ICMP en het volgende het ICMP bericht en + subbericht type, gescheiden door een slash, bijvoorbeeld + ICMP 3/3 voor een poort niet + bereikbaar bericht. + + + + Bouwen van een Script met Regels + + Geoefende gebruikers van IPF maken een bestand dat de + regels bevat en stellen dat op zo'n manier op dat het + uitgevoerd kan worden als een script met substitutie. Het + grote voordeel van deze werkwijze is dat er dan alleen de + waarde van een variabele gewijzigd hoeft te worden en dat + als het script opnieuw wordt uitgevoerd, op alle plaatsen + waar de variabele wordt gebruikt, de nieuwe waarde in de + regels wordt opgenomen. Omdat het een script is, kan + substitutie gebruik worden om vaak voorkomende waarden + de definiëren zodat ze in meerdere regels vervangen + kunnen worden. Dit wordt geïllustreerd in het + onderstaande voorbeeld. + + De syntaxis die in het script wordt gebruikt is + compatibel met de shells sh, + csh en tcsh. + + Velden waarvoor substitutie van toepassing is worden + vooraf gegaan door het dollarteken $. + + Definities worden niet vooraf gegaan door het voorvoegsel + $. + + De waarden van een definitie moet omsloten worden door + "dubbele aanhalingstekens". + + Een set regels begint wellicht als volgt: + + ############## Begin IPF regels script ######################### +oif="dc0" # naam van de uitgaande interface +odns="192.0.2.11" # IP adres van DNS server ISP definitie +myip="192.0.2.7" # Het statische IP adres gekregen van ISP +ks="keep state" +fks="flags S keep state" + +# Hetzelfde kan gebruikt worden om /etc/ipf.rules te bouwen +#cat >> /etc/ipf.rules << EOF + +# voer ipf uit en lees de inline gegevens, stop met lezen +# als het woord EOF wordt gevonden. Er moet een lege regel +# zijn na de regel met EOF voor een correcte werking. +/sbin/ipf –Fa –f – << EOF + +# Verleen toegang tot de DNS van de ISP. +pass out quick on $oif proto tcp from any to $odns port = 53 $fks +pass out quick on $oif proto udp from any to $odns port = 53 $ks + +# Sta uitgaand verkeer voor niet beveiligd www verkeer toe +pass out quick on $oif proto tcp from $myip to any port = 80 $fks + +# Sta uitgaand verkeer voor beveiligd www verkeer toe (https over TLS SSL) +pass out quick on $oif proto tcp from $myip to any port = 443 $fks +EOF +################## Einde IPF regels script ######################## + + Dat is alles. De regels zijn niet van belang in dit + voorbeeld, maar tonen hoe substitutievelden worden + gedefinieerd en hoe ze worden gebruikt. Als het bovenstaande + voorbeeld de inhoud van + /etc/ipf.rules.script was, dan kon het + geladen worden door het vanaf de commandoregel aan te + roepen: + + sh /etc/ipf.rules.script + + Er is wel een probleem met het gebruik van regels in + combinatie met substitutie. IPF heeft er geen probleem mee, + maar de rc opstartscripts die rc.conf + lezen hebben er wel last van. + + Het is mogelijk om deze beperking van de rc scripts heen + te werken met de volgende regel in + rc.conf: + + ipfilter_rules= + + Nu kan er een script als het volgende worden toegevoegd + aan de /usr/local/etc/rc.d/ opstartmap. + We adviseren het script een duidelijke naam te geven als + ipf.loadrules.sh. De extensie + .sh is verplicht: + + #!/bin/sh +sh /etc/ipf.rules.script + + De rechten op dit scriptbestand moeten lezen, schrijven + en uitvoeren voor eigenaar root + zijn: + + chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh + + Als het systeem nu herstart, worden de regels via het + script gestart. + + + + Sets van IPF Regels + + Een set regels is een groep ipf regels + die is gemaakt om pakketten toe te staan of te blokkeren op + basis van de eigenschappen van dat pakket. De + bi-directionele uitwisseling van pakketten tussen hosts + bestaat uit een gesprek dat een sessie heet. De set van + firewallregels beoordeelt pakketten twee keer: als het + aankomt van de host op het publieke internet en als het de + host weer verlaat op de weg terug naar de host op het + publieke internet. Iedere TCP/IP dienst + als telnet, www, mail, etc, heeft zijn eigen protocol, bron + IP adres en bestemmings + IP adres of de bron- en bestemmingspoort. + Deze attributen vormen de basis voor het opstellen van regels + waarmee diensten toegelaten of geblokkeerd kunnen + worden. + + IPF is oorspronkelijk geschreven met logica die regels + verwerkte volgens het principe de laatst passende + regel wint en gebruikte toen alleen staatloze regels. + In de loop der tijd is IPF verbeterd en zijn de opties + quick en keep + state toegevoegd waarmee de logica van het + verwerken van regels drastisch is gemoderniseerd. + + De instructies in dit hoofdstuk zijn gebaseerd op regels + die gebruik maken van de optie quick + en de stateful optie keep state. Dit + is het raamwerk waarmee een set van inclusieve firewallregels + wordt samengesteld. + + Een inclusieve firewall staat alleen diensten toe die + voldoen aan de regels. Op die manier kan er in de hand + gehouden worden welke diensten van binnen de firewall naar + buiten mogen en welke diensten op het private netwerk vanaf + het internet bereikbaar zijn. Al het andere verkeer wordt + vanuit het ontwerp standaard geblokkeerd en gelogd. + Inclusieve firewalls zijn veel veiliger dan exclusieve + firewalls. Het is ook de enige wijze voor de opzet van een + firewall die in dit hoofdstuk wordt behandeld. + + + Werk bij het wijzigen van firewallregels bij voorkeur + vanaf het root console van het systeem + waarop de firewall draait om te voorkomen dat de gebruiker + die de instellingen maakt wordt buitengesloten. + + + + + Regelsyntaxis + + De regelsyntaxis die hier wordt besproken is versimpeld + door alleen de moderne stateful regels en de eerste + van toepassing zijnde regel wint te belichten. De + complete regelsyntaxis is na te lezen in &man.ipf.8 + + Het karakter # wordt gebruikt om het + begin van een opmerking te markeren en zowel op een eigen + regel als achter een firewallregel staan. Lege regels worden + genegeerd. + + Regels bevatten sleutelwoorden die in een bepaalde + volgorde van links naar rechts op een regel horen te staan. + Sleutelwoorden worden vet weergegeven. Sommige + sleutelwoorden hebben subopties die zelf ook weer + sleutelwoorden hebben die ook weer subopties kunnen hebben. + Alle opties die hier direct onder staan, worden daaronder + uitgebreid weergegeven en verderop in dit hoofdstuk in een + aparte paragraaf behandeld. + + + + ACTIE IN/UIT OPTIES SELECTIE STATEFUL + PROTO BRON_ADR,BEST_ADR OBJECT POORT_NUM TCP_VLAG STATEFUL + + + ACTIE = block | pass + + IN/UIT = in | out + + OPTIES = log | quick | on + interfacenaam + + SELECTIE = protowaarde | + bron/bestemming IP | poort = nummer | flags + flag–value + + PROTO = tcp/udp | udp | tcp | + icmp + + BRON_ADR,BEST_ADR = all | from + object to object + + OBJECT = IP adres | any + + POORT_NUM = poortnummer + + TCP_VLAG = S + + STATEFUL = keep state + + + ACTIE + + De actie geeft aan wat er met het pakket gedaan moet + worden als het van toepassing is op de rest van de + filterregel. Iedere regel moet een + actie hebben. De volgende acties zijn mogelijk: + + block geeft aan dat het pakket + moet verdwijnen als de parameters van toepassing zijn het + het pakket. + + pass geeft aan dat het pakket + doorgelaten moet worden als de parameters van toepassing + zijn op het pakket. + + + + IN/UIT + + Dit deel is verplicht voor iedere filterregel waarin + expliciet wordt aangegeven op welke zijde van de in/uit + hij van toepassing is. Het volgende sleutelwoord moet + in of out + zijn, anders is de regel syntactisch onjuist. + + in betekent dat de regel van + toepassing is op inkomende pakketten. + + out betekent dat de regel van + toepassing is op inkomende pakketten. + + + + OPTIES + + + Deze opties moeten in de volgorde waarin ze hier + beschreven staan gebruikt worden. + + + log geeft aan dat het pakket + naar het ipl logboekbestand geschreven moeten worden + (zoals verderop beschreven staat in de paragraaf + Loggen) als de regel van toepassing is op + het pakket. + + quick geeft aan dat als een + regel van toepassing is, dat de laatste regel moet zijn die + wordt gecontroleerd, waardoor er een pad wordt + kortgesloten waardoor de volgende regels voor dat pakket + niet meer gecontroleerd worden. Deze optie is voor de + moderne regels eigenlijk verplicht. + + on geeft de interface aan die + in de parameters meegenomen moet worden. De namen van + interfaces kunnen getoond worden met &man.ifconfig.8;. Als + deze optie wordt gebruikt, kan een regel alleen van + toepassing zijn als het pakket door de aangegeven + interface gaat in de richting die is aangegeven + (in/out). + Ook deze optie is verplicht voor de moderne regels. + + Als een pakket wordt gelogd, dan wordt de kop van het + pakket weggeschreven naar het IPL pakketloggende + pseudo–device. Direct na het sleutelwoord + log mogen de volgende opties + gebruikt worden (in de aangegeven volgorde): + + body geeft aan dat de eerste + 128 bytes van de inhoud van het pakket worden opgeslagen na + de kop. + + first; als het sleutelwoord + log samen met keep + state wordt gebruikt, wordt het aangeraden om + deze optie ook te gebruiken zodat alleen het pakket dat als + eerste in de sessie van toepassing was en niet ook alle + pakketten die daarna in de sessie volgens + keep state van toepassing + zijn. + + + + SELECTIE + + De sleutelwoorden in deze paragraaf worden gebruikt om + attributen van het pakket dat wordt geïnspecteerd te + beschrijven om te bepalen of een regel wel of niet van + toepassing is. Er is een sleutelwoord + en er zijn subopties waarvan er + één of meer gekozen moeten worden. De + volgende attributen zijn beschikbaar voor het proces en + moeten in de aangegeven volgorde worden gebruikt: + + + + PROTO + + proto is het + sleutelwoord dat moet worden + aangegeven samen met een van de sleutelwoorden uit de + subopties. De waarde geeft een bepaald protocol aan dat + van toepassing moet zijn. Ook deze optie is verplicht + voor de moderne regels. + + tcp/udp, + tcp, udp, + icmp of ieder ander protocol dat in + /etc/protocols staat wordt herkend en + kan gebruikt worden. Het bijzondere protocol sleutelwoord + tcp/udp kan gebruikt worden om zowel + voor TCP als UDP + pakketten van toepassing te laten zijn. Het is toegevoegd + voor het gemak om vrijwel gelijke regels te + voorkomen. + + + + BRON_ADR/BEST_ADR + + Het sleutelwoord all is in + feite hetzelfde als from any to any + zonder overige parameters. + + from bron to dest; de + sleutelwoorden from en + to worden gebruikt om te testen op + IP adressen. In regels moet zowel een + bron als bestemmings IP adres + aangegeven worden. any is een + bijzonder sleutelwoord dat van toepassing is voor ieder + IP adres als in from any to + any of from 0.0.0.0/0 to any + of from any to 0.0.0.0/0 of + from 0.0.0.0 to any of from + any to 0.0.0.0. + + IP adressen mogen ingevoerd worden + in de vorm numeriek, door punten gescheiden + adres/maskerlengte of als een enkelvoudig + IP adres in de vorm numeriek, door + punten gescheiden. + + Het is vaak lastig om te komen tot een reeks adressen + in de vorm adres/masker. De volgende link kan daar + wellicht bij helpen: . + + + + POORT + + Als in een regel op een poort wordt gecontroleerd, voor + bron- of bestemmingspoort of beiden, dan is dat alleen van + toepassing op TCP en + UDP pakketten. Bij het maken van + poortvergelijkingen kunnen zowel de dienstnamen uit + /etc/services als een uit een + natuurlijk getal bestaand poortnummer ingesteld worden. + Als de poort onderdeel is van het + from object dan wordt het + vergeleken met het poortnummer van de bron en als het + onderdeel is van het to object, dan + wordt het vergeleken met het poortnummer van de + bestemming. Het gebruik van het to + object is in de moderne regels verplicht en neemt de vorm + aan van from any to any port = + 80. + + Poortvergelijkingen kunnen op verschillende manieren + ingesteld worden met een aantal verschillende operators. + Er kunnen ook reeksen van poorten ingesteld worden. + + port = of een van de volgende + operators: !=, <, >, <, >=, eq, ne, + lt, gt, le, ge. + + Reeksen van poorten worden met de volgende optie + aangegeven: port <> of + ><. + + + De volgende twee parameters die betrekking hebben op + bron en bestemming, zijn verplicht in de moderne + regels. + + + + + TCP_VLAG + + Vlaggen zijn alleen beschikbaar voor het filteren + van TCP. De letters staan voor + de mogelijke vlaggen die bekeken kunnen worden in de + kop van een TCP pakket. + + In de moderne regels wordt de optie flags + S gebruikt om het verzoek tot het starten van + een TCP sessie. + + + + STATEFUL + + keep state geeft aan dat in een + regel met pass voor alle pakketten + die van toepassing zijn stateful gefilterd moet + worden. + + + Deze optie is voor moderne regels verplicht. + + + + + + Stateful Filteren + + Met stateful filteren wordt verkeer benaderd als een + uitwisseling van pakketten tussen twee kanten die een sessie + zijn. Als het is ingeschakeld, dan maakt het + mechamisme dynamisch interne + regels voor pakketten die in de sessie horen te volgen. Het + kan bekijken of de karakteristieken van de sessie tussen + verzender en ontvanger de juiste procedure volgen. Alle + pakketten die niet passen in de sessie, worden automatisch + geblokkeerd. + + keep state staat ook ICMP + pakketten toe die gerelateerd zijn aan een + TCP of UDP sessie. Dus als er een ICMP + type 3 code 4 komt in antwoord op websurfen, dat wordt + toegestaan van binnen naar buiten door een + keep state regel, dan wordt dat + toegelaten. Pakketten waarvan IPF zeker is dat ze onderdeel + zijn van de sessie worden toegelaten, zelfs als ze van een + ander protocol zijn. + + Wat er gebeurt: pakketten die naar buiten gaan op de + interface die met internet is verbonden worden eerst + vergeleken met de dynamische staattabel. Als een pakket + voldoet aan de verwachting van het volgende pakket in de + sessie, dan mag het de firewall verlaten en wordt de + staattabel bijgewerkt. De overige pakketten worden + vergeleken met de set van regels voor uitgaand + verkeer. + + Pakketten die binnenkomen op de interface die met + internet is verbonden worden eerst vergeleken met de + dynamische staattabel. Als een pakket voldoet aan de + verwachting van het volgende pakket in de sessie, dan mag het + de firewall verlaten en wordt de staattabel bijgewerkt. De + overige pakketten worden vergeleken met de set van regels + voor uitgaand verkeer. + + Als de sessie wordt beëindigd wordt hij uit de + dynamische staattabel verwijderd. + + Met stateful filteren is het mogelijk om de focus te + leggen op het blokkeren of toestaan van nieuwe sessies. + Als een nieuwe sessie tot stand mag komen, dan worden alle + volgende pakketten automatisch doorgelaten en al het + vervalste verkeer wordt automatisch tegegehouden. Als een + nieuwe sessie wordt geweigerd, dan wordt geen enkel pakket + doorgelaten. Met stateful filteren zijn er uitgebreide + mogelijkheden voor onderzoek om bescherming te bieden tegen + de veelheid aan aanvallen die tegenwoorden door aanvallers + worden uitgevoerd. + + + + Voorbeeld van Inclusieve Regels + + De onderstaande regels zijn een voorbeeld van hoe een + erg veilige inclusieve firewall opgezet kan worden. Een + inclusieve firewall staat alleen diensten toe die passen bij + de pass regels en blokkeert al het + overige verkeer. Alle firewalls hebben tenminste twee + interfaces waarop regels van toepassing zijn om de firewall + te laten werken. + + Alle &unix; systemen en dus ook &os; zijn zo ontworpen + dat ze voor interne communicatie de interface + lo0 en IP adres + 127.0.0.1 gebruiken. De firewall moet dit interne verkeer + gewoon doorgang laten vinden. + + Voor de interface die is verbonden met het publieke + internet worden regels gemaakt waarmee sessies naar het + internet mogelijk gemaakt worden en toegang wordt gegeven + voor pakketten die uit die sessies terug komen. Dit kan + de PPP interface tun0 zijn of de + netwerkkaart die is verbonden met een xDSL of + kabelmodem. + + In gevallen dat er meer dan één + netwerkkaart is aangesloten op het private netwerk achter de + firewall, dan moeten er op de firewall regels zijn om het + verkeer tussen die interfaces vrije doorgang te geven. + + De regels worden opgedeeld in drie onderdelen: alle + interfaces met vrije doorgang, uitgaand op publieke + interfaces en inkomend op publieke interfaces. + + De volgorde van de regels in iedere sectie voor publieke + interfaces moet zo zijn dat de regels die het meest gebruikt + worden vóór de regels die minder vaak gebruikt + worden staan. De laatste regel van een onderdeel geeft aan + dat al het overige verkeer op die interface in die richting + geblokkeerd en gelogd moet worden. + + In het onderdeel Uitgaand staan alleen regels met + pass die parameters bevatten om + individuele diensten beschikbaar te maken zodat er internet + toegang is. Al die regels moeten gebruik maken van + quick, on, + proto, port en + keep state. De regels met + proto tcp maken ook gebruik van + flag om te bekijken of het een pakket + betreft voor het opzetten van een sessie om de stateful + functionaliteit aan te sturen. + + In het onderdeel Inkomend staan alle regels voor het + blokkeren van ongewenste pakketten eerst om twee redenen. + Als eerste kan het zo zijn dat wat er wordt geblokkeerd + later toegestaan zou worden door regels die diensten + toestaan. De tweede reden is dat nu ongewenste pakketten + die vaak voor komen en die bij voorkeur niet in de + logboeken voor komen niet meer van toepassing zijn op de + laatste regel van het onderdeel waarin ze zouden worden + gelogd. Met de laatste regel van dit onderdeel worden + alle overige pakketten geblokkeerd en gelogd en ze kunnen + bewijsmateriaal zijn in een zaak tegen iemand die heeft + geprobeerd een systeem aan te vallen. + + Voor al het verkeer dat wordt geweigerd wordt geen + antwoord gestuurd. De pakketten verdwijnen gewoon. Zo weet + een aanvaller niet of een pakket het doelsysteem wel heeft + bereikt. Zo kan een aanvaller geen informatie verzamelen + over een systeem: hoe minder informatie er over een systeem + beschikbaar is, hoe veiliger het is. Zo wordt bijvoorbeeld + een inkomend verzoek van een nmap OS + fingerprint gelogd omdat een aanvaller zoiets zou + proberen. + + We raden aan om als er logmeldingen komen van een regel + met log first het commando + ipfstat -hio uit te voeren om te + bekijken hoe vaak de regel van toepassing is geweest om te + kijken of de firewall overspoeld wordt, m.a.w. aangevallen + wordt. + + Als er pakketten gelogd worden waarvan de beheerder het + poortnummer niet herkent, dan is op + de functie van dat poortnummer na te zoeken. + + Op de volgende link worden poortnummers van Trojans + beschreven: . + + De onderstaande set regels is een complete en erg veilige + inclusieve set met regels voor een firewall die de auteur + zelf heeft gebruikt op zijn syteem. Deze set met regels is + een aanrader en eenvoudig aan te passen door commentaar te + maken van een regel voor een dienst die niet gewenst + is. + + Logberichten die niet gewenst zijn, zijn uit te sluiten + door ze met een regel te blokkeren in het begin van het + onderdeel Inkomend. + + Voor de onderstaande regels dient de + dc0 interfacenaam in iedere regel + vervangen te worden door de interfacenaam van de netwerkkaart + in het systeem die met het publieke internet is verbonden. + Voor gebruikers van PPP zou dat tun0 + zijn. + + Dit zou de inhoud van /etc/ipf.rules + kunnen zijn: + + ################################################################# +# Geen beperkingen op de interface aan de LAN kant. +# Niet nodig als er geen LAN is. +################################################################ + +#pass out quick on xl0 all +#pass in quick on xl0 all + +################################################################# +# Geen beperkingen op de loopback interface +################################################################# +pass in quick on lo0 all +pass out quick on lo0 all + +################################################################# +# Interface aan het publieke internet (onderdeel Uitgaand). +# Inspecteer verzoeken om een sessie te starten van achter de +# firewall op het private netwerk of vanaf de server zelf naar +# het publieke internet. +################################################################# + +# Geef toegang tot de DNS server van de ISP. +# xxx moet het IP adres van de DNS van de ISP zijn. +# Dupliceer deze regels als een ISP meedere DNS servers heeft. +# Haal het IP adres evt. uit /etc/resolv.conf. +pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state +pass out quick on dc0 proto udp from any to xxx port = 53 keep state + +# Geef toegang tot de DHCP server van de ISP voor kabel- en +# xDSL-netwerken. Deze regel is niet nodig als gebruik gemaakt worden +# van PPP naar het publieke internet. In dat geval kan de hele groep +# verwijderd worden. Gebruik de volgende regel en controleer het +# logboek voor het IP adres. Wijzig dan het IP adres in de regel +# commentaar hieronder en verwijder de eerste regel. +pass out log quick on dc0 proto udp from any to any port = 67 keep state +#pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state + +# Sta niet beveiligd www verkeer toe. +pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state + +# Sta beveiligd www verkeer over TLS SSL toe. +pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state + +# Sta het verzenden en ontvangen van e-mail toe. +pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state +pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state + +# Sta Time toe. +pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state + +# Sta NNTP nieuws toe. +pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state + +# Sta lokale en LAN gebruiker toe niet beveiligde FTP te gebruiken +# (zowel passieve als actieve modes). Deze functie maakt gebruik van +# de in IPNAT ingebouwde FTP proxy die in het bestand met nat regels +# staat om dit in één regel te laten werken. Als er met +# pkg_add packages toegevoegd moeten kunnen worden op een systeem, dan +# is deze regel nodig. +pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state + +# Sta beveiligde FTP, Telnet en SCP toe. +# Deze functie maakt gebruik van SSH (secure shell) +pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state + +# Sta uitgaande niet beveiligde telnet toe. +pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state + +# Sta de &os; CVSUP functie toe. +pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state + +# Sta ping toe naar het publieke internet. +pass out quick on dc0 proto icmp from any to any icmp–type 8 keep state + +# Sta whois toe vanaf overal naar het publieke internet. +pass out quick on dc0 proto tcp from any to any port = 43 flags S keep state + +# Blokkeer en log het eerste voorkomen van al het andere dat probeert +# buiten te komen. Deze regel dwingt de 'block all' logica af. +block out log first quick on dc0 all + +################################################################# +# Interface aan het publieke internet (onderdeel Inkomend). +# Inspecteert pakketten die van het publieke internet komen +# met als bestemming de host zelf of het private netwerk. +################################################################# + +# Blokkeer al het verkeer voor niet–routeerbare of gereserveerde +# adresreeksen. +block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 privaat IP +block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 privaat IP +block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 privaat IP +block in quick on dc0 from 127.0.0.0/8 to any #loopback +block in quick on dc0 from 0.0.0.0/8 to any #loopback +block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto–config +block in quick on dc0 from 192.0.2.0/24 to any #gereserveerd voor documentatie +block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect +block in quick on dc0 from 224.0.0.0/3 to any #Klasse D & E multicast + +##### Blokkeer wat vervelende dingen ############ +# die niet in de logboeken moeten komen. + +# Blokkeer flagmenten. +block in quick on dc0 all with frags + +# Block korte TCP pakketten. +block in quick on dc0 proto tcp all with short + +# Blokkeer source gerouteerde pakketten. +block in quick on dc0 all with opt lsrr +block in quick on dc0 all with opt ssrr + +# Blokkeer pogingen voor nmap OS fingerprint. +# Log first occurrence of these so I can get their IP address +block in log first quick on dc0 proto tcp from any to any flags FUP + +# Blokkeer alles met speciale opties. +block in quick on dc0 all with ipopts + +# Blokkeer publieke pings. +block in quick on dc0 proto icmp all icmp–type 8 + +# Blokkeer ident. +block in quick on dc0 proto tcp from any to any port = 113 + +# Blokkeer alle Netbios diensten. 137=naam, 138=datagram, 139=sessie. +# Netbios is de &windows; bestandsdeeldienst. +# Blokkeer &windows; hosts2 name server verzoeken 81. +block in log first quick on dc0 proto tcp/udp from any to any port = 137 +block in log first quick on dc0 proto tcp/udp from any to any port = 138 +block in log first quick on dc0 proto tcp/udp from any to any port = 139 +block in log first quick on dc0 proto tcp/udp from any to any port = 81 + +# Sta inkomend verkeer toe van de DHCP server van de ISP. Deze regel +# moet het IP adres van de DHCP server van de ISP bevatten omdat die +# de enige toegestane bron van dit type pakketten moet zijn. Alleen +# van belang voor kabel en xDSL instellingen. Deze regel is niet nodig +# voor PPP verbindingen naar het publieke internet. Dit is hetzelfde +# IP adres dat in het Uitgaande onderdeel is opgezocht. +pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state + +# Sta inkomend webverkeer toe omdat er een Apache server draait. +pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state + +# Sta niet beveiligde telnet sessie toe vanaf het publieke internet. +# Dit heeft het label niet veilig omdat gebruikersnaam en +# wachtwoord als platte tekst over internet gaan. Als er geen telnet +# server draait, hoeft deze regel niet actief te zijn. +#pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state + +# Sta beveiligde FTP, telnet en SCP toe vanaf internet. +# Deze functie gebruik SSH(secure shell). +pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state + +# Blokkeer en log het eerste voorkomen van al het andere dat probeert +# binnen te komen. Het loggen van alleen het eerste voorkomen stopt +# een ontzegging van dienst aanval die gericht is op het laten +# vollopen van de partitie waarop de logboeken staan. Deze regel dwingt +# de 'block all' logica af. +block in log first quick on dc0 all +################### Einde van de regels ################################### + + + + <acronym>NAT</acronym> + + NAT staat voor Network Address + Translation (netwerkadres vertaling). In &linux; heet dit IP + Masquerading. Een van de vele mogelijkheden die IPF + NAT kan bieden is het delen van + één IP adres op het publieke + internet met een LAN achter een firewall. + + De vraag zou kunnen rijzen waarom iemand dat zou willen. + ISP's wijzen normaliter namelijk dynamisch een + IP adres toe aan hun niet-commerciële + gebruikers. Dynamisch betekent hier dat het + IP adres iedere dat er wordt ingebeld of + dat de kabel- of xDSL-modem uit- en aangeschakeld wordt + anders kan zijn. Dit IP adres is het + adres waarmee een netwerkapparaat bekend is op het publieke + internet. + + Stel dat er vijf PC's in een huis staan en iedere + computer in dat huis heeft toegang tot internet nodig. Dan + zouden er bij een ISP vijf individuele accounts moeten zijn + en vijf telefoonlijnen om dat te realiseren. + + Met NAT is er maar één + account bij een ISP nodig en moeten er vier PC's met kabels + op een switch aangesloten waarop ook een &os; systeem is + aangesloten dat als gateway gaat opereren. + NAT zal automatisch de private LAN + IP adressen van alle PC's vertalen naar + een enkel publiek IP adres als de + pakketten de firewall naar het internet verlaten. + + NAT wordt vaak gebruikt zonder + toestemming of wetenschap van een ISP en in de meeste + gevallen is het, als het wordt ontdekt, grond voor een ISP + om de account op te zeggen. Commerciële gebruikers + betalen veel meer voor hun internet verbindingen en krijgen + vaak een reeks statische IP adressen die + nooit verandert. Een ISP verwacht en staat toe dat + commerciële gebruikers NAT inzetten + voor connectiviteit voor hun interne netwerk. + + Er is een speciale reeks van IP + adressen gereserveerd voor NAT op LANs. + Volgens RFC 1918 kunnen de volgende reeksen + IP adressen gebruikt worden op private + netwerken die nooit direct op het publieke internet + gerouteerd worden. + + + + + + + + + + + + Eerste IP + + + + Laatste IP + + + + 10.0.0.0 + + + + 10.255.255.255 + + + + 172.16.0.0 + + + + 172.31.255.255 + + + + 192.168.0.0 + + + + 192.168.255.255 + + + + + + + + IPNAT + + NAT regels worden geladen met + ipnat. De NAT regels + worden vaak opgeslagen in /etc/ipnat.rules + . Meer details staan in &man.ipnat.1;. + + Bij het maken van wijzigingen aan de + NAT regels nadat NAT + gestart is, wordt aangeraden de wijziging aan het bestand met + regels te maken en daarna met ipnat + alle actieve NAT regels + te wissen. Daarna kunnen de regels uit het bestand weer als + volgt geladen worden: + + ipnat -CF -f /etc/ipnat.rules + + Gebruiksgegevens over NAT kunnen + getoond worden met: + + ipnat -s + + De huidige inhoud van de NAT tabellen + kan getoond worden met: + + ipnat -l + + Met het volgende commando kan de uitgebreide rapportage + worden ingeschakeld en dan wordt informatie over het + verwerken van verkeer en de actieve regels getoond: + + ipnat –v + + + + IPNAT Regels + + NAT regels zijn erg flexibel en er + kunnen veel dingen mee gedaan worden om behoeften van + bedrijven en thuisgebruikers in te vullen. + + De syntaxis van de regels die hier wordt toegelicht is + vereenvoudigd om te passen bij een niet-commerciële + omgeving. De complete syntaxis is na te lezen in + &man.ipnat.5;. + + De syntaxis voor een NAT regel ziet er + ongeveer als volgt uit: + + map IF LAN_IP_REEKS –> PUBLIEK_ADRES + + De regel begint met het sleutelwoord + map. + + IF dient vervangen te worden + door de aanduiding van de externe interface. + + LAN_IP_REEKS is de reeks die + clients op een LAN gebruiken, meestal iets van 192.168.1.0/24. + + PUBLIEK_ADRES kan het publieke + IP adres zijn of een speciaal sleutelwoord + 0.32, wat betekent dat het + IP adres van IF + gebruikt moet worden. + + + + Hoe <acronym>NAT</acronym> Werkt + + Een pakket komt vanaf het LAN aan bij de firewall en + heeft een publieke bestemming. Het wordt verwerkt door de + filterregels voor inkomend verkeer en daarna krijgt + NAT de kans zijn regels op het pakket toe + te passen. De regels worden van boven naar beneden toegepast + en de eerste regel die van toepassing is wint. + NAT controleert voor alle regels het + pakket op interfacenaam en bron IP adres. + Als de interfacenaam van een pakket past bij een + NAT regel dan wordt het bron + IP adres van dat pakket gecontroleerd, dat + is dus een IP adres op het private LAN, + om te bekijken of het valt in de reeks die is opgegeven aan + de linkerkant van een NAT regel. Als ook + dat klopt, dan wordt het bron IP adres van + het pakket vervangen (rewritten) door een + publiek IP adres dat verkregen kan zijn + met het sleutelwoord 0.32. + NAT werkt dan zijn interne + NAT tabel bij, zodat als er een pakket uit + die sessie terugkomt van het publieke internet, dat pakket + weer gepast kan worden bij het originele private + IP adres en door de firewallregels + gefilterd kan worden om daarna, als dat mag, naar een client + gestuurd te worden. + + + + IPNAT Inschakelen + + Voor IPNAT zijn de onderstaande instellingen in + /etc/rc.conf beschikbaar. + + Om verkeer tussen interfaces te kunnen routeren: + + gateway_enable="YES" + + Om IPNAT automatisch te starten: + + ipnat_enable="YES" + + Om aan te geven waar de IPNAT regels staan: + + ipnat_rules="/etc/ipnat.rules" + + + + <acronym>NAT</acronym> voor een Groot LAN + + Voor netwerken met grote aantallen PC's of netwerken + met meerdere LAN's kan het een probleem worden om al die + private IP adressen met één + enkel publiek IP adres te vervangen + omdat vaak dezelfde poortnummers gebruikt worden. Er zijn + twee manieren om dit probleem op te lossen. + + + Aangeven Welke Poorten te Gebruiken + + map dc0 192.168.1.0/24 –> 0.32 + + Met de bovenstaande regel blijft de bronpoort + ongewijzigd als het pakket door IPNAT gaat. Door gebruik + te maken van het sleutelwoord + portmap kan IPNAT ingesteld worden + om alleen bronpoorten in de aangegeven reeks te gebruiken. + Zo stelt de onderstaande regel in dat IPNAT de bronpoort + aanpast naar een poortnummer dat in de aangegeven reeks + valt: + + map dc0 192.168.1.0/24 –> 0.32 portmap tcp/udp 20000:60000 + + Het kan nog eenvoudiger door gebruik te maken van het + sleutelwoord auto zodat IPNAT zelf + bepaalt welke poorten gebruikt kunnen worden: + + map dc0 192.168.1.0/24 –> 0.32 portmap tcp/udp auto + + + + Meerdere Publieke Adressen Gebruiken + + In grote netwerken komt er een moment waarop er gewoon + te veel adressen zijn om te bedienen met één + IP adres. De volgende regel vertaalt + alle verbindingen naar 204.134.75.1: + + map dc0 192.168.1.0/24 –> 204.134.75.1 + + Dit kan gewijzigd worden naar een reeks addressen met + de volgende regel: + + map dc0 192.168.1.0/24 –> 204.134.75.1–10 + + Er kan ook een subnet aangegeven worden met een CIDR + notatie als in het volgende voorbeeld: + + map dc0 192.168.1.0/24 –> 204.134.75.0/24 + + + + + Poorten Omleiden + + Het is erg gebruikelijk om een webserver, mailserver, + database server en DNS server op verschillende computers + op een LAN te draaien. Het uitgaande verkeer van die + servers kan dan met NAT afgehandeld + worden, maar er moet ook ingesteld worden dat inkomend + verkeer bij de juiste computer terecht komt. IPNAT gebruikt + daarvoor de opties in NAT waarmee verkeer + omgeleid kan worden. Als bijvoorbeeld een webserver op + 10.0.10.25 draait en het + publieke IP adres zou 20.20.20.5 zijn, dan zou dit + mogelijk zijn met één van de volgende twee + regels: + + map dc0 20.20.20.5/32 port 80 –> 10.0.10.25 port 80 +map dc0 0/32 port 80 –> 10.0.10.25 port 80 + + Voor een DNS server op een LAN die ook vanuit internet + bereikbaar met zijn en die draait op 10.0.10.33 zou de regel er als + volgt uit zien: + + map dc0 20.20.20.5/32 port 53 –> 10.0.10.33 port 53 udp + + + + FTP en <acronym>NAT</acronym> + + FTP is dinosaurus uit het tijdperk van voor internet was + zoals het nu is, toen onderzoeksinstellingen met elkaar + verbonden waren via huurlijnen en FTP de aangewezen methode + was om bestanden met elkaar uit te wisselen. Maar bij het + gebruik van FTP worden gebruikersnaam en wachtwoord als + platte tekst verzonden en het protocol is nooit aangepast. + FTP is er in twee smaken: actief en passief. Het verschil + zit 'm in hoe het datakanaal wordt opgezet. De passieve + variant is veiliger voor een gebruiker omdat bij deze variant + beide communicatiekanalen door de client zelf worden opgezet. + Op de volgende link zijn details over FTP na te lezen: + . + + + IPNAT Regels + + IPNAT heeft een een speciale FTP proxy ingebouwd die + kan worden ingeschakeld met een NAT + map regel. Die kan al het uitgaande + verkeer monitoren wat betreft opstartverzoeken voor sessies + voor actieve en passieve FTP en dynamisch tijdelijke + filterregels maken die alleen het poortnummer dat echt in + gebruik is voor het datakanaal doorlaten. Hiermee wordt + een veiligheidsrisico dat normaal gepaard gaat met FTP, + namelijk het toestaan van grote reeksen hoge poortnummers, + weggenomen. + + De volgende regel handelt al het FTP verkeer van het + LAN af: + + map dc0 10.0.10.0/29 –> 0/32 proxy port 21 ftp/tcp + + De regel hieronder handelt het FTP verkeer van de + gateway zelf af: + + map dc0 0.0.0.0/0 –> 0/32 proxy port 21 ftp/tcp + + Deze laatste regel handelt al het niet–FTP + verkeer voor het LAN af: + + map dc0 10.0.10.0/29 –> 0/32 + + De FTP map regel hoort voor de + normale regels te staan. Alle pakketten worden als eerste + vergeleken met de eerste regel en zo verder. Eerst wordt + gekeken over de interfacenaam overeenkomt, daarna het + bron IP adres van het LAN en dan of het + een FTP pakket is. Als dat allemaal klopt, dan maakt de + speciale FTP proxy een tijdelijke filterregel die de + pakketten uit de FTP sessie naar binnen en buiten doorlaat + en ook NAT toepast op de FTP pakketten. Alle pakketten + van het LAN die niet van het protocoltype FTP zijn en dus + niet bij de eerste regel passen, worden tegen de derde + regel gehouden die van toepassing is vanwege de interface + en bron IP adres, zodat er dan + NAT op toegepast wordt. + + + + IPNAT FTP Filterregels + + Als de NAT FTP proxy wordt gebruikt + is er maar één filterregel voor FTP + nodig. Zonder de FTP proxy zouden er drie regels nodig + zijn: + + # Sta LAN client toe te FTP-en naar internet +# Actieve en passieve modes +pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state + +# Sta opzetten van het datakanaal voor passieve mode toe voor hoge poorten +pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state + +# Laat het datakanaal van de FTP server binnen voor actieve mode +pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state + + + + FTP <acronym>NAT</acronym> Proxy Bug + + Vanaf &os; 4.9, waar IPFILTER versie 3.4.31 bij zit, + werkt de FTP proxy volgens de documentatie tot de sessie + wordt afgesloten. Als dit wordt gedaan dan worden + pakketten die terug komen van de FTP server geblokkeerd en + gelogd als inkomend op poort 21. De NAT + FTP proxy lijkt zijn tijdelijke regels te vroeg te + verwijderen, nog voordat het antwoord van de FTP server + dat de verbinding gesloten kan worden is ontvangen. Er is + een PR gepost op de ipf mailinglijst. + + Hoewel dit niet opgelost kan worden, is het mogelijk + een regel in te stellen waarmee de ongewilde logboekregels + niet ontstaan. Als alternatief is het mogelijk ze gewoon + te negeren. Zo vaak wordt FTP nu ook weer niet gebruikt, + dus het is niet echt belangrijk. + + block in quick on rl0 proto tcp from any to any port = 21 + + + + + + IPFW + + IPFIREWALL (IPFW) is een firewall die binnen &os; wordt + ontwikkeld en onderhouden door vrijwilligers, leden van de + staf. Het maakt gebruik van verouderde staatloze regels en een + verouderde techniek om te realiseren wat eenvoudige stateful + logica zou kunnen heten. + + De staatloze syntaxis van IPFW is krachtig door de + technisch geavanceerde mogelijkheden van de regelsyntaxis die + de kennis van de gemiddelde gebruiker van firewalls ver + overstijgt. IPFW is gericht op de professionele gebruiker + of de gevorderde thuisgebruiker die hoge eisen stelt aan de + wijze waarop er met pakketten wordt omgegaan. Voordat de + kracht van de IPFW regels echt ingezet kan worden, moet de + gebruiker veel weten over de verschillende protocollen en + de wijze waarop pakketten in elkaar zitten. Het tot op dat + niveau behandelen van stof valt buiten de doelstellingen van + dit boek. + + IPFW bestaat uit zeven componenten: de verwerkingseenheid + voor de firewallregels, verantwoording, loggen, regels met + divert (omleiden) waarmee + NAT gebruikt kan worden en de speciale + gevorderde mogelijkheden voor bandbreedte management dummynet, + de bridge mogelijkheden en de ipstealth mogelijkheden. + + + IPFW Inschakelen + + IPFW zit bij de basisinstallatie van &os; als een losse + in run-time laadbare module. IPFW laadt dynamisch als kernel + module als in rc.conf + firewall_enable="YES" staat. IPFW hoeft + niet in de &os; kernel gecompileerd te worden, tenzij het + nodig is dat NAT beschikbaar is. + + Na het rebooten van een systeem met + firewall_enable="YES" in + rc.conf is het volgende bericht op het + scherm te zien tijdens het booten: + + IP packet filtering initialized, divert disabled, rule–based forwarding +enabled, default to deny, logging disabled + + Dit bericht kan genegeerd worden omdat het niet de juiste + status weergeeft van de laadbare IPFW module. De laadbare + module biedt wèl mogelijkheden voor loggen. + + Om de uitgebreid loggen limiet in te stellen is er een + instelling in /etc/sysctl.conf. Door + die te maken wordt loggen na een reboot ingeschakeld: + + net.inet.ip.fw.verbose_limit=5 + + + + Kernelopties + + Het is niet verplicht om IPFW in te schakelen door het + mee te compileren in de &os; kernel, tenzij de + NAT functionaliteit beschikbaar moet zijn. + Dit wordt alleen beschreven als achtergrondinformatie. + Door IPFW in de kernel te compileren wordt de laadbare module + niet gebruikt. + + options IPFIREWALL + + Met IPFIREWALL wordt IPFW ingeschakeld + als deel van de kernel. + + options IPFIREWALL_VERBOSE + + Met IPFIREWALL_VERBOSE wordt het + loggen van pakketten die worden verwerkt met IPFW mogelijk + als het sleutelwoord in een regel + staat. + + options IPFIREWALL_VERBOSE_LIMIT=5 + + Met IPFIREWALL_VERBOSE_LIMIT wordt het + aantal pakketten aangegeven dat standaard voor een regel + wordt gelogd. Zonder deze optie wordt ieder voorkomen van + hetzelfde pakket gelogd zodat uiteindelijk alle diskruimte + gebruikt kan worden zodat bepaalde functies niet meer + uitgevoerd zouden kunnen worden. In dit voorbeeld wordt een + uniek voorkomen maximaal vijf keer in het logboek + vermeld. + + options IPFIREWALL_DEFAULT_TO_ACCEPT + + Met IPFIREWALL_DEFAULT_TO_ACCEPT wordt + standaard alles door de firewall doorgelaten. Dit wordt + aangeraden als iemand voor het eerst een firewall + opzet. + + options IPV6FIREWALL +options IPV6FIREWALL_VERBOSE +options IPV6FIREWALL_VERBOSE_LIMIT +options IPV6FIREWALL_DEFAULT_TO_ACCEPT + + Voor de bovenstaande opties geldt dat ze hetzelfde doen + als de opties voor IPv4, alleen doen ze dat voor IPv6. Als + IPv6 niet wordt gebruikt, dan wordt aangeraden de optie + IPV6FIREWALL te gebruiken zonder regels, + zodat al het IPv6 verkeer wordt geblokkeerd. + + options IPDIVERT + + Met IPDIVERT wordt de + NAT functionaliteit ingeschakeld. + + + Als IPFIREWALL_DEFAULT_TO_ACCEPT + niet wordt gebruikt of de regels van de firewall staan geen + verkeer toe, dan worden alle pakketten van en naar de + machine waar dit voor geldt geblokkeerd. + + + + + <filename>/etc/rc.conf</filename> Opties + + Als IPFW niet in de kernel is gecompileerd, dan moet het + geladen worden met de volgende instellingen in + /etc/rc.conf: + + firewall_enable="YES" + + Om de firewallregels uit een bestand te laden kan de + volgende instelling gebruikt worden: + + firewall_script="/etc/ipfw.rules" + + Om loggen in te schakelen: + + firewall_logging="YES" + + + + Het Commando <command>IPFW</command> + + ipfw wordt gebruikt om met de hand + regels toe te voegen of te verwijderen als IPFW actief is. + Het probleem met deze methode is dat, als het systeem down + wordt gebracht, alle regels die gewijzigd of verwijderd zijn + verloren gaan. Door alle regels in een bestand op te nemen + dat bij het booten wordt geladen of door het bestand waarin + de wijzigingen zijn gemaakt als een machine draait te laden + bestaat die probleem niet. + + Met IPFW kunnen de actieve regels van + de firewall op het scherm getoond worden. De + verantwoordingsmogelijkeden van &man.ipfw.8; maken + dynamisch tellers aan voor iedere regel en houden die bij + voor alle pakketten die van toepassing zijn op die regel. + Dit biedt ook de mogelijkheid om een regel te testen. + + Om alle regels in volgorde te tonen: + + ipfw list + + Om alle regels te tonen met de tijd waarop deze voor het + laatst van toepassing was: + + ipfw –t list + + Het volgende commando kan gebruikt worden om de + verantwoordingsinformatie, pakettellers en de regel zelf te + tonen. De eerste kolom is het regelnummer met daarachter + het aantal keren dat de regel van toepassing was voor + inkomend verkeer, gevolgd door het aantal keren dat de regel + van toepassing was voor uitgaand verkeer. Als laatste wordt + de regel zelf getoond: + + ipfw –a list + + Ook kunnen onder de statische regels de dynamische regels + getoond worden: + + ipfw –d list + + En de dynamische regels die verlopen zijn: + + ipfw –d –e list + + De tellers op nul gesteld worden: + + ipfw zero + + Alleen de tellers voor regel + NUM op nul stellen: + + ipfw zero NUM + + + + Sets van IPFW Regels + + Een set regels is een groep &man.ipfw.8; regels die is + gemaakt om pakketten toe te staan of te blokkeren op basis + van de eigenschappen van dat pakket. De bi-directionele + uitwisseling van pakketten tussen hosts bestaat uit een + gesprek dat een sessie heet. De set van firewallregels + beoordeelt pakketten twee keer: als het aankomt van de host + op het publieke internet en als het de host weer verlaat op + de weg terug naar de host op het publieke internet. Iedere + TCP/IP dienst als + telnet, www, mail, etc, heeft zijn eigen protocol, bron + IP adres en bestemmings + IP adres of de bron- en bestemmingspoort. + Deze attributen vormen de basis voor het opstellen van + regels waarmee diensten toegelaten of geblokkeerd kunnen + worden. + + Als een pakket de firewall binnenkomt wordt het + vergeleken met de eerste regel in de set regels en zo gaat + dat voor iedere regel vanaf boven tot beneden. Als een + regel van toepassing is op een pakket, dan wordt het + actieveld van de regel uitgevoerd. Dit wordt de + de eerst passende regel wint zoekmethode + genoemd. Als een pakket bij geen enkele regel past, dan + wordt de standaardregel 65535 toegepast, die alle pakketten + weigert zonder een antwoord terug te sturen naar de + verzender. + + De instructies in dit onderdeel zijn gebaseerd op regels + die gebruik maken van de stateful opties keep + state, limit, + in/out en + via. Dit is het raamwerk waarmee een + set van inclusieve firewallregels wordt samengesteld. + + Een inclusieve firewall staat alleen diensten toe die + voldoen aan de regels. Op die manier kan er in de hand + gehouden worden welke diensten van binnen de firewall naar + buiten mogen en welke diensten op het private netwerk vanaf + het internet bereikbaar zijn. Al het andere verkeer wordt + vanuit het ontwerp standaard geblokkeerd en gelogd. + Inclusieve firewalls zijn veel veiliger dan exclusieve + firewalls. Het is ook de enige wijze voor de opzet van een + firewall die in dit hoofdstuk wordt behandeld. + + + Er wordt aangeraden voorzichtig te zijn als er vanaf + het netwerk aan de firewallregels wordt gewerkt omdat het + gevaar bestaat buitengesloten te worden. + + + + Regelsyntaxis + + De regelsyntaxis zoals hier toegelicht is vereenvoudigd + door alleen te tonen wat nodig is om een standaard + inclusieve set met firewallregels te maken. De complete + beschijving van alle mogelijkheden staat in + &man.ipfw.8;. + + Regels bevatten sleutelwoorden die in een bepaalde + volgorde van links naar rechts op een regel horen te staan. + Sleutelwoorden worden vet weergegeven. Sommige + sleutelwoorden hebben subopties die zelf ook weer + sleutelwoorden hebben die ook weer subopties kunnen + hebben. + + Het karakter # wordt gebruikt om + het begin van een opmerking te markeren en kan zowel op een + eigen regel als achter een firewallregel staan. Lege + regels worden genegeerd. + + CMD REGEL# ACTIE LOGGEN SELECTIE + STATEFUL + + + CMD + + Iedere regel moet beginnen met + add om hem toe te voegen aan de + tabel met regels. + + + + REGEL# + + Iedere regel moet een regelnummer hebben. + + + + ACTIE + + Bij een regel kunnen één of meer acties + horen die worden uitgevoerd als een regel geldt voor een + pakket. + + allow | accept | pass | + permit + + Deze opties betekenen allemaal hetzelfde: als de + regel geldt voor een pakket, laat dat pakket dan door en + stop met het zoeken naar geldende regels. + + check–state + + Vergelijkt het pakket met de tabel met dynamische + regels. Als het erin staat, dan wordt de actie van + de dynamisch door deze regel gemaakte regel uitgevoerd. + Anders wordt er verder gezocht door de regels. Een + regel met check–state heeft + geen selectiecriteria. Als er geen regel met + check–state in de set met + regels staat, dan wordt de tabel met dynamische regels + bij het eerste voorkomen van + keep–state of + limit gecontroleerd. + + deny | drop + + Deze opties betekenen hetzelfde: als de regel geldt + voor een pakket, blokkeer dat pakket dan en stop met het + zoeken naar geldende regels. + + + + Loggen + + log of + logamount + + Als een regel met het sleutelwoord + log van toepassing is op een + pakket, dan wordt er een bericht naar &man.syslogd.8; + geschreven met de facilitynaam SECURITY. Er wordt alleen + een bericht geschreven als het aantal voor die regel + gelogde pakketten niet groter is dan de instelling + logamount. Als + logamount niet is ingesteld, dan + wordt de limiet uit de &man.sysctl.8; variabele + net.inet.ip.fw.verbose_limit gehaald. In beide gevallen + bestaat er in het geval de waarde nul is geen limiet. + Als de limiet is bereikt, dan kan het loggen weer + ingeschakeld worden door de teller voor het loggen weer + op nul te stlelen voor die regel met + ipfw + zero. + + + Er wordt gelogd als een pakket zeker past bij een + regel, maar voordat de actie (bijvoorbeeld + accept of + deny) op een pakket wordt + toegepast. Uiteindelijk bepaalt de gebruiker zelf voor + welke regels loggen wordt ingeschakeld. + + + + + Selectie + + De sleutelwoorden in deze paragraaf beschrijven de + attributen van een pakket die bekeken worden bij het + bepalen of een regel wel of niet op een pakket van + toepassing is. De attributen waarop gecontroleerd kan + worden moeten in de beschreven volgorde gebruikt + worden. + + udp | tcp | icmp + + Naast de hierboven aangegeven protocollen kunnen alle + in /etc/protocols beschreven + protocollen gebruikt worden. De waarde die wordt + opgegeven is het protocol dat van toepassing moet zijn. + Dit attribuut is verpicht. + + from bron to best + + De sleutelwoorden from en + to worden gebruikt om te bekijken + of een regel van toepassing is op IP + adressen. Een regel moet zowel bron- als + bestemmingsadressen bevatten. any + is een bijzonder sleutelwoord dat van toepassing is op + alle IP adressen. + me is een bijzonder sleutelwoord + dat van toepassing is op alle IP + adressen die ingesteld zijn op interfaces van een &os; + systeem. Zo kan dit onderdeel dus bijvoorbeeld de + volgende vormen aannemen: + from me to any, + from any to me, + from 0.0.0.0/0 to any, + from any to 0.0.0.0/0, + from 0.0.0.0 to any, + from any to 0.0.0.0, + from me to 0.0.0.0. + IP adressen mogen ingevoerd worden + in de vorm numeriek, door punten gescheiden + adres/maskerlengte of als een enkelvoudig + IP adres in de vorm numeriek, door + punten gescheiden. De volgende link kan hulp verschaffen + bij het schrijven van IP adressen in + de vorm adres/maskerlengte: Dit attribuut + is verpicht. + + poortnummer + + Wordt gebruikt voor protocollen die poortnummers + ondersteunen (als TCP en UDP). Het + gebruik van een poortnummer is verplicht. Er mogen ook + dienstnamen uit /etc/services + gebruikt worden in plaats van nummers. + + in | out + + Is op respectievelijk inkomende of uitgaande + pakketten van toepassing. De sleutelwoorden + in of out + zijn verplicht in een regel. + + via IF + + Deze parameter geeft aan op welke interface de regel + van toepassing is, waarbij IF de + exacte naam van de bedoelde interface is. + + setup + + Dit is een verplicht sleutelwoord waarmee wordt + aangegeven dat er gezocht wordt naar een pakket met het + verzoek tot het opstarten van een TCP + sessie. + + keep–state + + Dit is een verplicht sleutelwoord. Als er een pakket + op een regel met keep–state + van toepassing is, dan wordt er door de firewall een + dynamische regel gemaakt die bi–directioneel + verkeer zal toestaan tussen bron en bestemming en de + bijbehorende poorten voor hetzelfde protocol. + + limit {bron–adr | bron–poort | + best–adr | best–poort} + + De firewall staat maar N + verbindingen toe met dezelfde groep parameters uit een + regel. Er kunnen één of meer van de + parameters bron- of bestemmingsadres en bron- en + bestemmingspoort gebruikt worden. + limit en + keep–state kunnen niet in + dezelfde regel gebruikt worden. + limit geeft dezelfde mogelijkheden + als keep–state en voegt daar + zijn eigen mogelijkheden aan toe. + + + + + Stateful Optie + + Bij stateful filteren wordt verkeer bekeken als + bi–directioneel verkeer dat samen een sessie vormt. + Het heeft de mogelijkheid om te bepalen of de sessie + tussen de zender en de ontvanger op de juiste wijze + voortgaat. Alle pakketten die niet precies in de + verwachting van een sessie passen worden automatisch als + fout geblokkeerd. + + check–state wordt gebruikt + om aan te geven waar IPFW regels tegen de mogelijkheden + voor dynamische regels gehouden moeten worden. Als er + een passende regel bij een pakket wordt gevonden, dan kan + dat pakket de firewall verlaten en wordt een nieuwe regel + gemaakt voor het volgende pakket dat wordt verwacht in de + sessie. Als er geen regel van toepassing is op het pakket, + dan wordt de volgende regel in de groep regels + getest. + + De mogelijkheden voor dynamische regels zijn kwetsbaar + voor een aanval die SYN–flood heet, waarmee wordt + geprobeerd een zeer groot aantal regels aan te laten maken. + Om deze aanval tegen te gaan, is er vanaf &os; versie 4.5 + de optie limit beschikbaar. Met deze + optie kan het maximaal aantal simultane sessies geregeld + worden op basis van bron en bestemmingsvelden. Als het + aantal sessies gelijk aan het maximale aantal sessies is, + wordt een pakket voor een nieuwe sessie geweigerd. + + + + Firewallberichten Loggen + + De voordelen van loggen zijn duidelijk. Het biedt de + mogelijkheid om na het feit informatie na te zien als: + welke pakketten heeft de firewall laten vallen, waar kwamen + ze vandaan en waar gingen ze heen. Dit zijn allemaal + voordelen als het gaat om uitvinden waar een aanvaller + vandaan komt en wat hij heeft geprobeerd. + + Zelfs als logging is ingeschakeld logt IPFW nog niets + uit zichzelf. De beheerder van de firewall beslist welke + actieve regels iets weg moeten schrijven door het + sleutelwoord log aan die regels toe + te voegen. Gewoonlijk worden alleen + deny regels gelogd. Dit geldt + bijvoorbeeld voor de deny regel + voor inkomende ICMP pings. Het is + gebruikelijk om de standaard ipfw regel + te dupliceren, daar log in op te + nemen, en deze als laatste in de set met regels te + plaatsen. Zo zijn alle pakketten te zien die niet voldeden + aan ook maar één regel. + + Loggen heeft ook mogelijke nadelen. Het is mogelijk om + te veel te loggen en dan om te komen in logboekgegevens + die uiteindelijk een disk kunnen vullen. Een DoS aanval + om een disk met logs te vullen is een van de oudst bekende + typen DoS aanvallen. Logberichten van de firewall worden + niet alleen naar &man.syslogd.8; geschreven, maar ook op + het root console getoond waar ze snel + erg vervelend kunnen worden. + + De kerneloptie + IPFIREWALL_VERBOSE_LIMIT=5 beperkt het + aantal opeenvolgende berichten dat naar &man.syslogd.8; + wordt geschreven voor één specifieke regel. + Als deze optie is ingeschakeld, worden in dit geval + maximaal vijf berichten voor dezelfde regel gemeld. Als er + meer berichten op dezelfde regel zouden zijn, zou dat als + volgt aan &man.syslogd.8; gemeld worden: + + last message repeated 45 times + + Standaard worden alle gelogde pakketten weggeschreven + naar /var/log/security, wat is + ingesteld in /etc/syslog.conf. + + + + Regelscript Bouwen + + De meeste ervaren gebruikers van IPFW maken een bestand + waarin de regels staan en stellen dat zo op dat het als + script uitgevoerd kan worden. Het grootste voordeel van + deze methode is dat de firewallregels allemaal vervangen + kunnen worden zonder dat het systeem geboot moet worden. + Deze methode is ook erg geschikt voor het testen van regels + omdat de procedure zo vaak als nodig uitgevoerd kan worden. + Omdat het een script is, kan er gebruik gemaakt worden van + substitutie zodat veel gebruikte waarden verduidelijkt + kunnen worden. In het volgende voorbeeld wordt hier + gebruik van gemaakt. + + De syntaxis die in het script wordt gebruikt is + compatibel met de shells sh, + csh en tcsh. Velden + waarvoor substitutie van toepassing is worden vooraf gegaan + door het dollarteken $. Definities worden niet + vooraf gegaan door het voorvoegsel $. De waarden + van een definitie moet omsloten worden door "dubbele + aanhalingstekens". + + Een bestand met regels kan als volgt beginnen: + + ############### begin voorbeeldscript ipfw regels ############## +# +ipfw –q –f flush # Verwijder alle bestaande regels. +# Stel standaarden in. +oif="tun0" # uitgaande interface. +odns="192.0.2.11" # IP adres DNS server ISP. +cmd="ipfw –q add " # Voorvoegsel voor regel. +ks="keep–state" # Te lui om iedere keer in te typen. +$cmd 00500 check–state +$cmd 00502 deny all from any to any frag +$cmd 00501 deny tcp from any to any established +$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks +$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks +$cmd 00611 allow udp from any to $odns 53 out via $oif $ks +################### einde voorbeeldscript ipfw regels ########### + + Dat is alles. De feitelijke functie van de regels is + in dit voorbeeld van ondergeschikt belang. Dit was slechts + een voorbeeld om het gebruik van substitutie te + illustreren. + + Als het bovenstaande voorbeeld het de inhoud van + /etc/ipfw.rules was, dan kon het + herladen worden met het volgende commando: + + sh /etc/ipfw.rules + + /etc/ipfw.rules zou overal kunnen + staan met iedere gewenste naam. + + Wat in het bovenstaande voorbeeld met een bestand is + gerealiseerd, kan ook met de hand: + + ipfw –q –f flush +ipfw –q add 00500 check–state +ipfw –q add 00502 deny all from any to any frag +ipfw –q add 00501 deny tcp from any to any established +ipfw –q add 00600 allow tcp from any to any 80 out via tun0 setup keep–state +ipfw –q add 00610 allow tcp from any to 192.0.2.11 53 out via tun0 setup keep–state +ipfw –q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep–state + + + + Set met Stateful Regels + + De volgende set met regels, waarin geen gebruik gemaakt + wordt van NAT, is een voorbeeld van hoe + een erg veilige inclusieve firewall kan worden opgezet. + Een inclusieve firewall laat alleen diensten toe waarvoor + pass regels van toepassing zijn en + blokkeert al het andere verkeer. Alle firewalls hebben + tenminste twee interfaces waarvoor regels moeten zijn die + de firewall in staat stellen zijn werk te doen. + + Alle &unix; systemen en dus ook &os; zijn zo ontworpen + dat ze voor interne communicatie de interface + lo0 en IP adres + 127.0.0.1 gebruiken. De firewall moet dit interne verkeer + gewoon doorgang laten vinden. + + Voor de interface die is verbonden met het publieke + internet worden regels gemaakt waarmee sessies naar het + internet mogelijk gemaakt worden en toegang wordt gegeven + voor pakketten die uit die sessies terug komen. Dit kan + de PPP interface tun0 zijn of de + netwerkkaart die is verbonden met een xDSL of + kabelmodem. + + In gevallen dat er meer dan één + netwerkkaart is aangesloten op het private netwerk achter + de firewall, moeten er op de firewall regels zijn om het + verkeer tussen die interfaces vrije doorgang te + geven. + + De regels worden opgedeeld in drie onderdelen: alle + interfaces met vrije doorgang, uitgaand op publieke + interfaces en inkomend op publieke interfaces. + + De volgorde van de regels in iedere sectie voor + publieke interfaces moet zo zijn dat de regels die het + meest gebruikt worden vóór de regels staan + die minder vaak gebruikt worden. De laatste regel van een + onderdeel geeft aan dat al het overige verkeer op die + interface in die richting geblokkeerd en gelogd moet + worden. + + In het onderdeel Uitgaand staan alleen regels met + allow die parameters bevatten om + individuele diensten beschikbaar te maken zodat er internet + toegang is. Al die regels moeten gebruik maken van + proto, port, + in/out, via + en keep-state. De regels met + proto tcp maken ook gebruik van + setup om te bekijken of het een + pakket betreft voor het opzetten van een sessie om de + stateful functionaliteit aan te sturen. + + In het onderdeel Inkomend staan alle regels voor het + blokkeren van ongewenste pakketten eerst om twee redenen. + Als eerste kan het zo zijn dat wat er wordt geblokkeerd + later toegestaan zou worden door regels die diensten + toestaan. De tweede reden is dat nu ongewenste pakketten + die vaak voorkomen en die bij voorkeur niet in de logboeken + voorkomen niet meer van toepassing zijn op de laatste regel + van het onderdeel waarin ze zouden worden gelogd. Met de + laatste regel van dit onderdeel worden alle overige + pakketten geblokkeerd en gelogd en ze kunnen + bewijsmateriaal zijn in een zaak tegen iemand die heeft + geprobeerd een systeem aan te vallen. + + Voor al het verkeer dat wordt geweigerd wordt geen + antwoord gestuurd. Die pakketten verdwijnen gewoon. Zo + weet een aanvaller niet of een pakket het doelsysteem wel + heeft bereikt. Zo kan een aanvaller geen informatie + verzamelen over een systeem: hoe minder informatie er over + een systeem beschikbaar is, hoe veiliger het is. Als er + pakketten gelogd worden waarvan de beheerder het + poortnummer niet herkent, dan is op + de functie van dat poortnummer na te zoeken. Op de + volgende link worden poortnummers van Trojans beschreven: + . + + + + Voorbeeld van een Set Inclusieve Regels + + Het volgende voorbeeld is een complete inclusieve set + regels die geen gebruik maakt van NAT. + Deze set met regels is een aanrader en eenvoudig aan te + passen door commentaar te maken van een regel voor een + dienst die niet gewenst is. Logberichten die niet gewenst + zijn, zijn uit te sluiten door ze met een regel te + blokkeren in het begin van het onderdeel Inkomend. Voor de + onderstaande regels dient de dc0 + interfacenaam in iedere regel vervangen te worden door de + interfacenaam van de netwerkkaart in het systeem die met + het publieke internet is verbonden. Voor gebruikers van + PPP zou dat tun0 zijn. + + Er zit een structuur in de regels: + + + + Alle regels die controleren op het verzoek voor het + opzetten van een sessie gebruiken + keep–state. + + + + Alle diensten die vanaf internet bereikbaar zijn + gebruiken limit om + flooding te voorkomen. + + + + Alle regels gebruiken in of + out om de richting aan te + geven. + + + + Alle regels gebruiken via + interfacenaam om aan te geven op welke + interface de regel van toepassing is. + + + + De volgende regels zouden in + /etc/ipfw.rules kunnen staan: + + ################ Begin bestand met IPFW regels ############################### +# Verwijder eerst de bestaande regels. +ipfw –q –f flush + +# Stel commando voorvoegsel in. +cmd="ipfw –q add" +pif="dc0" # Interfacenaam van NIC die verbinding + # met het publieke internet heeft. + +################################################################# +# Geen beperkingen op de interface aan de LAN kant. Alleen nodig +# als er een LAN is. Wijzig xl0 naar de gebruikte interfacenaam. +################################################################# +#$cmd 00005 allow all from any to any via xl0 + +################################################################# +# Geen beperkingen op de loopback interface. +################################################################# +$cmd 00010 allow all from any to any via lo0 + +################################################################# +# Sta het pakket toe als het aan de tabel met dynamische regels +# was toegevoegd met een 'allow keep–state' commando. +################################################################# +$cmd 00015 check–state + +################################################################# +# Interface aan het publieke internet (onderdeel Uitgaand). +# Inspecteer verzoeken om een sessie te starten van achter de +# firewall op het private netwerk of vanaf de server zelf naar +# het publieke internet. +################################################################# + +# Geef toegang tot de DNS server van de ISP. +# x.x.x.x moet het IP adres van de DNS van de ISP zijn. +# Dupliceer deze regels als een ISP meedere DNS servers heeft. +# Haal het IP adres evt. uit /etc/resolv.conf +$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep–state +$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep–state + +# Geef toegang tot de DHCP server van de ISP voor kabel- en +# xDSL-netwerken. Deze regel is niet nodig als gebruik gemaakt worden +# van PPP naar het publieke internet. In dat geval kan de hele groep +# verwijderd worden. Gebruik de volgende regel en controleer het +# logboek voor het IP adres. Wijzig dan het IP adres in de regel +# commentaar hieronder en verwijder de eerste regel. +$cmd 00120 allow log udp from any to any 67 out via $pif keep–state +#$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep–state + +# Sta niet beveiligd www verkeer toe. +$cmd 00200 allow tcp from any to any 80 out via $pif setup keep–state + +# Sta beveiligd www verkeer over TLS SSL toe. +$cmd 00220 allow tcp from any to any 443 out via $pif setup keep–state + +# Sta het verzenden en ontvangen van e-mail toe. +$cmd 00230 allow tcp from any to any 25 out via $pif setup keep–state +$cmd 00231 allow tcp from any to any 110 out via $pif setup keep–state + +# Sta de FreeBSD CVSUP functie toe voor uid root. +$cmd 00240 allow tcp from me to any out via $pif setup keep–state uid root + +# Sta ping toe. +$cmd 00250 allow icmp from any to any out via $pif keep–state + +# Sta Time toe naar buiten. +$cmd 00260 allow tcp from any to any 37 out via $pif setup keep–state + +# Sta NNTP nieuws toe naar buiten. +$cmd 00270 allow tcp from any to any 119 out via $pif setup keep–state + +# Sta beveiligde FTP, Telnet en SCP toe naar buiten. +# Deze functie maakt gebruik van SSH (secure shell). +$cmd 00280 allow tcp from any to any 22 out via $pif setup keep–state + +# Sta whois toe naar buiten. +$cmd 00290 allow tcp from any to any 43 out via $pif setup keep–state + +# Blokkeer en log al het andere dat probeert buiten te komen. +# Deze regel dwingt de 'block all' logica af. +$cmd 00299 deny log all from any to any out via $pif + +################################################################# +# Interface aan het publieke internet (onderdeel Inkomend). +# Inspecteert pakketten die van het publieke internet komen +# met als bestemming de host zelf of het private netwerk. +################################################################# + +# Blokkeer al het verkeer voor niet-routeerbare of gereserveerde +# adresreeksen. +$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 privaat IP +$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 privaat IP +$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 privaat IP +$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback +$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback +$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto–config +$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #gereserveerd voor documentatie +$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect +$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Klasse D & E multicast + +# Blokkeer publieke pings. +$cmd 00310 deny icmp from any to any in via $pif + +# Blokkeer ident. +$cmd 00315 deny tcp from any to any 113 in via $pif + +# Blokkeer alle Netbios diensten. 137=naam, 138=datagram, 139=sessie. +# Netbios is de Windows® bestandsdeeldienst. +# Blokkeer Windows hosts2 name server verzoeken 81. +$cmd 00320 deny tcp from any to any 137 in via $pif +$cmd 00321 deny tcp from any to any 138 in via $pif +$cmd 00322 deny tcp from any to any 139 in via $pif +$cmd 00323 deny tcp from any to any 81 in via $pif + +# Blokkeer gefragmenteerde pakketten. +$cmd 00330 deny all from any to any frag in via $pif + +# Blokkeer ACK pakketten die niet in de table met dynamische regels +# staan. +$cmd 00332 deny tcp from any to any established in via $pif + +# Geef toegang tot de DHCP server van de ISP voor kabel- en +# xDSL-netwerken. Deze regel is niet nodig als gebruik gemaakt worden +# van PPP naar het publieke internet. In dat geval kan de hele groep +# verwijderd worden. Hier wordt hetzelfde IP adres gebruikt als in de +# sectie voor Uitgaand verkeer. +#$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep–state + +# Sta inkomend webverkeer toe omdat er een Apache server draait. +$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src–addr 2 + +# Sta beveiligde FTP, telnet en SCP toe vanaf internet. +$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src–addr 2 + +# Sta niet beveiligde telnet sessie toe vanaf het publieke internet. +# Dit heeft het label ``niet veilig'' omdat gebruikersnaam en +# wachtwoord als platte tekst over internet gaan. Als er geen telnet +# server draait, hoeft deze regel niet actief te zijn. +$cmd 00420 allow tcp from any to me 23 in via $pif setup limit src–addr 2 + +# Weiger en log alle niet toegestane inkomende verbindingen van buiten. +$cmd 00499 deny log all from any to any in via $pif + +# Al het andere verkeer wordt standaard geblokkeerd. Weiger en log alle +# pakketten die tot hier zijn gekomen om te bekijken welke het waren. +$cmd 00999 deny log all from any to any +################ Einde bestand met IPFW regels ######################## + + + + Voorbeeld <acronym>NAT</acronym> en Stateful + Regels + + Om NAT met IPFW te gebruiken moeten + een aantal instellingen gemaakt worden. In het + instellingenbestand voor de kernel moet option + divert toegevoegd worden aan de andere + IPFIREWALL opties. + + Naast de normale IPFW opties in + /etc/rc.conf zijn de volgende + nodig: + + natd_enable="YES" # Schakel NATD in +natd_interface="rl0" # interfacenaam voor de publieke internet NIC +natd_flags="–dynamic –m" # –m = behoud poortnummers als mogelijk + + Stateful regels samen met de + divert natd regel gebruiken maakt + het schrijven van regels veel gecompliceerder. De plaats + van de regels met check–state + en divert natd zijn van kritiek + belang. De logica bestaat niet langer uit het eenvoudigweg + van boven naar beneden doorwerken van de regels. Er wordt + dan ook een nieuw type actie gebruik: + skipto. Bij het gebruik van + skipto is het verplicht iedere regel + te nummeren zodat duidelijk is waar een + skipto precies heen springt. + + Hieronder staat een groep regels zonder commentaar + waarin een manier om pakketten door de groep regels te + leiden wordt aangegeven. + + De verwerking begint met de eerste regel en er wordt + steeds een volgende regel gecontroleerd tot het einde + wordt bereikt of totdat een regel op het gecontroleerde + pakket van toepassing is, op dat pakket wordt toegepast + en de verwerking van regels daardoor stopt. In het + voorbeeld zijn de regels 100, 101, 450, 500, and 510 van + belang. Die regels regelen de vertaling van inkomende en + uitgaande pakketten zodat er in de tabel met de + dynamische keep–state regels + altijd het private IP adres staat. + Daarnaast is het van belang op te merken dat er in alle + allow en + deny regels de richting van het + pakket wordt gecontroleerd (inkomend of uitgaand) en over + welke interface het pakket gaat. Merk ook op dat alle + uitgaande verzoeken voor het starten van een sessie met + een skipto naar regel 500 gaan voor + NAT. + + Stel dat een gebruiker zijn webbrowser gebruikt om een + webpagina op te halen. Webpagina's gebruiken poort 80 voor + communicatie. Er komt een pakket de firewall binnen dat + niet past bij regel 100 omdat het naar buiten gaat en niet + naar binnen. Het komt voorbij regel 101 omdat dit het + eerste pakket is en er dus nog niets voor in de dynamische + keep-state tabel staat. Als het pakket bij 125 aankomt + blijkt het te passen bij die regel. Het gaat naar buiten + door de interface aan het publieke internet. Het pakket + heeft dan nog steeds het bron IP adres + van het private LAN. Als blijkt dat deze regel geldt, dan + gebeuren er twee dingen: door + keep–state wordt er een regel + in de dynamische keep–state tabel gezet en wordt de + aangegeven actie uitgevoerd. De actie is onderdeel van de + informatie uit de dynamische tabel. In dit geval is het + skipto 500. In regel 500 wordt + NAT op het IP adres + van het pakket toegepast en dan kan het weg. Het volgende + is van groot belang. Dit pakket komt aan op zijn + bestemming en als er een antwoord terug komt, dan begint de + verwerking van dat pakket weer van voor af aan. Nu voldoet + het aan regel 100 en dus wordt het bestemmingsadres + vertaald naar het bijbehorende IP adres + op het LAN. Daarna past het bij de + check–state regel en wordt een + vermelding in de tabel gevonden wat betekent dat er een + bestaande sessie is en wordt het doorgelaten naar het LAN. + Het gaat dan naar de PC op het LAN die als eerste een + pakket heeft verzonden en die verstuurt een nieuw pakket + met de vraag om een volgend segment met data naar de + server. Nu blijkt bij controle van de + check–state regel dat die op + het pakket van toepassing moet zijn en er staat een + vermelding in de tabel voor uitgaand verkeer. Daarom wordt + de bijbehorende actie skipto 500 + uitgevoerd. Het pakket springt naar regel 500, er wordt + NAT op toegepast en het kan zijn weg + vervolgen. + + Wat betreft binnenkomende pakketten wordt alles dat + onderdeel is van een bestaande sessie automatisch + afgehandeld door de + check–state regel en de juist + geplaatste divert natd regels. Nu + hoeven alleen de foute pakketten nog geweigerd te worden + en moet ondersteuning voor inkomende diensten ingesteld + worden. In dit geval draait er een Apache server op de + gateway machine die vanaf internet bereikbaar moet zijn. + Het nieuwe inkomende pakket past bij regel 100 en het + IP adres wordt aangepast aan het interne + IP adres van de gateway machine. Dat + pakket wordt dan gecontroleerd op alle ongewenste + eigenschappen en komt uiteindelijk aan bij regel 425 die + van toepassing blijkt te zijn. In dat geval kunnen er twee + dingen gebeuren: limit is een + uitbreiding van check–state. + De pakketregel wordt in de dynamische keep–state + tabel gezet, maar nu wordt het aantal nieuwe sessies dat + van het bron IP adres komt gelimiteerd + tot twee. Dit is een bescherming tegen DoS aanvallen op + de dienst die op dat poortnummer wordt aangeboden. De + actie is allow, dus het pakket wordt + tot het LAN toegelaten. Voor het antwoord herkent de + check–state regel dat het + pakket bij een bestaande sessie hoort, stuurt het naar + regel 500 voor NAT en stuurt het via + de uitgaande interface weg. + + Voorbeeld Set Regels #1: + + #!/bin/sh +cmd="ipfw –q add" +skip="skipto 500" +pif=rl0 +ks="keep–state" +good_tcpo="22,25,37,43,53,80,443,110,119" + +ipfw –q –f flush + +$cmd 002 allow all from any to any via xl0 # exclude Lan traffic +$cmd 003 allow all from any to any via lo0 # exclude loopback traffic + +$cmd 100 divert natd ip from any to any in via $pif +$cmd 101 check–state + +# Toegestaan uitgaand verkeer. +$cmd 120 $skip udp from any to xx.168.240.2 53 out via $pif $ks +$cmd 121 $skip udp from any to xx.168.240.5 53 out via $pif $ks +$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks +$cmd 130 $skip icmp from any to any out via $pif $ks +$cmd 135 $skip udp from any to any 123 out via $pif $ks + +# Blokkeer al het verkeer voor niet-routeerbare of gereserveerde +# adresreeksen. +$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 privaat IP +$cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 privaat IP +$cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 privaat IP +$cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback +$cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback +$cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto–config +$cmd 306 deny all from 192.0.2.0/24 to any in via $pif #gereserveerd voor documentatie +$cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster +$cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Klasse D & E multicast + +# Toegestaan inkomend verkeer. +$cmd 400 allow udp from xx.70.207.54 to any 68 in $ks +$cmd 420 allow tcp from any to me 80 in via $pif setup limit src–addr 1 + +$cmd 450 deny log ip from any to any + +# Dit is de 'skipto' locatie voor de uitgaande stateful regels. +$cmd 500 divert natd ip from any to any out via $pif +$cmd 510 allow ip from any to any + +######################## Einde regels ################## + + Het volgende voorbeeld doet vrijwel hetzelfde als het + bovenstaande, maar volgt een zelfdocumenterende stijl voor + het opstellen van regels en commentaar waardoor minder + ervaren gebruikers beter kunnen begrijpen wat de regels + doen. + + Voorbeeld Set Regels #2: + + +#!/bin/sh +################ Begin bestand met IPFW regels ############################### +# Verwijder eerst de bestaande regels. +ipfw –q –f flush + +# Stel commando voorvoegsel in. +cmd="ipfw –q add" +skip="skipto 800" +pif="rl0" # Interfacenaam van NIC die verbinding + # met het publieke internet heeft. + +################################################################# +# Geen beperkingen op de interface aan de LAN kant. +# Wijzig xl0 naar de gebruikte interfacenaam. +################################################################# +$cmd 005 allow all from any to any via xl0 + +################################################################# +# Geen beperkingen op de loopback interface. +################################################################# +$cmd 010 allow all from any to any via lo0 + +################################################################# +# Controleer of pakket inkomend is. NAT in dat geval. +################################################################# +$cmd 014 divert natd ip from any to any in via $pif + +################################################################# +# Sta het pakket toe als het aan de tabel met dynamische regels +# was toegevoegd met een 'allow keep–state' commando. +################################################################# +$cmd 015 check–state + +################################################################# +# Interface aan het publieke internet (onderdeel Uitgaand). +# Inspecteer verzoeken om een sessie te starten van achter de +# firewall op het private netwerk of vanaf de server zelf naar +# het publieke internet. +################################################################# + +# Geef toegang tot de DNS server van de ISP. +# x.x.x.x moet het IP adres van de DNS van de ISP zijn. +# Dupliceer deze regels als een ISP meedere DNS servers heeft. +# Haal het IP adres evt. uit /etc/resolv.conf +$cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep–state + +# Geef toegang tot de DHCP server van de ISP voor kabel en xDSL. +$cmd 030 $skip udp from any to x.x.x.x 67 out via $pif keep–state + +# Sta niet beveiligd www verkeer toe. +$cmd 040 $skip tcp from any to any 80 out via $pif setup keep–state + +# Sta beveiligd www verkeer over TLS SSL toe. +$cmd 050 $skip tcp from any to any 443 out via $pif setup keep–state + +# Sta het verzenden en ontvangen van e-mail toe. +$cmd 060 $skip tcp from any to any 25 out via $pif setup keep–state +$cmd 061 $skip tcp from any to any 110 out via $pif setup keep–state + +# Sta de FreeBSD CVSUP functie toe voor uid root. +$cmd 070 $skip tcp from me to any out via $pif setup keep–state uid root + +# Sta ping toe naar het publieke internet. +$cmd 080 $skip icmp from any to any out via $pif keep–state + +# Sta Time toe. +$cmd 090 $skip tcp from any to any 37 out via $pif setup keep–state + +# Sta NNTP nieuws toe. +$cmd 100 $skip tcp from any to any 119 out via $pif setup keep–state + +# Sta beveiligde FTP, Telnet en SCP toe. +# Deze functie maakt gebruik van SSH (secure shell). +$cmd 110 $skip tcp from any to any 22 out via $pif setup keep–state + +# Sta whois toe. +$cmd 120 $skip tcp from any to any 43 out via $pif setup keep–state + +# Sta NPT tijdserver toe. +$cmd 130 $skip udp from any to any 123 out via $pif keep–state + +################################################################# +# Interface aan het publieke internet (onderdeel Inkomend). +# Inspecteert pakketten die van het publieke internet komen +# met als bestemming de host zelf of het private netwerk. +################################################################# + +# Blokkeer al het verkeer voor niet-routeerbare of gereserveerde +# adresreeksen. +$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 privaat IP +$cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 privaat IP +$cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 privaat IP +$cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback +$cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback +$cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto–config +$cmd 306 deny all from 192.0.2.0/24 to any in via $pif #gereserveerd voor documentatie +$cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster +$cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Klasse D & E multicast + +# Blokkeer ident. +$cmd 315 deny tcp from any to any 113 in via $pif + +# Blokkeer alle Netbios diensten. 137=naam, 138=datagram, 139=sessie. +# Netbios is de Windows® bestandsdeeldienst. +# Blokkeer Windows hosts2 name server verzoeken 81. +$cmd 320 deny tcp from any to any 137 in via $pif +$cmd 321 deny tcp from any to any 138 in via $pif +$cmd 322 deny tcp from any to any 139 in via $pif +$cmd 323 deny tcp from any to any 81 in via $pif + +# Blokkeer gefragmenteerde pakketten. +$cmd 330 deny all from any to any frag in via $pif + +# Blokkeer ACK pakketten die niet in de table met dynamische regels +# staan. +$cmd 332 deny tcp from any to any established in via $pif + +# Geef toegang tot de DHCP server van de ISP voor kabel- en +# xDSL-netwerken. Deze regel is niet nodig als gebruik gemaakt worden +# van PPP naar het publieke internet. In dat geval kan de hele groep +# verwijderd worden. Hier wordt hetzelfde IP adres gebruikt als in de +# sectie voor Uitgaand verkeer. +$cmd 360 allow udp from x.x.x.x to any 68 in via $pif keep–state + +# Sta inkomend webverkeer toe omdat er een Apache server draait. +$cmd 370 allow tcp from any to me 80 in via $pif setup limit src–addr 2 + +# Sta beveiligde FTP, telnet en SCP toe vanaf internet. +$cmd 380 allow tcp from any to me 22 in via $pif setup limit src–addr 2 + +# Sta niet beveiligde telnet sessie toe vanaf het publieke internet. +# Dit heeft het label ``niet veilig'' omdat gebruikersnaam en +# wachtwoord als platte tekst over internet gaan. Als er geen telnet +# server draait, hoeft deze regel niet actief te zijn. +#$cmd 390 allow tcp from any to me 23 in via $pif setup limit src–addr 2 + +# Weiger en log alle niet toegestane inkomende verbindingen vanaf het +# publieke internet. +$cmd 400 deny log all from any to any in via $pif + +# Weiger en log alle niet toegestane uitgaande verbindingen naar +# internet. +$cmd 450 deny log all from any to any out via $pif + +# Dit is de 'skipto' locatie voor de uitgaande stateful regels +$cmd 800 divert natd ip from any to any out via $pif +$cmd 801 allow ip from any to any + +# Al het andere verkeer wordt standaard geblokkeerd. Weiger en log alle +# pakketten die tot hier zijn gekomen om te bekijken welke het waren. +$cmd 999 deny log all from any to any +################ Einde bestand met IPFW regels ######################## + + + + + +