PfSense – Open-Source Firewall
In deze post wil ik graag een firewall onder de aandacht brengen waar ik al jaren zeer van gecharmeerd ben en dat is “pfSense” van Netgate. De reden dat ik hier zo van gecharmeerd ben is omdat pfSense volledig open-source en dus gratis is. pfSense is voorzien van alle functie die je mag verwachten van een firewall. Denk aan packet filtering (duh), packet inspection, OpenVPN, Snort Analyzer, Layer 7 app detection etc. pfSense wordt gebruikt door particulieren maar ook steeds meer door bedrijven. Het is een goedkope, degelijke oplossing met een grote community. In deze post nemen we een kijkje naar de functies en de basis installatie van deze prachtige firewall.
pfSense is een router/firewall welke volledig gebaseerd is op het degelijke FreeBSD (met custom kernel). pfSense bestaat al sinds 2004 en is begonnen als het “m0n0wall” project welke voor het eerst in 2006 gereleased werdt. In 2012 is het project overgedragen aan Netgate en wordt tot op de dag van vandaag door Netgate onderhouden en doorontwikkeld. pfSense is verkrijgbaar als virtual machine, als appliance (incl. hardware) en zelfs als clouddienst waardoor pfSense geïmplementeerd kan worden binnen Microsoft Azure en AWS. Ondanks dat pfSense een op Linux (FreeBSD) gebaseerd systeem is hoeft de gebruiker het onderliggende systeem nooit aan te raken. Alle basis en geavanceerde configuraties worden toegepast via een duidelijke webinterface. Slechts in zeer specifieke gevallen zoals bij custom-made solutions of tweaking zal het onderliggende systeem benaderd moeten worden. Het mooiste is nog dat de pfSense add-ons (in pfSense terminologie heten deze “packages”) verkregen kunnen worden via een built-in package manager of middels het “get” commando. Ook hiervoor is het dus niet nodig om specifieke commando’s uit te voeren of om Github URL’s te onthouden. Get-and-Go. Om een indruk te krijgen van alle (supported) packages check je deze pagina: https://docs.netgate.com/pfsense/en/latest/packages/package-list.html.
pfSense zit vol met additionele tools en zoals al gezegd is deze toolkit nog gemakkelijk uit te breiden met extra tools. Wil je packets capturen, logging verzamelen diagnostische tools als ping en arp gebruiken? Geen probleem, pfSense heeft ze voor je klaarstaan. Wil je een veilige VPN verbinding opzetten? Ook geen enkel probleem? En zo kan ik nog wel even doorgaan met de fantastische functies die pfSense biedt. Hieronder een resume van de functie die ik persoonlijk ontzettend gaaf vind. Neem voor alle functies gerust hier een kijkje: https://www.netgate.com/solutions/pfsense/features.html.
- Statefull Packet Inspection (SPI)
- GeoIP Blocking
- Anti-Spoofing
- DynamicDNS
- Reverse Proxy
- Captive Portals
- VLAN Support
- DHCP Server
- WOL (Wake-on-LAN)
- IPSEC en OpenVPN
- SSL Encryptie
- WAN Failover
- RADIUS / LDAP Support
- Snort-based packet analyzer
- Deep Packet Inspection (DPI)
- Clustering
- Traffic Shaping
- Proxy Server
- Anti-Virus
- SafeSearch Web Filtering
- Reporting
- Backup/Restore
- En nog veel, veel meer (o ja… en dan nog meer als je alle optionele packages meetelt)
Ondanks dat pfSense een van de meest stabiele firewalls op de markt is en onverwachte downtime bijna nooit voorkomt is het goed om te weten dat er support afgenomen kan worden bij Netgate zodat er bij potentiele problemen altijd een professional beschikbaar is om je hierbij te ondersteunen. Support is beschikbaar in een aantal smaken en altijd schappelijk geprijsd. Bekijk deze pagina voor de prijzen: https://www.netgate.com/support/.
pfSense Installatie
Hoewel pfSense in de cloud erg gaaf is, en pfSense als default Netgate appliance fantastisch is kiezen we ervoor om low-cost zelf pfSense te installeren. In eerste instantie wilde ik graag pfSense installeren op een Raspberry Pi (4) maar helaas is er ondanks veler verzoek (en tegengeluid) geen ARM-based image beschikbaar. De minimale systeemeisen zijn echter slechts zeer beperkt en zelfs met de recommended settings had een Raspberry prima uit de voeten gekund. Deze zijn 1GB hard drive, 1 GB aan RAM geheugen en een 1 GHz processor (x64) wanneer de verwerkingssnelheid (maximale snelheid van de NIC) niet hoger is dan 100 Mbps. Wanneer je echter met een 1 Gbps NIC werkt wordt aangeraden om minimaal een CPU van 2 GHz te nemen van server kwaliteit met meerdere cores.. Wat echter wel belangrijk is, is de keuze voor de juiste kwalitatieve netwerkkaart. Goedkope NIC’s kunnen de CPU overzpoelen met interrupt handling waardoor er tenslotte pakketten gemist zullen worden omdat deze niet verwerkt kunnen worden door de overvolle CPU. Een kwaliteits-NIC kan de systeemdoorvoer aanzienlijk verhogen. Kies bij een doorvoer van meer dan 100 Mbps altijd voor een PCI-e NIC.
PfSense is te downloaden in 2 verschillende packages. Netgate ADI voor (seriële / non-GUI) installatie van een Netgate appliance en als AMD (64-bit) architectuur voor installatie op een x64 processor. Vervolgens krijg je nog de optie om de gekozen architectuur te installeren v.a. een ISO (wat uiteraard ideaal is voor installatie v.a. USB of CD) of v.a. een USB Memstick. De USB Memstick is de preffered installatiemethode omdat hierbij de image eerst naar de HD geschreven wordt, de HD wordt geformatteerd en pfSense wordt vervolgens geïnstalleerd.
Ik kies er echter voor om pfSense v.a. scratch te installeren op een virtuele machine zodat ik het proces goed kan beschrijven. Mijn installatieopties zijn dus de keuze voor de AMD (64-bit) architectuur en vervolgens de ISO.
De gedownloade versie is versie 2.4.4-p3 en is 334 MB groot. De downloadfile komt in de vorm van een “iso.gz” file en moet dus eerst uitgepakt worden. Uiteraard kun je hier een bootable USB stick mee maken maar omdat we een virtuele machine gaan installeren is de ISO file voldoende. Nu is het een kwestie van de bootable ISO file mounten en de installatie starten.
Allereerst zal de installatie je vragen de algemene voorwaarden te accepteren. Uiteraard kies je hier voor “ja”. Vervolgens krijg je de keuze om een rescue shell te starten, een configuratiebestand te herstellen of om pfSense te installeren. Deze bovenste optie is uiteraard de juiste keuze.
De volgende optie is de “keymap” optie. Met andere woorden, welke layout heeft je toetsenbord. Hier kiezen we voor “DUTCH/QUERTY”:
Vervolgens kies je het gewenste filesystem. De auto optie gebruikt UFS maar ZFS is ook beschikbaar (maar experimenteel). Je krijgt ook de keuze om handmatig te partitioneren maar de auto optie lijkt me afdoende om te kiezen.
Nu zal de wizard vervolgens pfSense installeren. De disk wordt geformatteerd en pfSense wordt geïnstalleerd.
Na installatie krijg je de keuze om handmatig aanpassingen te maken via de shell. Hier kiezen we voor “No”.
De installatie is nu compleet. De wizard zal vragen om te rebooten. Doe dat en verwijder de installatiemedia.
Vervolgens zal pfSense zelf adapters toewijzen aan de em0 en em1 interfaces. By-default is em0 de WAN en em1 het LAN.
Wanneer het systeem deze interfaces herkent is er geen probleem en zal de webinterface meteen beschikbaar zijn op de getoonde URL. Wanneer het systeem echter niet de juiste interfaces kan selecteren voor em0 en em1 word je gevraagd dit manueel te doen. Slechts de WAN interface is verplicht voor de pfSense setup. Wanneer pfSense geen LAN interface heeft kun je deze skippen. Deze mode noemen we dan de “Appliance Mode”. In “Appliance Mode” kan pfSense over de WAN interface benaderd worden. Als er een LAN interface aanwezig is kan pfSense alleen over de LAN interface benaderd worden en niet over de WAN interface.
In bovenstaande shell menu heb je de mogelijkheid om diverse “post-install” taken uit te kunnen voeren. Het is echter niet nodig om hier op dit moment iets mee te doen. We kunnen later altijd via de shell (SSH) deze taken uitvoeren. De meeste configuratie geschied via de webinterface. Laten we nu de webinterface openen om de configuratie te voltooien en de functies van pfSense beter te bekijken. De webinterface is gewoon te benaderen via HTTPS (https://%ipadres-van-LAN-NIC%:
pfSense Basis Configuratie
Nu we de beschikking hebben over de pfSense webinterface kunnen we het product gaan voorzien van zijn basis configuratie. Om in te loggen in de webinterface gebruik je de default credentials:
Gebruikersnaam: admin
Wachtwoord: pfsense
Omdat je de webinterface voor het eerst benaderd zal pfSense je doorsturen naar de setup wizard (ook te benaderen via System – Setup). Deze wizard gaan we doorlopen om de basis configuratie alvast in het systeem te plaatsen.
General Information
De eerste informatie die we gaan plaatsen is algemene informatie over de firewall zoals de hostname en de DNS settings:
- Hostname: JB-pfSense
- Domain: pfsense.local
- Primary & Secondary DNS Server: omdat DNS wordt uitgegeven door mijn ISP kan ik deze blanco laten. Standaard staat de DNS Resolver van pfSense in “resolver mode”. In dat gevan zal pfSense DNS resolving uitvoeren en kunnen deze velden ook leeg gelaten worden. Wanneer de DNS Resolver echter in “forwarding mode” staat en DNS verkeer dus doorgestuurd wordt naar een andere DNS server dan moeten deze DNS setting wel ingevuld worden.
- Overwrite DNS – Als manuele DNS gegevens opgegeven zijn dan kunnen deze overschreven worden door de automatische DNS settings van de ISP. Dit keuzevakje laten we ingeschakeld.
NTP & Time Zone Configuration
Vervolgens gaan we onze tijdzone en NTP (tijdserver) settings opgeven.
- Time server hostname – Hier gebruiken we 3 tijdservers (Nederlandse) welke we middels een spatie van elkaar scheiden: 0.nl.pool.ntp.org 1.nl.pool.ntp.org 2.nl.pool.ntp.org
- Timezone: Europe/Amsterdam
WAN Configuration
Vervolgens is het zaak om te kiezen welk type WAN we gebruiken. We configureren hiermee de interface welke met het WAN (ISP router) verbonden is. In de gevallen zul je kunnen kiezen voor het type “DHCP” welke in deze standaard is. Dit type zorgt ervoor dat de ISP de NIC van de juiste settings voorziet (of dat het ISP modem dit doet waar pfSense op aangesloten is). Soms zal het echter ook nodig zijn om handmatige opties in te voeren. In dat geval kies je voor “static”. Wanneer je je PPPoE of PPTP gegevens op moet geven kun je ook hiervoor kiezen. Je ISP moet je in dit geval van de juiste gegevens voorzien zoals gebruikersgegevens, MTU, MSS etc. Je kunt indien gewenst (maar niet geadviseerd) ook het MAC adres van je NIC spoofen.
- SelectedType: DHCP
LAN Interface Configuration
Nu gaan we de settings opgeven voor de LAN interface. In de meeste gevallen zul je deze statisch willen hebben. Je firewalll zal immer altijd op hetzelfde adres bereikbaar moeten zijn. Plaats de firewall nu in het LAN met zijn eigen statische IP adres en subnetmask.
- LAN IP Address: 192.168.178.50
- Subnet Mask: 24 (dit is de CIDR notatie)
Set Admin WebGUI Password
Nu is het zaak om je default “pfsense” wachtwoord te veranderen naar een niet-default en sterk wachtwoord.
Doe dat en “Reload” de pfSense configuratie. De default setup is nu klaar en de webinterface toont nu de default config alsmede alle andere opties. Time to explore.
pfSense Configuratie
Nu de firewall de basisconfiguratie heeft is het tijd om te kijken wat pfSense nog meer biedt en om additionele settings in de configuratie te plaatsen. De webinterface kent de volgende indeling:
- 1. Menu balk
- 2. Uitloggen
- 3. Widgets toevoegen aan home dashboard
- 4. pfSense status informatie / system informatie
- 5. NetGate nieuws
- 6. Interface status
Met een paar klikken heb je je dashboard bijgewerkt. Zo heb ik het NetGate nieuws verwijderd en de status van de Gateways en NTP toegevoegd en ik heb de Traffic Graph toegevoegd. Dit ziet er als volgt uit:
En dan… dan komt een deep-dive in alle settings van pfSense. En dat zijn er nogal wat! Ik ben aan het twijfelen geweest om elk menuitem te vermelden incl. de mogelijkheden en opties. Maar omdat dit zou resulteren in een 3-delige post heb ik hier niet voor gekozen. Het lijkt me zinvol om iets over de menuitems te vertellen en de settings die ik na de basis setup zou aanpassen voor mijn eigen toepassingen. Voor alle custom configuratie mogelijkheden raad ik je aan om zelf goed in de pfSense documentatie te duiken of om eens met pfSense te spelen. Het moet al een hele specifieke requirement zijn wil pfSense hem niet kunnen vervullen.
pfSense kent de volgende menu items:
- System – Het “System” gedeelte biedt de gebruiker een groot scala aan opties welke invloed hebben op het systeem of onderdelen uit het systeem. Denk b.v. aan het in- of uitschakelen van diverse policies, firewall settings, proxy settings en notifications.
- Interfaces – Zoals de naam al goed omschrijft geeft dit menuitem de opties om je NIC’s te configureren.
- Firewall – Misschien wel het hart van pfSense. Het firewall item geeft toegang tot diverse firewall settings zoals NAT – Firewall rules – Virtual IP’s etc.
- Services – Onder dit item kun je de configuratie aanpassen van diverse firewall gerelateerde services zoals captive portal’s, DHCP, DynDNS, Load Balancer, NTP, SNMP, WoL etc.
- VPN – Wil je een site-to-site of client-to-site VPN verbinding toestaan en configureren, dan is dit het item waar je moet zijn.
- Status – Hoe verschillende onderdelen van de firewall presteren kun je hier terugvinden.
- Diagnostics – Deze fantastische optie geeft je als gebruiker de beschikking over diverse essentiele tools zoals Ping, ARP tabel, pfInfo, pfTop, Routtable, Traceroute, Backup & Restore en vele andere.
- Help – Heb je hulp nodig, bezoek dan deze link om snel toegang te krijgen tot de bug database, documentatie, community forum en indien nodig betaald support.
System:
Subitem: Advanced
Tab: Admin Access
Onder deze tab heb je de mogelijkheid om je SSL certificaat te veranderen van een self-signed certificaat naar een public certificate. Dit zou ik altijd aanraden om te doen in een productieomgeving. Daarnaast zou ik de TCP poort aanpassen naar een poort boven de 1001 (boven de default port scan range). B.v. 4001. In de huidige testopstelling hou ik deze settings even default. De volgende settings raad ik aan om eveneens aan te passen:
WebGUI Login Autocomplete – Zet deze instelling uit zodat login credentials niet opgeslagen kunnen worden in de browser.
Enable Secure Shell – Deze schakel ik in om SSH configuratietaken remote uit te kunnen voeren. Als je echter gemakkelijk een toetsenbord en beeldscherm aan je device kunt bevestigen raad ik aan om die methode te gebruiken en SSH uit te laten staan. Als je SSH inschakelt gebruik dan een alternatieve poort.
Tab: Firewall
Check certificate of aliases URLs – Schakel deze optie in om een certificate check op alle URL’s uit te voeren.
Tab: Miscellaneous
Load Balancing – Schakel load balancing in zodat verkeer netjes verdeeld wordt over meerdere servers (indien van toepassing). Verkeer van dezelfde source zal naar dezelfde server geredirect worden en niet hoppen tussen meerdere servers. Ik zet de timeout graag op 2 minuten (120) zodat sessies binnen 2 minuten opnieuw opgepakt kunnen worden.
Cryptographic Hardware – Als de pfSense server in een productieomgeving staat en voorzien is van een crypto chip dan is het aan te raden om “Cryptographic Hardware” in te schakelen. In de virtuele demo omgeving laat ik deze uit staan.
Tab: Notifications
E-mailserver – Vul alle e-mailserver gerelateerde settings in om je e-mailserver in te stellen zodat notifications per e-mail verzonden kunnen worden.
Subitem: Update
Tab: System Update + Update Settings
Voer hier indien nodig een update van het systeem uit. En voer daarna ook een update van de settings uit:
Interfaces:
Na de initiële setup had ik geen aanpassingen die hierin gedaan moesten worden.
Firewall:
Tab: Aliases
Voeg hier diverse hosts, netwerken, poorten of andere zaken toe welke je wilt voorzien van een duidelijk naam. Aliases maken het bouwen van netwerkregels en het analyseren van logs makkelijker.
Tab: NAT
Vul hier alle NAT regels in die van toepassing zijn.
Tab: Rules
Hier vullen we alle firewall regels aan. De regel die al aanwezig is, is aangemaakt door het systeem tijdens het aanmaken van bovenstaande NAT rule. Zoals je ziet kun je een regel tot in detail specificeren.
Ik raad aan om een default “block” regel te maken en om deze onderaan de lijst te plaatsen. Op die manier wordt al het verkeer welke niet geverifieerd kan worden door een regel standaard geblokkeerd:
Tab: Schedules
Schedules ofwel “time ranges” kunnen hier aangemaakt worden en gebruikt worden binnen de firewall rules. Zo kun je verkeer toestaan of droppen binnen specifieke time ranges.
Services:
Tab: Auto Config Backup
Stel het systeem in om periodiek een automatische backup te maken van de configuratie. Ik maak b.v. elke maandag om 23:00 een backup:
VPN:
Tab: OpenVPN
Omdat ik graag toegang krijg tot mijn netwerk middels een VPN kies ik ervoor om de OpenVPN server in te richten zodat ik met iedere OpenVPN client kan verbinden. Alvorens je deze configuratie kunt maken moet je onder “System” – “Certificate Manager” een CA aanmaken:
Diagnostics:
De tools die in de “Diagnostics” sectie aangeboden worden zijn legio. Een aantal tools:
Backup & Restore van je configuratie:
Authentication verificatie:
File Editor:
Packet Capture:
Poort tester:
pfSense Packages
Onder System – Package Manager vindt je alle (default) packages uit de “pfSense store” die je toe kunt voegen aan je product.
De volgende packages zijn zeker een aanrader:
- acme – voor automatische Let’s Encrypt certificate enrollment
- arpwatch – voor het monitoren van het ethernet verkeer
- bandwidthd – deze tool geeft rapportages over het verbruik van je bandbreedte
- iPerf – de tool voor het testen van network troughput
- mailreport – voor het periodiek automatisch versturen van e-mails
- nmap – de krachtige nmap poortscanner op je pfSense firewall
- ntopng – een tool voor het bijhouden van netwerkverbruik zoals htop dit voor processen doet
- openvpn-client-export – maakt het mogelijk om openVPN clients pre-configured te exporteren uit pfSense
- snort – IDS/IPS ofwel een fantastische open-source network intrusion prevention and detection system
De laatste package die ik wil benoemen is “squid”. squid is een proxy en reverse proxy server. Squid kan op zijn beurt uitgebreid worden met “squidGuard”. squidGuard maakt het mogelijk om URL verkeer te filteren (van het verkeer dat via de squid proxy gaat). squid maakt van pfSense niet alleen een krachtige firewall maar ook nog eens een krachtige proxy server.
Conclusie
Tot zover een kijkje binnen pfSense. Hopelijk heb ik je kunnen overtuigen van de veelzijdigheid van deze fantastische firewall. Met pfSense haal je een krachtige gratis firewall in huis die je zelf binnen een paar uurtjes up-and-running kunt hebben. Je moet even rekening houden waarmee je bezig bent en ook een klein beetje inzicht hebben in de functies die een goede firewall normaliter bij zich draagt en dan is het configureren helemaal niet zo lastig als je in eerste instantie zou denken. Doe eens gek… en probeer het gewoon!
Hartelijk dank voor het lezen van deze post. Het maken van een wekelijkste post kost best wat vrije tijd en effort en dus zou ik het extra leuk vinden als je me zou willen sponsoren. Dat kan al met een simpele like, het delen van mijn bericht op je social media of eigen website of gewoon met een leuk berichtje retour.