Ausgangslage
Bei einem Security Scan meiner Virtuellen Maschine habe ich plötzlich offene Ports zu Diensten gesehen, welche eigentlich hinter der Firewall versteckt sein sollten. Der Status der Firewall hat zu diesem Zeitpunkt folgendes angezeigt:
systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: inactive (dead) since So 2020-02-09 21:45:46 CET; 7min ago
Docs: man:firewalld(1)
Main PID: 187 (code=exited, status=0/SUCCESS)
firewalld[166]: WARNING: ipset not usable, disabling ipset usage i...ll.
firewalld[166]: ERROR: Failed to load nf_conntrack module: modprob...ck'
modprobe: ERROR: could not insert 'nf_conntrack': ...ted
modprobe: ERROR: Error running install command for nf...
firewalld[166]: ERROR: Raising SystemExit in run_server
Ein Blick in die Log Dateien, welche im Standard unter /var/log/firewalld liegen zeigt dann als vollständige Meldung folgendes:
2019-09-18 09:30:21 WARNING: ipset not usable, disabling ipset usage in firewall.
2019-09-18 09:30:21 ERROR: Failed to load nf_conntrack module: modprobe: ERROR: could not find module by name='nf_conntrack'
modprobe: ERROR: could not insert 'nf_conntrack': Function not implemented
modprobe: ERROR: Error running install command for nf_conntrack
modprobe: ERROR: could not insert 'nf_conntrack': Operation not permitted
2019-09-18 09:30:21 ERROR: Raising SystemExit in run_server
Dies ist die Meldung vom ersten Auftritt des Fehlers nach einem Update im September. Obwohl zum heutigen Zeitpunkt, Februar 2020, schon einige Monate vergangen sind, gab es offensichtlich noch keinen Fix für dieses Problem. Bei meinen Recherchen habe ich verschiedene Workarounds gefunden. Von denen die vertrauenswürdig aussahen hat bei mir keiner gewirkt. Die letzte Chance den Dienst wieder zum Laufen zu bekommen ist das Downgrade auf die letzte funktionierende Version.
Lösung
Wie im vorherigen Abschnitt angesprochen liegt die Lösung zur Behebung des Problems aktuell darin, ein Downgrade der für den Firewall Service zuständigen Pakete vorzunehmen.
1) Alte funktionierende Pakete laden
Dazu werden zunächst diese Pakete aus dem Web geladen:
wget http://vault.centos.org/7.6.1810/os/x86_64/Packages/firewalld-0.5.3-5.el7.noarch.rpm
wget http://vault.centos.org/7.6.1810/os/x86_64/Packages/firewalld-filesystem-0.5.3-5.el7.noarch.rpm
wget http://vault.centos.org/7.6.1810/os/x86_64/Packages/python-firewall-0.5.3-5.el7.noarch.rpm
Mit allen Ausgaben sollte es dann ähnlich wie bei mir aussehen:
# wget http://vault.centos.org/7.6.1810/os/x86_64/Packages/firewalld-0.5.3-5.el7.noarch.rpm
--2020-02-09 21:51:08-- http://vault.centos.org/7.6.1810/os/x86_64/Packages/firewalld-0.5.3-5.el7.noarch.rpm
Auflösen des Hostnamen »vault.centos.org (vault.centos.org)«... 2001:4de0:aaae::194, 162.251.108.7
Verbindungsaufbau zu vault.centos.org (vault.centos.org)|2001:4de0:aaae::194|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 441288 (431K) [application/x-rpm]
In »»firewalld-0.5.3-5.el7.noarch.rpm«« speichern.
100%[=======================================================================================>] 441.288 1,79MB/s in 0,2s
2020-02-09 21:51:09 (1,79 MB/s) - »»firewalld-0.5.3-5.el7.noarch.rpm«« gespeichert [441288/441288]
# wget http://vault.centos.org/7.6.1810/os/x86_64/Packages/firewalld-filesystem-0.5.3-5.el7.noarch.rpm
--2020-02-09 21:51:19-- http://vault.centos.org/7.6.1810/os/x86_64/Packages/firewalld-filesystem-0.5.3-5.el7.noarch.rpm
Auflösen des Hostnamen »vault.centos.org (vault.centos.org)«... 2001:4de0:aaae::194, 162.251.108.7
Verbindungsaufbau zu vault.centos.org (vault.centos.org)|2001:4de0:aaae::194|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 50440 (49K) [application/x-rpm]
In »»firewalld-filesystem-0.5.3-5.el7.noarch.rpm«« speichern.
100%[=======================================================================================>] 50.440 --.-K/s in 0,02s
2020-02-09 21:51:19 (2,22 MB/s) - »»firewalld-filesystem-0.5.3-5.el7.noarch.rpm«« gespeichert [50440/50440]
# wget http://vault.centos.org/7.6.1810/os/x86_64/Packages/python-firewall-0.5.3-5.el7.noarch.rpm
--2020-02-09 21:51:29-- http://vault.centos.org/7.6.1810/os/x86_64/Packages/python-firewall-0.5.3-5.el7.noarch.rpm
Auflösen des Hostnamen »vault.centos.org (vault.centos.org)«... 2001:4de0:aaae::194, 81.171.33.194
Verbindungsaufbau zu vault.centos.org (vault.centos.org)|2001:4de0:aaae::194|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 339020 (331K) [application/x-rpm]
In »»python-firewall-0.5.3-5.el7.noarch.rpm«« speichern.
100%[=======================================================================================>] 339.020 1,38MB/s in 0,2s
2020-02-09 21:51:30 (1,38 MB/s) - »»python-firewall-0.5.3-5.el7.noarch.rpm«« gespeichert [339020/339020]
2) YUM Downgrade
Nachdem wir nun die funktionierenden Pakete auf dem System haben, wird der Paketmanager YUM instruiert ein Downgrade vorzunehmen und die alten Pakete zu installieren.
yum downgrade firewalld-0.5.3-5.el7.noarch.rpm firewalld-filesystem-0.5.3-5.el7.noarch.rpm python-firewall-0.5.3-5.el7.noarch.rpm
Danach beginnt der Downgrade Prozess mit folgenden Ausgaben und zugehörigem Dialog:
# yum downgrade firewalld-0.5.3-5.el7.noarch.rpm firewalld-filesystem-0.5.3-5.el7.noarch.rpm python-firewall-0.5.3-5.el7.noarch.rpm
Geladene Plugins: fastestmirror
firewalld-0.5.3-5.el7.noarch.rpm wird untersucht: firewalld-0.5.3-5.el7.noarch
firewalld-filesystem-0.5.3-5.el7.noarch.rpm wird untersucht: firewalld-filesystem-0.5.3-5.el7.noarch
python-firewall-0.5.3-5.el7.noarch.rpm wird untersucht: python-firewall-0.5.3-5.el7.noarch
Abhängigkeiten werden aufgelöst
--> Transaktionsprüfung wird ausgeführt
---> Paket firewalld.noarch 0:0.5.3-5.el7 markiert, um ein Downgrade zu werden
---> Paket firewalld.noarch 0:0.6.3-2.el7_7.3 markiert, um gelöscht zu werden
---> Paket firewalld-filesystem.noarch 0:0.5.3-5.el7 markiert, um ein Downgrade zu werden
---> Paket firewalld-filesystem.noarch 0:0.6.3-2.el7_7.3 markiert, um gelöscht zu werden
---> Paket python-firewall.noarch 0:0.5.3-5.el7 markiert, um ein Downgrade zu werden
---> Paket python-firewall.noarch 0:0.6.3-2.el7_7.3 markiert, um gelöscht zu werden
--> Abhängigkeitsauflösung beendet
Abhängigkeiten aufgelöst
=================================================================================================================================
Package Arch Version Paketquelle Größe
=================================================================================================================================
Downgrading:
firewalld noarch 0.5.3-5.el7 /firewalld-0.5.3-5.el7.noarch 1.8 M
firewalld-filesystem noarch 0.5.3-5.el7 /firewalld-filesystem-0.5.3-5.el7.noarch 239
python-firewall noarch 0.5.3-5.el7 /python-firewall-0.5.3-5.el7.noarch 1.8 M
Transaktionsübersicht
=================================================================================================================================
Zurücksetzen 3 Pakete
Gesamtgröße: 3.6 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installieren : python-firewall-0.5.3-5.el7.noarch 1/6
Installieren : firewalld-filesystem-0.5.3-5.el7.noarch 2/6
Installieren : firewalld-0.5.3-5.el7.noarch 3/6
Aufräumen : firewalld-0.6.3-2.el7_7.3.noarch 4/6
Aufräumen : firewalld-filesystem-0.6.3-2.el7_7.3.noarch 5/6
Aufräumen : python-firewall-0.6.3-2.el7_7.3.noarch 6/6
Überprüfung läuft: firewalld-filesystem-0.5.3-5.el7.noarch 1/6
Überprüfung läuft: firewalld-0.5.3-5.el7.noarch 2/6
Überprüfung läuft: python-firewall-0.5.3-5.el7.noarch 3/6
Überprüfung läuft: python-firewall-0.6.3-2.el7_7.3.noarch 4/6
Überprüfung läuft: firewalld-filesystem-0.6.3-2.el7_7.3.noarch 5/6
Überprüfung läuft: firewalld-0.6.3-2.el7_7.3.noarch 6/6
Entfernt:
firewalld.noarch 0:0.6.3-2.el7_7.3 firewalld-filesystem.noarch 0:0.6.3-2.el7_7.3 python-firewall.noarch 0:0.6.3-2.el7_7.3
Installiert:
firewalld.noarch 0:0.5.3-5.el7 firewalld-filesystem.noarch 0:0.5.3-5.el7 python-firewall.noarch 0:0.5.3-5.el7
Komplett!
3) Firewall Service Neustarten
Nun muss nur noch die Firewall neugestartet werden, um zu sehen, dass die Änderungen erfolgreich waren:
# systemctl restart firewalld.service
# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since So 2020-02-09 21:54:04 CET; 3s ago
Docs: man:firewalld(1)
Main PID: 1429 (firewalld)
CGroup: /system.slice/firewalld.service
└─1429 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
4) Alte Pakete fest pinnen
Damit die Änderung weiterhin bestehen bleibt, sagen wir dem Paketmanager noch, dass er die drei Pakete nicht mehr updaten darf.
yum versionlock firewalld firewalld-filesystem python-firewall
Geladene Plugins: fastestmirror, versionlock
Adding versionlock on: 0:firewalld-0.5.3-5.el7
Adding versionlock on: 0:firewalld-filesystem-0.5.3-5.el7
Adding versionlock on: 0:python-firewall-0.5.3-5.el7
versionlock added: 3
Fertig. Ab jetzt sollte die Firewall wieder funktionieren.
Fehlersuche
yum versionlock installieren
Sollte bei euch der Befehl yum versionlock nicht existieren und eine Fehlermeldung erscheinen, die wie folgt lautet:
yum versionlock firewalld firewalld-filesystem python-firewall
Geladene Plugins: fastestmirror
Kein solcher Befehl: versionlock. Bitte /usr/bin/yum --help verwenden.
Dann muss zunächst das Paket installiert werden:
yum install yum-plugin-versionlock
Alle mit yum versionlock gehaltenen Pakete anzeigen:
yum versionlock list
Geladene Plugins: fastestmirror, versionlock
0:firewalld-0.5.3-5.el7.*
0:firewalld-filesystem-0.5.3-5.el7.*
0:python-firewall-0.5.3-5.el7.*
versionlock list done
yum versionlock Einträge zurücksetzen
Um alle Einträge aus der Liste von yum versionlock herauszulösen wird der folgende Befehl genutzt. Dies solltet ihr spätestens für die Firewall Pakete machen, wenn der Fehler gefixt ist und die Firewall wieder mit aktuellen Paketen funktioniert.
yum versionlock clear
netcat zum Prüfen der Verbindung
Um zu prüfen, dass ein Port wirklich nicht erreichbar ist, bediene ich mich des Tools netcat. Netcat erlaubt es zu prüfen ob ein Port erreichbar ist. Meistens wird es sicherlich verwendet, um zu schauen, ob ein neuer Dienst funktioniert. Um zu testen ob die Firewall funktioniert, habe ich bewusst einen Port ausgewählt, der nicht mehr verfügbar sein sollte, wie auch einen Port, welcher nach außen exponiert sein soll.
Syntax
Netcat wird über eine Konsole wie folgt aufgerufen:
nc [Optionen] [IP-Adresse/Hostname] [Port]
Häufige Optionen sind z. B.
-4/-6 | IP-Protokollversion (IPv4 bzw. IPv6) |
-l | Listen-Modus für eingehende Verbindungen über den angegebenen Port |
-p sport | setzt einen Quell-Port für ausgehende Verbindungen |
-U | verwendet UNIX-domain sockets |
-u | verwendet das UDP Protokoll statt des Default-Protokolls TCP |
-v | erhöht die Debug-Ausgabe |
-w timeout | Timeout bei ausgehenden Verbindungsaufbauten |
-z | in Verbindung mit Port-Checks, ohne dass Daten gesendet werden |
Beispiel: Einfacher Verbindungstest (Port-Checks)
Im einfachsten Fall kann Netcat dazu verwendet werden, die Verfügbarkeit von Ports zu testen. Zunächst prüfen wir ob der DNS Dienst erreichbar ist. Bei einer TCP-Verbindungen geschieht dies über folgenden Aufruf:
# nc -v -z Remote-Host Port # nc -v -z 5.35.240.193 53 Connection to 5.35.240.193 port 53 [tcp/domain] succeeded!
Im Fall von UDP-Diensten muss der folgende Aufruf verwendet werden. Achtung jedoch, hier werdet ihr immer eine erfolgreich Meldung („succeeded“) erhalten, es sei denn, ihr bekommt eine Zurückweisung (rejection) via ICMP:
# nc -v -z -u Remote-Host Port # nc -v -z -u 5.35.240.193 53 Connection to 5.35.240.193 port 53 [udp/domain] succeeded!