Opmerking: Aan dit onderdeel wordt nog gewerkt. De inhoud is wellicht niet altijd volledig en juist.
Darren Reed is de auteur van IPFILTER, dat niet afhankelijk is van één besturingssysteem. Het is een open source applicatie die is geporteerd naar FreeBSD, 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 ipf(8). De NAT regels kunnen ingesteld of verwijderd worden met ipnat(1). Het programma ipfstat(8) kan actuele statistieken leveren voor de kernelonderdelen van IPFILTER. 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 http://www.obfuscation.org/ipf/ipf-howto.html#TOC_1 en http://coombs.anu.edu.au/~avalon/ip-filter.html.
De IPF FAQ is te vinden op http://www.phildev.net/ipf/index.html.
Een doorzoekbaar archief van de open-source IPFilter mailing lijst is beschikbaar op http://marc.theaimsgroup.com/?l=ipfilter.
IPF zit in de basisinstallatie van FreeBSD als een aparte “run time” laadbare module. Een systeem laadt de IPF kernel laadbare module dynamisch 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.
Het is niet verplicht om IPF in te schakelen door de volgende opties in de FreeBSD 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 en worden hier beschreven:
options IPFILTER options IPFILTER_LOG options IPFILTER_DEFAULT_BLOCK
options IPFILTER schakelt ondersteuning voor de “IPFILTER” firewall in.
options IPFILTER_LOG schakelt de optie in waarmee IPF verkeer kan loggen door het naar het ipl pakketloggende pseudo-apparaat te schrijven voor iedere regel met het sleutelwoord log erin.
options 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.
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" # laad regels uit het doelbestand ipmon_enable="YES" # Start IP monitor log ipmon_flags="-Ds" # D = start als 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 functionaliteit 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(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
-Fa
: verwijder alle interne tabellen met regels.
-f
: laad het aangegeven bestand met regels.
Hiermee wordt het mogelijk wijzigingen te maken aan het bestand met eigen regels en met 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 ipf(8) worden alle opties die beschikbaar zijn toegelicht.
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 Paragraaf 30.5.9.
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 ipfstat(8) worden alle details behandeld.
Standaard ziet 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 -i
voor inkomend of -o
voor uitgaand wordt meegegeven, dan wordt de juiste lijst met
regels die de kernel op dat 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 -ih toont de tabel met regels voor inkomend verkeer, waarbij voor iedere regel staat hoe vaak die van toepassing was.
ipfstat -oh 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
-t
waarmee de staat-tabel wordt getoond op een wijze die
vergelijkbaar is met de wijze waarop top(1) de draaiende
FreeBSD 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 ipfstat(8).
Om 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 -D
.
De daemon wordt gebruikt als continu een systeemlogboek bijgewerkt moet worden zodat
het mogelijk is om gebeurtenissen in het verleden te bekijken. Zo zijn FreeBSD en
IPFILTER ingesteld om samen te werken. FreeBSD heeft ingebouwde mogelijkheden om
automatisch syslogs te roteren. Daarom is het beter om de uitvoer naar syslogd(8) te
schrijven dan naar een gewoon bestand. In rc.conf is te zien
dat de instelling ipmon_flags de waarde -Ds
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 loggen 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.
Syslogd heeft een eigen methode om logboekgegevens te
scheiden. Het maakt gebruik van speciale groepen die “facility” en
“level” heten. ipmon(8) in -Ds
mode gebruikt security als
“facility”naam. Alle door ipmon(8) gelogde
gegevens gaan naar security. 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:
security.* /var/log/ipfilter.log
Het deel security.* 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 /etc/rc.d/syslogd reload. 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 logboekbestand te laten roteren.
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 logboekregel. 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 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.
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 myip="192.0.2.7" # statische IP adres gekregen van ISP ks="keep state" fks="flags S keep state" # Er kan gekozen worden om dit script te gebruiken om een eigen # /etc/ipf.rules script te maken of dit script kan gebruikt worden # "as is" # # Haal bij één van deze regels het commentaarteken weg # en plaats hem bij de ander. # # 1) Deze kan gebruikt worden om /etc/ipf.rules te maken: #cat > /etc/ipf.rules << EOF # 2) Deze kan gebruikt worden om het script "as is" te starten: # Let op: er moet een lege regel zijn na het EOF teken. /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 snapt het niet en kan deze scripts niet direct lezen.
Dit script kan gebruikt worden op één van de volgende twee manieren:
Haal het commentaarteken weg bij de regel die begint met cat en zet het commentaarteken bij de regel die begint met /sbin/ipf. Plaats ipfilter_enable="YES" in /etc/rc.conf zoals gewoonlijk en start het script eenmalig na elke wijziging om /etc/ipf.rules te maken of bij te werken.
Schakel IPFILTER uit in de systeem opstart scripts door ipfilter_enable="NO" toe te voegen aan /etc/rc.conf (dit is de standaardwaarde).
Voeg een script zoals de volgende toe aan de /usr/local/etc/rc.d opstart directory. Het script zou een duidelijke naam moeten hebben zoals ipf.loadrules.sh. De .sh is noodzakelijk.
#!/bin/sh sh /etc/ipf.rules.script
De permissies op dit script moeten zijn: lezen,schrijven en uitvoeren voor de gebruiker root.
# chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh
Als het systeem nu herstart, worden de regels via het script gestart.
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.
WaarschuwingWerk bij het wijzigen van firewallregels zeer voorzichtig. Met sommige instellingen is een server niet meer bereikbaar. Om het veilig te spelen is het aan te raden de eerste instellingen vanaf het console te maken, in plaats van via ssh.
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 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
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.
Een verplicht onderdeel 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.
Opmerking: 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 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-apparaat. 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.
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 subject
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 is het subject
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.
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 webpagina kan daar wellicht bij helpen: http://jodies.de/ipcalc.
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 ><
.
WaarschuwingDe volgende twee parameters die betrekking hebben op bron en bestemming, zijn verplicht in de moderne regels.
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.
keep state geeft aan dat in een regel met pass voor alle pakketten die van toepassing zijn stateful gefilterd moet worden.
Opmerking: Deze optie is voor moderne regels verplicht.
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 keep state
mechanisme 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 tegengehouden. 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 tegenwoordig door aanvallers worden uitgevoerd.
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 FreeBSD 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 één of meer netwerkkaarten zijn aangesloten op het LAN 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.
In iedere sectie moeten zo staan 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 meer tijd iemand erin moet steken voordat er iets slechts gedaan kan worden. 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 de functie van dat poortnummer na te zoeken in /etc/services of op http://www.securitystats.com/tools/portsearch.php.
Op de volgende link worden poortnummers van Trojans beschreven: http://www.simovits.com/trojans/trojans.html.
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 systeem. 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 meerdere 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 pakketten 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 FreeBSD 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 fragmenten. 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 ###################################
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 FreeBSD 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.
NAT regels worden geladen met ipnat. De NAT regels worden vaak opgeslagen in /etc/ipnat.rules . Meer details staan in 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 -CF
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
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 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.
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.
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"
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.
Een normale regel voor NAT ziet er als volgt uit:
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
In grote netwerken komt er een moment waarop er gewoon te veel adressen zijn om te bedienen met één IP adres. Als er een blok van publiekelijke IP adressen beschikbaar is, dan kunnen deze adressen gebruikt worden in een poel, welke door IPNAT gebruikt kan worden om één van de adressen te gebruiken als uitgaand adres.
Bijvoorbeeld om alle pakketten te verstoppen achter één een enkel IP adres:
map dc0 192.168.1.0/24 -> 204.134.75.1
Een reeks van publiekelijke IP adressen kan gespecificeerd worden met een netwerkmasker:
map dc0 192.168.1.0/24 -> 204.134.75.1-10
of door gebruik van de CIDR notatie:
map dc0 192.168.1.0/24 -> 204.134.75.0/24
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:
rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80
of:
rdr dc0 0.0.0.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:
rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp
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: http://www.slacksite.com/other/ftp.html.
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.
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
Deze en andere documenten kunnen worden gedownload van ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
Lees voor vragen over FreeBSD de documentatie alvorens contact te zoeken
<questions@FreeBSD.org>.
Vragen over deze documentatie kunnen per e-mail naar <doc@FreeBSD.org>.