Firewall down: Failed to load nf_conntrack module on CentOS 7.7

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/-6IP-Protokollversion (IPv4 bzw. IPv6)
-lListen-Modus für eingehende Verbindungen über den angegebenen Port
-p sportsetzt einen Quell-Port für ausgehende Verbindungen
-Uverwendet UNIX-domain sockets
-uverwendet das UDP Protokoll statt des Default-Protokolls TCP
-verhöht die Debug-Ausgabe
-w timeoutTimeout bei ausgehenden Verbindungsaufbauten
-zin 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!

Weitere Informationen

This article has 1 comments

Leave a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.