UFW (Uncomplicated Firewall) is een firewall rechtstreeks in je VPS die je met begrijpelijke commando's bedient. Je stelt hem zo in dat van buitenaf alleen bereikbaar is wat jij wilt, zonder dat je jezelf van SSH afsluit. Aan het einde lees je waarom Docker UFW omzeilt en vind je een voorbeeldconfiguratie van nftables voor gevorderden.
Wat je nodig hebt
- Een VPS bij StormHost met Ubuntu 24.04 of Debian 13
- Een SSH-verbinding als root (handleiding)
- De console in de browser geopend, voor de zekerheid
- Een lijst van de poorten die je diensten gebruiken
- Ongeveer 20 minuten
UFW in het kort#
Linux filtert pakketten in de kernel (het subsysteem netfilter, aangestuurd via nftables of iptables). Regels rechtstreeks schrijven is ingewikkeld, UFW doet dat voor je: het zet het commando ufw allow 22/tcp om in de juiste regels voor zowel IPv4 als IPv6.
UFW is een van de twee mogelijkheden. De andere is de firewall in je klantaccount, die het verkeer al vóór de VPS filtert. Gebruik je beide, dan moet een poort in beide openstaan.
Installatie en standaardbeleid#
Ubuntu 24.04
UFW is geïnstalleerd, maar uitgeschakeld. Controleer dat:
ufw statusDe uitvoer Status: inactive betekent dat de firewall nog niets blokkeert.
Debian 13
Installeer UFW:
apt install ufwNa de installatie staat hij uit (ufw status toont Status: inactive).
Stel het standaardbeleid in, dus wat er gebeurt met verkeer dat in geen enkele regel wordt genoemd:
ufw default deny incoming
ufw default allow outgoingufw default deny incoming– nieuwe inkomende verbindingen blokkeren, tenzij een regel ze toestaat.ufw default allow outgoing– uitgaande verbindingen vanaf de VPS toestaan (updates, DNS, downloads).
UFW is stateful: antwoorden op verbindingen die de VPS zelf heeft geopend, komen ook met deny incoming door.
Sta SSH toe voordat je de firewall inschakelt#
Zonder regel voor SSH sluit je jezelf buiten bij het inschakelen
ufw enable met het beleid deny incoming blokkeert meteen alles wat niet is toegestaan. Heb je op dat moment geen regel voor SSH, dan valt de verbinding weg. Je komt dan alleen nog in de VPS via de console in de browser. Draait SSH op een andere poort dan 22, sta dan die poort toe.
ufw allow 22/tcp comment 'SSH'ufw allow– voegt een regel toe die inkomend verkeer toestaat.22/tcp– poort 22, protocol TCP.comment 'SSH'– een opmerking die in het overzicht van de regels verschijnt.
Je kunt ook een applicatieprofiel gebruiken. De lijst met profielen toont ufw app list (bijvoorbeeld OpenSSH, en na de installatie van Nginx ook Nginx Full). De regel voeg je dan toe met het commando ufw allow OpenSSH.
Inschakelen en controleren#
Schakel de firewall in:
bash ufw enableUFW vraagt
Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Heb je een regel voor SSH, typ danyen druk op Enter.Je ziet
Firewall is active and enabled on system startup. De firewall draait nu en start ook na een herstart.Controleer in een nieuw venster of je via SSH kunt verbinden.
Bekijk de uitgebreide status:
bash ufw status verboseUitvoertext Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere # SSH 22/tcp (v6) ALLOW IN Anywhere (v6) # SSH
| Uitvoerregel | Betekenis |
|---|---|
Status: active | De firewall draait. |
Logging: on (low) | Schrijft geblokkeerde pakketten naar het log, met een limiet op het aantal logregels. |
Default: deny (incoming) | Inkomend verkeer zonder regel wordt verworpen. |
allow (outgoing) | Uitgaand verkeer is toegestaan. |
disabled (routed) | Het doorsturen van verkeer (de VPS als router) regelt UFW niet. |
New profiles: skip | Nieuwe applicatieprofielen worden niet vanzelf toegestaan. |
22/tcp ALLOW IN Anywhere | Poort 22/TCP is vanaf overal toegestaan via IPv4. |
(v6) | Dezelfde regel voor IPv6. UFW maakt die automatisch aan. |
Regels voor diensten#
| Wat je wilt | Commando |
|---|---|
| Website (HTTP en HTTPS) | ufw allow proto tcp from any to any port 80,443 comment 'Web' |
| Minecraft Java | ufw allow 25565/tcp comment 'Minecraft' |
| Bedrock (Geyser) | ufw allow 19132/udp comment 'Geyser' |
| FiveM (TCP en UDP) | ufw allow 30120 comment 'FiveM' |
| Rust (spel en query) | ufw allow proto udp from any to any port 28015,28017 comment 'Rust' |
| Een poortbereik | ufw allow proto tcp from any to any port 25565:25600 comment 'Gameservers' |
| Een poort alleen vanaf één IP-adres | ufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB vanaf kantoor' |
| Een IP-adres blokkeren | ufw insert 1 deny from 198.51.100.25 comment 'Aanvaller' |
Zo lees je de onderdelen van de commando's:
25565/tcp– poort en protocol. Zonder protocol (ufw allow 30120) geldt de regel voor zowel TCP als UDP.proto tcp– het protocol in de uitgebreide schrijfwijze. Een bereik en een lijst van poorten (80,443,25565:25600) vereisen een protocol.from any/from 198.51.100.25– waar de verbinding vandaan komt: vanaf overal, of vanaf één adres (dat mag ook een bereik zijn,198.51.100.0/24).to any port 3306– naar welk adres van de VPS en welke poort.any= alle adressen van de VPS.insert 1– zet de regel op de eerste plaats. UFW beoordeelt de regels van boven naar beneden en de eerste overeenkomst geldt, dus de blokkade van een adres moet boven de regels staan die verkeer toestaan. Een IPv6-adres blokkeer je met het commandoufw prepend deny from 2001:db8::/64, dat de regel aan het begin van de IPv6-regels zet.deny– stil weggooien. De variantrejectlaat de afzender weten dat de verbinding is geweigerd.
Gebruik in opmerkingen (comment) alleen letters zonder accenten, cijfers en spaties.
Het aantal verbindingen beperken (limit)#
ufw limit 22/tcp comment 'SSH'ufw limit– staat de poort toe, maar blokkeert een IP-adres dat 6 of meer verbindingen binnen 30 seconden probeert op te zetten. Dat vertraagt het raden van wachtwoorden.
Heb je voor poort 22 al een allow-regel, verwijder die dan eerst (zie het volgende hoofdstuk), anders wint de oudere regel. Limit is niet geschikt voor diensten met veel legitieme verbindingen (web, games). Voor SSH is fail2ban beter, omdat dat reageert op echt mislukte inlogpogingen.
Genummerde regels en verwijderen#
ufw status numbered To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere # SSH
[ 2] 25565/tcp ALLOW IN Anywhere # Minecraft
[ 3] 22/tcp (v6) ALLOW IN Anywhere (v6) # SSH
[ 4] 25565/tcp (v6) ALLOW IN Anywhere (v6) # MinecraftEen regel verwijderen op nummer:
ufw delete 2ufw delete 2– verwijdert regel nummer 2. UFW vraagt om bevestiging (y).
Na elke verwijdering schuiven de nummers op, voer daarom vóór de volgende verwijdering opnieuw ufw status numbered uit. De IPv4- en de IPv6-variant zijn twee regels. Beide tegelijk verwijder je door de regel uit te schrijven: ufw delete allow 25565/tcp.
Andere handige commando's:
| Commando | Wat het doet |
|---|---|
ufw reload | Laadt de regels opnieuw (nadat je bestanden in /etc/ufw/ handmatig hebt aangepast). |
ufw disable | Schakelt de firewall uit, de regels blijven bewaard. |
ufw --dry-run allow 80/tcp | Laat zien wat het commando zou doen, maar verandert niets. |
ufw reset | Schakelt de firewall uit en verwijdert alle regels. Gebruik dit alleen als je helemaal opnieuw begint. |
IPv6#
Bij UFW staat IPv6 standaard aan: in het bestand /etc/default/ufw staat de regel IPV6=yes. Elke regel zonder een specifiek IPv4-adres wordt dan ook voor IPv6 aangemaakt (de regels met (v6)). Stel de waarde IPV6=no niet in. De VPS heeft een openbaar IPv6-adres en zonder IPv6-regels zou het IPv6-verkeer niet volgens jouw regels worden gefilterd.
Docker omzeilt UFW#
Als je in Docker een poort publiceert (-p 8080:80 of ports: in compose.yaml), is die vanaf het internet bereikbaar, ook als UFW hem blokkeert. Docker leidt het verkeer om naar de container voordat de regels van UFW eraan te pas komen. De documentatie van Docker beschrijft dit als een incompatibiliteit tussen Docker en UFW.
Zo voorkom je dat:
Publiceer poorten alleen op
127.0.0.1. Dan zijn ze alleen binnen de VPS bereikbaar en maak je ze naar buiten beschikbaar via Nginx (zie Nginx en HTTPS):compose.yamlYAML services: app: ports: - "127.0.0.1:8080:80"127.0.0.1:8080:80– poort 8080 op de VPS, maar alleen op het lokale adres, doorgestuurd naar poort 80 in de container.
Publiceer databases en interne diensten helemaal niet. Containers praten met elkaar via het netwerk van Docker, een poort naar buiten hebben ze niet nodig.
Gebruik de firewall in je klantaccount. Die filtert het verkeer al vóór de VPS en vangt dus ook poorten op die Docker heeft gepubliceerd.
Gebruik de Docker-instelling "iptables": false niet, die maakt het netwerk van de containers kapot. Geavanceerd filteren van verkeer naar containers (de chain DOCKER-USER) staat beschreven in de documentatie van Docker (opent in een nieuw venster). Meer over Docker lees je in de handleiding Docker en Docker Compose.
Logging#
ufw logging lowlow– schrijft geblokkeerde pakketten weg, met een limiet op het aantal logregels. Hogere niveaus (medium,high,full) schrijven meer weg en het log groeit dan snel.ufw logging offschakelt het loggen uit.
Hier vind je de logregels:
Ubuntu 24.04
tail -f /var/log/ufw.logtail -f– toont nieuwe regels van het bestand doorlopend. Je stopt met Ctrl+C.
Debian 13
journalctl -k -f --grep "UFW"journalctl -k– berichten van de kernel (Debian heeft standaard geen apart bestand/var/log/ufw.log).-f– nieuwe logregels doorlopend tonen.--grep "UFW"– alleen regels van UFW.
Voorbeeld van een logregel: [UFW BLOCK] IN=eth0 … SRC=198.51.100.25 DST=203.0.113.10 … PROTO=TCP SPT=51234 DPT=23. SRC is het adres van de afzender, DST je VPS, PROTO het protocol en DPT de poort waarmee de afzender verbinding probeerde te maken.
Voor gevorderden: nftables#
nftables is het moderne hulpmiddel voor firewallregels in de kernel. Op Debian is het het standaardframework en UFW gebruikt het zelf onder de motorkap (via de laag iptables-nft). Regels rechtstreeks in nftables schrijven is handig als je meer nodig hebt dan UFW kan.
Gebruik UFW en eigen nftables niet door elkaar
Gebruik óf UFW, óf je eigen /etc/nftables.conf. Schakel UFW uit (ufw disable) voordat je overstapt op nftables. De configuratie hieronder begint met het commando flush ruleset, dat alle regels in de kernel verwijdert, ook de regels van Docker en fail2ban. Herstart daarom na elke herstart van de service nftables ook Docker en fail2ban. Draait Docker op dezelfde VPS, blijf dan liever bij UFW of de firewall in je klantaccount.
Een voorbeeldbestand voor een server met SSH en een website:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport 22 accept
tcp dport { 80, 443 } accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}| Configuratieregel | Wat het doet |
|---|---|
flush ruleset | Verwijdert alle bestaande regels, zodat het bestand altijd schoon wordt geladen. |
table inet filter | De tabel filter voor de familie inet, dus IPv4 en IPv6 tegelijk. |
type filter hook input … policy drop | De chain voor inkomend verkeer. Wat geen enkele regel toestaat, wordt verworpen. |
ct state established,related accept | Laat antwoorden op al opgezette verbindingen door. Zonder deze regel zou niets werken wat de VPS zelf opent. |
ct state invalid drop | Verwerpt beschadigde of onzinnige pakketten. |
iif "lo" accept | Staat verkeer binnen de VPS toe (de loopback, 127.0.0.1). Zonder deze regel werken lokale databases en diensten niet meer. |
meta l4proto { icmp, ipv6-icmp } accept | Staat ICMP toe: ping en de berichten die nodig zijn om het netwerk goed te laten werken. IPv6 werkt niet zonder ICMPv6 (neighbor discovery). |
tcp dport 22 accept | SSH. Gebruik je een andere poort, pas die dan aan. |
tcp dport { 80, 443 } accept | Web. Een set poorten tussen accolades. Gebruik voor UDP udp dport. |
chain forward … policy drop | De VPS stuurt geen verkeer door (het is geen router). |
chain output … policy accept | Uitgaand verkeer zonder beperkingen. |
Zo neem je de configuratie in gebruik (geldt voor Debian 13 en Ubuntu 24.04):
Installeer het hulpprogramma:
apt install nftables.Schakel UFW uit als het draait:
ufw disable.Sla de configuratie op in
/etc/nftables.conf(nano /etc/nftables.conf).Controleer de configuratie zonder haar toe te passen:
bash nft -c -f /etc/nftables.conf-c– alleen controleren (check), er verandert niets. Is alles in orde, dan toont het commando niets.-f– de regels uit een bestand laden.
Schakel de service in die de regels meteen en na elke start laadt:
bash systemctl enable --now nftablesenable– de regels laden bij het opstarten van de VPS (de service staat standaard uit).--now– en ze meteen laden.
Controleer SSH in een nieuw venster. De actuele regels toont
nft list ruleset.
Controle#
ufw status verbosetoontStatus: activeen regels voor al je diensten.- Vanaf je eigen computer kun je via SSH verbinden en de diensten werken.
- Een poort die niet is toegestaan, reageert van buitenaf niet (test vanaf je computer: in Windows
Test-NetConnection <VPS_IP_ADDRESS> -Port 3306, op macOS en Linuxnc -vz -w 5 <VPS_IP_ADDRESS> 3306; bij een gesloten poort eindigt de test met een time-out).
Als je jezelf buitensluit#
- Open de console in de browser en log in als root.
- Sta SSH toe:
ufw allow 22/tcp, of schakel de firewall tijdelijk uit:ufw disable. - Bij nftables:
systemctl stop nftablesen daarnanft flush ruleset(verwijdert alle regels, het verkeer is dan toegestaan). - Herstel de regels en schakel de firewall weer in.
Als iets niet werkt#
ERROR: Must specify 'tcp' or 'udp' with multiple ports#
Een bereik en een lijst van poorten vereisen een protocol. Schrijf de regel zo: ufw allow proto tcp from any to any port 25565:25600. Voeg voor zowel TCP als UDP twee regels toe.
De regel is toegevoegd, maar de poort is nog steeds dicht#
- Controleer de volgorde (
ufw status numbered). Er mag geendeny-regel boven staan die hetzelfde verkeer verwerpt. - Controleer of de applicatie op de poort luistert:
ss -tulpn | grep <PORT>. Het adres127.0.0.1betekent dat ze alleen binnen de VPS bereikbaar is. - Controleer de firewall in je klantaccount. Staat die in de modus Alles blokkeren behalve wat is toegestaan, dan moet de poort ook daar zijn toegestaan.
Een poort van Docker staat open, hoewel UFW hem blokkeert#
Dat is het verwachte gedrag, zie het hoofdstuk Docker omzeilt UFW.
ERROR: initcaps bij het inschakelen#
UFW kan de kernelmodules niet gebruiken. Meestal heb je de kernel bijgewerkt en draait de VPS nog niet met de nieuwe. Herstart de VPS en schakel UFW opnieuw in.
Na een herstart van de service nftables werkt Docker of fail2ban niet meer#
flush ruleset heeft hun regels verwijderd. Herstart ze: systemctl restart docker fail2ban.
Samenvatting
- Eerst
ufw allow 22/tcp, pas daarnaufw enable. - Standaardbeleid:
deny incoming,allow outgoing; regels gelden van boven naar beneden, de eerste overeenkomst wint. ufw status numberedenufw delete <nummer>voor het beheer,ufw status verbosevoor de controle.- IPv6 staat aan (
IPV6=yes), regels worden voor beide versies aangemaakt. - Poorten die Docker publiceert, omzeilen UFW: publiceer op
127.0.0.1, of gebruik de firewall in je klantaccount. - nftables alleen voor gevorderden en nooit tegelijk met UFW.