Cover
ابدأ الآن مجانًا LSS - Lecture IV - Linux firewalling.pdf
Summary
# Concept en typen firewalls
Een firewall fungeert als een digitale verdedigingslinie die inkomend en uitgaand netwerkverkeer reguleert op basis van vooraf gedefinieerde beveiligingsregels.
## 1. Concept en typen firewalls
### 1.1 Wat is een firewall?
Een firewall is een netwerkbeveiligingssysteem dat is ontworpen om inkomend en uitgaand netwerkverkeer te monitoren en te controleren op basis van vooraf bepaalde beveiligingsregels. Het functioneert als een barrière tussen een vertrouwd intern netwerk en een onbetrouwbaar extern netwerk, zoals het internet. De oorspronkelijke betekenis van het woord "firewall" verwees naar een muur die was bedoeld om een brand in een gebouw te beperken [3](#page=3).
### 1.2 Firewalling op verschillende lagen
Firewalls kunnen opereren op verschillende lagen van het OSI-model:
* **Lagen 1-7:** Het OSI-model bestaat uit zeven lagen: Fysiek, Datalink, Netwerk, Transport, Sessie, Presentatie en Applicatie [5](#page=5).
* **Netwerkfirewalls:** Deze opereren typisch op de netwerklaag (laag 3) en/of de transportlaag (laag 4) [5](#page=5).
* **Applicatiefirewalls:** Deze opereren op de applicatielaag (laag 7) [5](#page=5).
### 1.3 Typen firewalls
Firewalls kunnen worden geclassificeerd op basis van hun locatie (netwerk- of hostgebaseerd) en de lagen waarop ze opereren (netwerk- of applicatiefirewalls).
#### 1.3.1 Netwerkgebaseerde firewalls
Netwerkgebaseerde firewalls bevinden zich op gateways die meerdere hosts bedienen. Ze inspecteren pakketten die moeten worden doorgestuurd. Deze kunnen worden geïmplementeerd als dedicated hardware of als software op algemene hardware [7](#page=7).
* **Voorbeelden:**
* **Dedicated hardware:** Cisco, Netgate [7](#page=7).
* **Software:** netfilter/iptables, pfSense [7](#page=7).
#### 1.3.2 Hostgebaseerde firewalls
Hostgebaseerde firewalls worden op een enkele computer geïnstalleerd. Ze inspecteren zowel inkomende als uitgaande pakketten. Ze functioneren vaak als een daemon of service op het besturingssysteem [7](#page=7).
* **Voorbeelden:**
* netfilter/iptables, Windows Defender Firewall [7](#page=7).
#### 1.3.3 Applicatiefirewalls
Applicatiefirewalls, ook wel bekend als next-generation firewalls (NGFW), zijn specifiek ontworpen om verkeer op applicatieniveau te inspecteren. Ze kunnen diepgaande inhoudsinspectie uitvoeren, zoals het controleren op virussen of exploits [6](#page=6).
* **Netwerkgebaseerde applicatiefirewalls:**
* Bevinden zich op gateways voor meerdere hosts, vaak als (reverse) proxy [6](#page=6).
* Specifiek voor bepaalde applicatieprotocollen en voeren inhoudsinspectie uit [6](#page=6).
* **Voorbeelden:** Web Application Firewall (WAF), ModSecurity (Modsec), Cloudflare’s Cloud WAF [6](#page=6).
* **Hostgebaseerde applicatiefirewalls:**
* Bevinden zich op een enkele host [6](#page=6).
* Bieden sandboxing voor meerdere applicaties [6](#page=6).
* Nieuwere generaties maken vaak gebruik van Mandatory Access Control (MAC) [6](#page=6).
* **Voorbeelden:** AppArmor, SELinux [6](#page=6).
### 1.4 Samenwerking van firewalls
Een applicatiefirewall werkt complementair aan een netwerkfirewall. De netwerkfirewall dient vaak als de eerste verdedigingslinie. Veel netwerkfirewalls zijn al ingebouwd in het besturingssysteem [8](#page=8).
---
# Netfilter, iptables en nftables
Dit deel van de cursus behandelt de ingebouwde netwerkfirewalls van Linux, Netfilter, en de gebruikersapplicaties iptables en het modernere nftables [9](#page=9).
### 2.1 Netfilter: de kernel-subsystemen
Netfilter is de firewall-subsystemen in de Linux-kernel dat pakketfiltering, NAT en andere pakketmanipulaties mogelijk maakt. Het is sinds kernelversie 2.4 aanwezig in Linux en werd destijds geïnitieerd door Paul “Rusty” Russell [10](#page=10) [11](#page=11) [12](#page=12).
Netfilter werkt met tabellen, chains en regels [13](#page=13):
* **Tabellen**: Groeperen gerelateerde functionaliteiten.
* **Chains**: Sequenties van regels binnen een tabel.
* **Regels**: De fundamentele configuratie-items die criteria bevatten om verkeer te matchen en acties uit te voeren op het gematchte verkeer [13](#page=13).
#### 2.1.1 Packet filtering hooks en chains
Netfilter heeft vijf packet filtering "hooks" in de netwerkstack van de Linux-kernel, die corresponderen met vijf iptables chains [14](#page=14):
1. **PREROUTING**: Verwerkt pakketten zodra ze binnenkomen [14](#page=14).
2. **INPUT**: Verwerkt pakketten die bestemd zijn voor lokale sockets [14](#page=14).
3. **FORWARD**: Verwerkt pakketten die via het systeem worden gerouteerd [14](#page=14).
4. **OUTPUT**: Verwerkt pakketten die lokaal worden gegenereerd [14](#page=14).
5. **POSTROUTING**: Verwerkt pakketten vlak voordat ze het systeem verlaten [14](#page=14).
Deze chains zijn visueel weergegeven in een vereenvoudigd schema [15](#page=15).
#### 2.1.2 Netfilter tabellen
Er zijn vijf hoofdtabellen in Netfilter [16](#page=16):
1. **filter**: De standaardtabel voor packet filtering [16](#page=16).
2. **nat**: Wordt geraadpleegd wanneer een pakket een nieuwe verbinding creëert, voornamelijk voor Network Address Translation [16](#page=16).
3. **mangle**: Een speciale tabel voor packet-aanpassingen [16](#page=16).
4. **raw**: Heeft de hoogste prioriteit en wordt gebruikt voor uitzonderingen in connection tracking [16](#page=16).
5. **security**: Gebruikt voor mandatory access control netwerkregels, zoals SECMARK en CONNSECMARK targets, voor SELinux en andere beveiligingsmodules [16](#page=16).
Het is belangrijk om onderscheid te maken tussen tabel- en chainnamen; tabelnamen zijn doorgaans in kleine letters (bv. `filter`), terwijl chainnamen in hoofdletters staan (bv. `INPUT`). Een gedetailleerd overzicht van het packet-flow door deze componenten is beschikbaar [18](#page=18) [19](#page=19).
### 2.2 iptables: de klassieke gebruikerstool
`iptables` is de traditionele command-line tool voor het beheren van de Netfilter-firewall [22](#page=22).
#### 2.2.1 Huidige regels bekijken
Men kan de huidige regels van specifieke tabellen of de standaard `filter` tabel bekijken met de volgende commando's [23](#page=23):
* `iptables -t -L`: Toon alle regels van een specifieke tabel [23](#page=23).
* `iptables -L`: Toon alle regels van de standaard `filter` tabel [23](#page=23).
#### 2.2.2 Default policies
De `policy` van een chain bepaalt de actie die wordt uitgevoerd op pakketten die niet door een regel in die chain worden gematcht. Standaard is deze vaak ingesteld op `ACCEPT`. Het wijzigen van de default policy, bijvoorbeeld naar `DROP` voor de `FORWARD` chain, is een veelvoorkomende beveiligingsmaatregel [24](#page=24).
#### 2.2.3 Firewall regels toevoegen
Regels kunnen worden toegevoegd aan chains [25](#page=25):
* **Append (`-A`)**: Voegt een regel toe aan het einde van een chain [25](#page=25).
* **Insert (`-I`)**: Voegt een regel in op een specifieke positie in een chain [25](#page=25).
#### 2.2.4 Targets
Targets definiëren de actie die wordt uitgevoerd op een gematcht pakket [26](#page=26):
* **LOG**: Logt het pakket [26](#page=26).
* **ACCEPT**: Staat het pakket toe [26](#page=26).
* **REJECT**: Wijst het pakket af en stuurt een foutmelding terug [26](#page=26).
* **DROP**: Negeert het pakket zonder melding terug te sturen [26](#page=26).
#### 2.2.5 Regel criteria
Regels kunnen specifieke criteria bevatten om pakketten te matchen [27](#page=27):
* **Source (`-s` of `--source`)**: Bronadres [27](#page=27).
* **Destination (`-d` of `--destination`)**: Bestemmingsadres [27](#page=27).
* **Protocol (`-p` of `--protocol`)**: Protocol (bv. `icmp`, `tcp`) [27](#page=27).
* **Module opties**: Extra criteria kunnen worden toegevoegd met behulp van modules (zie `man iptables-extensions`) [27](#page=27).
Een voorbeeld van een regel die ICMP ping requests met een lengte tussen 200 en 1500 bytes dropt, is:
`iptables -A INPUT -s 192.168.111.100 -p icmp -m length --length 200:1500 -j DROP` [27](#page=27).
#### 2.2.6 Firewall regels verwijderen
Regels kunnen op verschillende manieren worden verwijderd [28](#page=28):
* **Regelnummer tonen**: `iptables -L --line-numbers` [28](#page=28).
* **Specifieke regel verwijderen**: `iptables -D ` [28](#page=28).
* **Alle regels in een chain verwijderen**: `iptables -F ` [28](#page=28).
* **Alle regels in alle chains van de filtertabel verwijderen**: `iptables -F` [28](#page=28).
> **Tip:** Wees uiterst voorzichtig bij het configureren van `iptables` regels, vooral via SSH. Een verkeerd commando kan leiden tot permanente uitsluiting totdat het fysiek wordt opgelost [29](#page=29).
### 2.3 nftables: de modernere opvolger
`nftables` is een nieuwe kernel-subsystem (`nf_tables`) die de Netfilter-infrastructuur hergebruikt, maar een nieuwe gebruikersruimte tool (`nft`) en syntaxis introduceert. Het is geïntegreerd in de Linux-kernel sinds versie 3.13 [31](#page=31).
#### 2.3.1 Vergelijking met iptables
`nftables` biedt diverse voordelen ten opzichte van `iptables` [33](#page=33):
* **Efficiëntie**: Snellere packet classificatie [33](#page=33).
* **Flexibiliteit**: Betere ondersteuning voor dynamische ruleset updates [33](#page=33).
* **Uniformiteit**: Eén tool voor alle address families (IPv4, IPv6, ARP) [33](#page=33).
* **Vereenvoudiging**: Vervangt meerdere tools (`iptables`, `ip6tables`, `arptables`, `ebtables`) [33](#page=33).
* **Nieuwe features**: Zoals de `inet` familie voor dual-stack IPv4/IPv6 beheer [33](#page=33).
#### 2.3.2 ‘iptables’ op moderne distributies
Op recentere distributies, zoals RHEL 8 en Debian 11, gebruikt de `iptables` command-line tool vaak al de `nf_tables` backend. Op Debian wordt de `nft` command standaard gebruikt in plaats van `iptables` [34](#page=34) [35](#page=35).
#### 2.3.3 nftables: tabellen
In `nftables` specificeer je voor een tabel de address family [36](#page=36):
* `ip`: Correspondeert met `iptables` (IPv4) [36](#page=36).
* `ip6`: Correspondeert met `ip6tables` (IPv6) [36](#page=36).
* `inet`: Combineert IPv4 en IPv6, waarvoor men voorheen zowel `iptables` als `ip6tables` moest gebruiken [36](#page=36).
* `arp`: Correspondeert met `arptables` [36](#page=36).
* `bridge`: Correspondeert met `ebtables` [36](#page=36).
* `netdev`: Gebruikt de nieuwe `ingress` hook [36](#page=36).
`nftables` maakt het mogelijk om willekeurig veel custom tabellen te definiëren, in tegenstelling tot de 5 vooraf gedefinieerde tabellen in `xtables`. Een voorbeeld commando is: `nft add table inet mytable` [36](#page=36).
#### 2.3.4 nftables: chains
Chains in `nftables` kunnen twee types hebben [37](#page=37):
* **Base chain**: Haakt in op de netwerkstack en vereist `type`, `hook` en `priority` parameters [37](#page=37) [44](#page=44).
* **Regular chain**: Voor betere organisatie van regels [37](#page=37).
Het `type` van een chain bepaalt de functionaliteit [38](#page=38):
* **filter**: Standaard packet filtering [38](#page=38).
* **nat**: Voor Network Address Translation [38](#page=38).
* **route**: Voor nieuwe route lookups als pakketten zijn gewijzigd [38](#page=38).
De `hook` specificeert het stadium in de packetverwerking waar de chain ingrijpt [39](#page=39):
* `ingress`: Nieuw, voor zeer vroege filtering [39](#page=39) [40](#page=40) [41](#page=41).
* `prerouting`: Vlak na binnenkomst [39](#page=39).
* `input`: Voor lokaal bestemde pakketten [39](#page=39).
* `forward`: Voor gerouteerde pakketten [39](#page=39).
* `output`: Voor lokaal gegenereerde pakketten [39](#page=39).
* `postrouting`: Vlak voor het verlaten van het systeem [39](#page=39).
De `priority` parameter bepaalt de volgorde waarin chains met dezelfde hook worden doorlopen, waarbij lagere waarden voorrang hebben. Standaard prioriteitsnamen zijn beschikbaar die overeenkomen met de volgorde van de `xtables` tabellen: "raw" < "mangle" < "dstnat" < "filter" < "security" < "srcnat" [42](#page=42).
#### 2.3.5 nftables: regels
Regels in `nftables` bestaan uit uitdrukkingen (expressions) en statements [43](#page=43):
* **Expressions**: Bepalen wat gematcht moet worden [43](#page=43).
* **Statements**: Definiëren de uit te voeren actie [43](#page=43).
Een voorbeeld van een regel die echo-request ICMP pakketten dropt:
`nft add rule inet mytable mychain icmp type echo-request drop` [43](#page=43) [46](#page=46).
#### 2.3.6 nftables syntaxis
De `nft` tool biedt commando's voor het beheren van tabellen, chains en regels [44](#page=44):
* **Tabellen**:
* `nft list tables []`
* `nft list table [] [-n [-a]`
* `nft (add | delete | flush) table [] ` [44](#page=44).
* **Chains**:
* `nft (add | create) chain []