Firewall gebruiken met ufw en gufw
Op deze pagina:
De Linux kernel heeft een packet filtering system dat netfilter heet en deze wordt ingesteld via opdrachten voor iptables. Iptables is een complete firewall oplossing die zowel zeer configurabel als zeer flexibel is. Het instellen van iptables is echter complex en daarom zijn er ook eenvoudiger manieren bedacht om de firewall in te stellen.
De naam ufw staat voor Uncomplicated Firewall. In Debian en Ubuntu is ufw het standaard configuratiemiddel voor het instellen van de firewall. Het is ontworpen om het instellen van iptables te vereenvoudigen. Standaard staat ufw echter uit, je moet dit zelf aanzetten, de standaardregels staan dan wel meteen goed voor normaal thuisgebruik.
Als je software zoals Samba, Apache, FTP, MySQL, SSH, VNC of experimentele software installeert op een laptop die je ook buiten je thuisnetwerk gebruikt, dan is een firewall geen overbodige luxe. Een firewall kan voorkomen dat ongewenst dataverkeer naar buiten gaat of naar binnen komt.
Docker stelt iptables rechtstreeks in, ufw regels die je instelt gelden niet voor Docker containers.
Gufw is beschikbaar als grafische interface voor ufw en is niet standaard geinstalleerd, die moet je dus zelf nog installeren als je deze wil gebruiken.
sudo apt install gufw
Het bewerken van de instellingen is zeer eenvoudig via de grafische interface van gufw. Wat via de commandline ingesteld kan worden zoals hieronder op deze pagina uitgelegd, kan ook op een eenvoudige, voor de hand liggende manier, via de grafische interface gedaan worden.
ufw defaults
De defaults voor ufw zijn dat alle inkomende verbindingen tegengehouden worden en alle uitgaande verbindingen zijn toegestaan. Je moet dus zelf poorten openzetten om inkomende verbindingen toe te staan. Alle programma's kunnen standaard wel verbindingen naar buiten maken.
De defaults staan in /etc/default/ufw.
De defaults kan je ook zelf instellen:
ufw default deny incoming
ufw default allow outgoing
Controleren of IPv6 aanstaat in de configuratie:
less /etc/default/ufw | grep IPV6
Het resultaat moet zijn:
IPV6=yes
ufw configuratie bestanden
- /etc/default/ufw
- Hier onder andere: default policies, IPv6 support en te gebruiken kernel modules.
- /etc/ufw/before6.rules
- Deze regels worden als eerste bekeken, nog voor enige andere regels die via de ufw opdrachten worden toegevoegd.
- /etc/ufw/after6.rules
- Deze regels worden pas bekeken na de regels die via de ufw opdrachten worden toegevoegd.
- /etc/ufw/sysctl.conf
- kernel network tunables
- /var/lib/ufw/user6.rules of /lib/ufw/user6.rules
- Regels die via de ufw opdrachten zijn toegevoegd.
- /etc/ufw/ufw.conf
- Hier wordt ingesteld of ufw vanaf de start van het systeem ingeschakeld is en ook het LOGLEVEL wordt hier bepaald.
- /etc/ufw/after.init
- Script dat draait nadat ufw is geinitialiseerd.
- /etc/ufw/before.init
- Script dat draait voordat ufw is geinitialiseerd.
ufw aan- en uitzetten
Het aanzetten van ufw kan met:
sudo ufw enable
Let op! Als je via SSH bent ingelogd, dan krijg je een waarschuwing, als je een regel hebt ingesteld dat SSH is toegestaan, dan kan je doorgaan, anders moet eerst een regel instellen om te voorkomen dat je de verbinding met het systeem verliest na het inschakelen van ufw.
SSH toestaan kan via:
sudo ufw allow ssh
Als je SSH niet via de standaardpoort gebruikt, maar via een andere poort, bijvoorbeeld 4538, dan moet je die openzetten:
sudo ufw allow 4538/tcp
Na het aanzetten krijg je de melding:
Firewall is actief en ingeschakeld bij het opstarten van het systeem.
Dit betekent dat na een herstart van het systeem de firewall automatisch actief blijft.
Het uitzetten van ufw gaat met:
sudo ufw disable
ufw status opvragen
De status van ufw opvragen kan met:
sudo ufw status
Je krijgt dan te zien of ufw actief is en indien deze actief is, krijg je ook de huidige ufw regels te zien die worden toegepast op je iptables.
Een uitgebreidere status opvragen kan met:
sudo ufw status verbose
voorbeeld uitvoer:
Status: actief
Loggen: on (low)
Standaardwaarde: deny (inkomend), allow (uitgaand), disabled (omgeleid)
Nieuwe profielen: skip
Welke regels gelden kan je opvragen met:
sudo ufw show raw
Deze regels staan in configuratiebestanden die eindigen op .rules in: /etc/ufw
Verbindingen toestaan (poorten openzetten)
Let op! De volgorde van de regels is belangrijk! Zodra een passende geldende regel gevonden is, wordt er niet verder gekeken. De meest specifieke regels moeten daarom vóór de meer algemene regels staan. Als je regels aanpast kan het zijn dat je oude regels moet verwijderen om te zorgen dat de regels in de juiste volgorde staan.
Een verbinding toestaan op een poort kan met:
sudo ufw allow poort/protocol
Het gedeelte met /protocol is optioneel, mag dus ook worden weggelaten indien je zowel tcp als udp wil toestaan.
Voorbeelden:
#Inkomende verkeer via tcp en udp toestaan met poort 53 (DNS)
sudo ufw allow 53
#Inkomend verkeer toestaan via tcp met poort port 53 (DNS)
sudo ufw allow 53/tcp
#Inkomend verkeer toestaan via udp met poort 53 (DNS)
sudo ufw allow 53/udp
Je kunt ook verbindingen toestaan voor een service via de naam van de service.
Een lijst met services kan je opvragen via:
less /etc/services
Als je een bepaalde service zoekt, bijvoorbeeld ftp, dan kan je dit gebruiken:
less /etc/services | grep ftp
Je krijgt dan bijvoorbeeld:
ftp-data 20/tcp
ftp 21/tcp
tftp 69/udp
sftp 115/tcp
ftps-data 989/tcp # FTP over SSL (data)
ftps 990/tcp
venus-se 2431/udp # udp sftp side effect
codasrv-se 2433/udp # udp sftp side effect
gsiftp 2811/tcp
gsiftp 2811/udp
frox 2121/tcp # frox: caching ftp proxy
zope-ftp 8021/tcp # zope management by ftp
De algemene vorm voor het toestaan van verbinding via een naam van een service is:
sudo ufw allow service-naam
Voorbeeld:
#ssh toestaan:
sudo ufw allow ssh
Verkeer van een bepaald ip-adres toestaan:
sudo ufw allow from ip-adres
Voorbeeld:
sudo ufw allow from <?php echo $ip; ?>
Verkeer van een bepaald subnet toestaan via het subnetmask:
sudo ufw allow from 192.168.1.0/24
Verkeer van een bepaald subnet toestaan via het subnetmask op een specifieke poort:
sudo ufw allow from 192.168.1.0/24 to any port 22
Verkeer toestaan op basis van een specifieke poort en ip-adres:
sudo ufw allow from doel to bestemming port poortnummer
Voorbeeld:
#Toegang toestaan voor ip-adres 192.168.0.4 tot poort 22 voor alle protocollen
sudo ufw allow from 192.168.0.4 to any port 22
Verkeer toestaan op basis van specifieke poort, ip-adres en protocol:
sudo ufw allow from doel to bestemming port poortnummer proto protocolnaam
Voorbeeld:
#Toegang toestaan voor ip-adres 192.168.0.4 tot poort 22 voor TCP
sudo ufw allow from 192.168.0.4 to any port 22 proto tcp
Verkeer toestaan voor een reeks opvolgende poorten kan ook, je moet dan wel het protocol verplicht meegeven.
Om zowel een reeks voor tcp als udp open te zetten heb je dan 2 regels nodig:
sudo ufw allow 7100:7200/tcp
sudo ufw allow 7100:7200/udp
Verkeer toestaan via de naam van een programma kan ook.
In de map /etc/ufw/applications.d staan applicatieprofielen van de programma's die bij de installatie hier een profiel hebben neergezet. Het profiel beschrijft het programma en bevat de instellingen voor ufw. De bestanden in deze map kunnen worden aangepast als er een afwijkend poortnummer wordt gebruikt.
Het profiel opvragen, bijvoorbeeld voor 'Samba', kan met:
sudo ufw app info 'Samba'
Je krijgt dan zoiets:
Profiel: Samba
Titel: LanManager-like file and printer server for Unix
Omschrijving: The Samba software suite is a collection of programs that
implements the SMB/CIFS protocol for unix systems, allowing you to serve
files and printers to Windows, NT, OS/2 and DOS clients. This protocol is
sometimes also referred to as the LanManager or NetBIOS protocol.
Poorten:
137,138/udp
139,445/tcp
Zien welke profielen er zijn kan met:
sudo ufw app list
Je krijgt dan bijvoorbeeld:
Beschikbare programma's:
Apache
Apache Full
Apache Secure
CUPS
OpenSSH
Samba
syncthing
syncthing-gui
Voorbeeld van poorten openzetten op basis van de naam van een programma:
sudo ufw allow Samba
Een uitgebreidere regel gebruiken kan ook:
sudo ufw allow from 192.168.1.0/24 to any app Samba
Poortnummers hoef je nu niet op te geven, die komen uit het bestand in /etc/ufw/applications.d.
Verkeer toestaan via een bepaalde netwerk interface is ook mogelijk.
Je kunt de interfaces opvragen via:
ip addr | grep BROADCAST
je krijgt dan bijvoorbeeld:
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
Verkeer toestaan via enp5s0 :
sudo ufw allow in on enp5s0 to any port 8080
Verbindingen tegenhouden
De default voor inkomende verbindingen is: alles tegenhouden tenzij het specifiek is opengezet.
Regels maken om verbindingen tegen te houden gaat op dezelfde manier als het maken van regels om verbindingen toe te staan, alleen in plaats van allow gebruk je nu deny.
Verbindingen tegenhouden op een poort kan met:
sudo ufw deny poort/protocol
Het gedeelte met /protocol is optioneel, mag dus ook worden weggelaten indien je zowel tcp als udp wil tegenhouden.Voorbeelden:
#Inkomende verkeer via tcp en udp tegenhouden met poort 53 (DNS)
sudo ufw deny 53
#Inkomend verkeer tegenhouden via tcp met poort port 53 (DNS)
sudo ufw deny 53/tcp
#Inkomend verkeer tegenhouden via udp met poort 53 (DNS)
sudo ufw deny 53/udp
Je kunt ook verbindingen tegenhouden voor een service via de naam van de service:
sudo ufw deny service-naam
Voorbeeld:
#ssh tegehouden:
sudo ufw deny ssh
Verbinding tegenhouden op basis van ip-adres:
sudo ufw deny from ip-adres
Voorbeeld:
sudo ufw deny from <?php echo $ip; ?>
Verbinding tegenhouden op basis van poort en ip-adres:
sudo ufw deny from ip-adres to protocol port poortnummer
Voorbeeld:
sudo ufw deny from <?php echo $ip; ?> to any port 22
Verbinding tegehouden op basis van een subnet en poort:
sudo ufw deny from <?php echo $ip; ?>/24 to any port 22
Verkeer beperken
Je kunt verkeer ook beperken als je bijvoorbeeld bang bent voor een Denial of Service attack, bijvoorbeeld via poort 80 (HTTP):
sudo ufw limit 80/tcp
Standaard zal met deze regel de verbinding nu worden geblokkeerd na 6 pogingen in 30 seconden.
Bestaande regels verwijderen of tussenvoegen
Een regel verwijderen kan door delete te plaatsen voor de originele regel (na sudo ufw):
Originele regel (poort 80 wordt gebruikt voor HTTP):
sudo ufw deny 80/tcp
Deze regel verwijderen:
sudo ufw delete deny 80/tcp
Het verwijderen van ingewikkelde regels kan eenvoudiger door het nummer van de regel te gebruiken.
Eerst de nummers van de regels opvragen:
sudo ufw status numbered
Dan de regel verwijderen met het nummer van de regel:
sudo ufw delete nummer
De regel met het nummer dat je hebt opgegeven wordt nu verwijderd.
Je kan ook een regel tussenvoegen via een regelnummer:
sudo ufw insert 1 allow from <?php echo $ip; ?>
Logging
Logging aanzetten:
sudo ufw logging on
Logging uitzetten:
sudo ufw logging off
Het niveau van logging kan ingesteld worden op 'low', 'medium', 'high' en 'full'. Standaard is logging ingesteld op 'low'.
sudo ufw logging medium
Logs bekijken kan via:
less /var/log/ufw.log
In de logs kom je onder andere de datum en tijd tegen, een gat hier in kan betekenen dat er met de logs is geknoeid. De hostnaam staat er in en de uptime (tussen vierkante haken) en je kan deze zaken tegenkomen:
- [UFW BLOCK]
- De gebeurtenis tussen vierkante haken, hier is een geblokkeerde verbinding gelogd.
- IN
- Indien dit een waarde bevat, dan ging het om een inkomende verbinding.
- OUT
- Indien dit een waarde bevat, dan ging het om een uitgaande verbinding.
- MAC
- Een combinatie van de bestemming en de bron MAC adressen.
- SRC
- Het IP van de pakket bron.
- DST
- Het IP van de pakket bestemming.
- LEN
- Pakket lengte.
- TTL
- De pakket TTL (Time To Live).
- PROTO
- Het protocol van het pakket.
- SPT
- De bron poort van het pakket.
- DPT
- De bestemming poort van het pakket.
- WINDOW
- De pakketgrootte die de verzender kan ontvangen.
- SYN URGP
- Geeft aan of een drieweg handshake nodig is, 0 betekent van niet.
Ping toestaan of juist niet
Standaard staat ufw ping verzoeken toe. Voor het onderzoeken van netwerkproblemen is het ook handig als ping verzoeken worden toegestaan.
Mocht je toch ping verzoeken willen uitzetten, dan moet dat via het bewerken van het bestand /etc/ufw/before.rules. Er zijn 2 methoden om ping uit te zetten:
methode 1: via het verwijderen van deze regels:
# ok icmp codes
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
methode 2: via het aanpassen van deze regels:
Verander op elke regel hier "ACCEPT" in "DROP":
# ok icmp codes
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j DROP
-A ufw-before-input -p icmp --icmp-type source-quench -j DROP
-A ufw-before-input -p icmp --icmp-type time-exceeded -j DROP
-A ufw-before-input -p icmp --icmp-type parameter-problem -j DROP
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP
Proefdraaien
Als ufw met de optie --dry-run wordt uitgevoerd, worden de filterregels getoond maar niet toegepast. Voorbeeld voor het openstellen van de HTTP netwerkpoort:
sudo ufw --dry-run allow http
Opnieuw beginnen
Als je opnieuw wilt beginnen en alles terug wil zetten naar de default instellingen, dan kan dat met:
sudo ufw reset
Alle actieve regels worden dan gewist.
Meer info over ufw en gufw
De help is te vinden met:
ufw --help
De manpages hebben ook info over ufw:
man ufw
Internet: