Firewall-Konfiguration und Netzwerkeinstellungen prüfen (Linux)

In diesem Artikel werden die wichtigsten Befehle genannt, die Sie zur Prüfung der Netzwerkkonfiguration und der Firewall-Konfiguration benötigen.

Portscan durchführen

Um einen Portscan durchzuführen, können Sie das Programm netcat verwenden. Netcat (nc), ist ein universelles Kommandozeilenwerkzeug. Es kann im Terminal oder in Skripten für die Kommunikation über TCP- und UDP-Netzwerkverbindungen (Internet Protocol Version 4 und Version 6) verwendet werden.

Das Programm netcat ist ein Bestandteil von jeder Ubuntu-Installation, kann jedoch ggf. über das Paket netcat-openbsd installiert werden.

Um netcat auf einem Server mit der Distribution CentOS zu installieren, geben Sie den folgenden Befehl ein:

CentOS 7

[root@localhost ~]# yum install nc.x86_64
CentOS 8

[root@localhost ~]# dnf install nmap

 

Um mit netcat einen Portscan durchzuführen, geben Sie den folgenden Befehl ein:

nc -v IP-ADRESSE-DES-SERVERS PORTNUMMER
Beispiel:

[root@localhost ~]# nc -v 192.168.1.1 22

Netzwerkdienste prüfen

Um eine Liste der lauschenden Netzwerkdienste, Deamons und Programme aufzurufen, geben Sie den folgenden Befehl ein:

netstat -tulpen

Anschließend können Sie prüfen, ob die betreffenden Netzwerkdienste, Deamons und Programme aktiv sind und auf dem korrekten Port lauschen. Ferner können Sie nach der Eingabe des Befehls feststellen, ob der benötigte Port freigeschaltet werden muss.

Beispiel:

[root@localhost ~]# netstat -tulpen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      193        27635      1368/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          29477      1582/sshd
tcp6       0      0 :::5355                 :::*                    LISTEN      193        27638      1368/systemd-resolv
tcp6       0      0 :::22                   :::*                    LISTEN      0          29479      1582/sshd
udp        0      0 0.0.0.0:5355            0.0.0.0:*                           193        27634      1368/systemd-resolv
udp        0      0 127.0.0.53:53           0.0.0.0:*                           193        27640      1368/systemd-resolv
udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          27510      1314/dhclient
udp        0      0 127.0.0.1:323           0.0.0.0:*                           0          25505      1174/chronyd
udp6       0      0 :::5355                 :::*                                193        27637      1368/systemd-resolv
udp6       0      0 ::1:323                 :::*                                0          25506      1174/chronyd

Netzwerkonfiguration prüfen

Um die konfigurierten Interfaces anzuzeigen, geben Sie den Befehl ip addr ein. Nach der Eingabe des Befehls wird Ihnen der Status von jedem Interface angezeigt:

Beispiel:

root@localhost:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:00:f1:5b brd ff:ff:ff:ff:ff:ff
    inet 217.160.173.123/32 brd 217.160.173.123 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe00:f15b/64 scope link
       valid_lft forever preferred_lft forever


Ein deaktiviertes Interface können Sie mit dem folgenden Befehl wieder aktivieren:

sudo ifup NAME_DES_INTERFACES


Beispiel:

[root@localhost ~]# sudo ifup ens192
Wenn dieser Befehl fehlschlägt, ist es möglich, dass sich das Interface in einem Zustand befindet, das dem Befehlsskript unbekannt ist. Geben Sie in diesem Fall den gleichen Befehl mit dem Parameter --force ein:

sudo ifup --force NAME_DES_INTERFACES
Beispiel:

[root@localhost ~]# sudo ifup --force ens192

Prüfen Sie anschließend, ob Sie eine verschlüsselte Netzwerkverbindung zu Ihrem Server herstellen können. Wenn dies nicht möglich ist, prüfen Sie die Netzwerkkonfiguration des Servers.

Öffnen Sie zu diesem Zweck die unten aufgeführten Konfigurationsdateien mit dem Editor vi. Prüfen und editieren Sie die Einstellungen und führen Sie anschließend ggf. einen Neustart des Netzwerks durch, um die Änderungen an der Netzwerkkonfiguration zu übernehmen:

Ubuntu

/etc/network/interfaces

CentOS 7 und CentOS 8

/etc/sysconfig/network-scripts/


Um einen Neustart des Netzwerks durchzuführen, geben Sie den folgenden Befehl bzw. die folgenden Befehle ein:

Ubuntu

[root@localhost ~]# /etc/init.d/networking restart 
CentOS 7

[root@localhost ~]# /etc/init.d/network restart
CentOS 8

[root@localhost ~]# nmcli networking off
[root@localhost ~]# nmcli networking on

IP-Routing-Tabelle mit route anzeigen und konfigurieren

Mit dem Programm route können Sie die IP-Routing-Tabelle anzeigen und konfigurieren. Geben Sie hierzu den folgenden Befehl ein:

[root@localhost ~]# route

Nach der Eingabe des Befehls werden z.B. die folgenden Informationen angezeigt:

[root@localhost home]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens192
gateway         0.0.0.0         255.255.255.255 UH    100    0        0 ens192
169.254.169.254 gateway         255.255.255.255 UGH   100    0        0 ens192
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
localhost       0.0.0.0         255.255.255.255 UH    100    0        0 ens192

Firewall-Konfiguration prüfen (CentOS 6, CentOS 7 und Ubuntu)

Im Linux-Kernel ist standardmäßig ein Paketfilter integriert, der durch Module des Software-Pakets Netfilter bereitgestellt wird. Um diesen zu konfigurieren, ist ein zusätzliches Programm erforderlich.

Als Administrator können Sie das Programm iptables verwenden, um Regeln zu erstellen, zu verändern oder zu löschen. iptables ist ein Programm zur Konfiguration der Tabellen (tables), die durch die Firewall im Linux-Kernel bereitgestellt werden.

Die Einstellungen die Sie mit iptables vornehmen, gehen beim Systemneustart verloren. Mithilfe der Tools iptables-save und iptables-restore können Sie die angelegten Regeln speichern und wiederherstellen.

Achtung

Stellen Sie bei jeder Änderung von iptables sicher, dass die für die Erreichbarkeit des Servers erforderlichen Ports wie z.B. Port 22 nicht gesperrt werden.

Mit einem Init-Script erfolgt dies automatisch im Lauf des Bootprozesses. iptables ist auf das Protokoll IPv4 beschränkt. Für die weiteren Protokolle gibt es entsprechende Varianten wie z.B. ip6tables für IPv6 oder ebtables für Ethernet-Pakete, die ebenfalls im Kernel-Modul enthalten sind.

Unter Linux ist iptables für gewöhnlich bereits vorinstalliert. iptables setzt erweiterte Systemprivilegien voraus und kann nur als Root oder mit Administrator-Rechten ausgeführt werden. 
Die Paketprüfung und die mit iptables zu erstellenden Filterregeln sind dreistufig aufgebaut. Es gibt Tabellen (tables),  "Chains" (Ketten) und Regeln (rules). 

Die mit dem Programm geladenen und zuvor vom Kernel erzeugten Tabellen (tables) enthalten Ketten (chains) von Regeln (rules), die definieren, wie eingehende und ausgehende Datenpakete behandelt werden sollen. Diese Pakete werden innerhalb einer Kette von Regel zu Regel weitergereicht. Jede Regel kann eine Aktion auslösen (jump target) oder einen Wechsel in eine andere Kette bewirken (goto chain).

Folgende Aktionen können ausgelöst werden:

ACCEPT: Das Paket wird angenommen.

DROP: Das Paket wird verworfen.

QUEUE: Verschiebt das Paket in die Benutzerprozesse; setzt einen Vermittler (queue handler) voraus, der die Pakete an eine Anwendung weiterleitet.

RETURN: Das Paket wird in die vorangegangene Kette zurückgeschickt, wenn es sich um eine benutzerdefinierte Kette handelt. In Standardketten wird die Richtlinie (policy) der Kette ausgeführt. Ohne Konfiguration wird standardmäßig die Aktion ACCEPT ausgeführt.

Tabellen

In den Tabellen werden Filterregeln zu Gruppen zusammengefasst. Diese werden nach der grundsätzlichen Aufgabe unterteilt. Es gibt vier wichtige Tabellen, in denen Sie Filterregeln hinterlegen können:

filter: Dies ist die Standardtabelle.  

nat: Wird verwendet, um Pakete zu ändern, die eine neue Verbindung herstellen und für die Adressumsetzung (Network Address Translation, NAT) verwendet werden.

mangle: Diese Tabelle wird in der Regel für bestimmte Arten von Paketmanipulation eingesetzt.

raw: Diese Tabelle wird in der Regel eingesetzt, um Ausnahmen vom Connection Tracking in Kombination mit dem NOTRACK Target zu definieren.

Chains

Jede Tabelle enthält verschiedene Chains. Die Chains legen fest, wann ein Paket geprüft wird. Es gibt folgende Chains: 

Chain Tabelle Beschreibung
INPUT filter, mangle Wird auf alle Pakete angewendet, die an einen lokalen Prozess gerichtet sind.
OUTPUT filter, nat, mangle, raw Wird auf alle Pakete angewendet, die von einem lokalen Prozess stammen.
FORWARD filter, mangle Wird auf alle Pakete angewendet, die geroutet werden.
PREROUTING nat, mangle, raw Wird auf alle Pakete angewendet, bevor diese geroutet werden.
POSTROUTING nat, mangle Wird auf alle Pakete angewendet, nachdem diese geroutet wurden.

In den Tabellen und Chains werden die Filterregelsätze festgelegt. Dies geschieht über einen Aufruf von iptables im Terminal.

Eine detaillierte Übersicht über die Funktionsweise der Paketfilter-Software bietet die Man-Page. Diese können Sie mit dem folgenden Befehl aufrufen:

[root@localhost ~]# man iptables
Darüber hinaus finden Sie auf der folgenden Seite weitere Informationen:

http://www.netfilter.org

Um das Standardverhalten von iptables anzuzeigen, geben Sie den folgenden Befehl ein:

[root@localhost ~]# iptables –L

Um zu prüfen, welche Filterregeln bereits hinterlegt sind, geben Sie die folgenden Befehle ein:

[root@localhost ~]# sudo iptables -t filter –L

[root@localhost ~]# sudo iptables -t nat –L

[root@localhost ~]# sudo iptables -t mangle -L

[root@localhost ~]# sudo iptables -t raw –L
Um alle Regeln zu löschen, geben Sie den folgenden Befehl ein:

[root@localhost ~]# iptables –F

Weitere wichtige Befehle

Im Folgenden sind weitere wichtige Befehle für iptables aufgeführt.


Eine neue Kette erstellen:

sudo iptables -N NAME_DER_KETTE
Beispiel:

[root@localhost ~]# sudo iptables -N Test

 

Eine Kette löschen:

sudo iptables -X NAME_DER_KETTE
Beispiel:

[root@localhost ~]# sudo iptables -X Test

 

Regeln der Kette mit dem Namen Test auflisten:

sudo iptables -L NAME_DER_KETTE


Beispiel:

[root@localhost ~]# sudo iptables -L Test

 

Regeln der Kette Test löschen:

sudo iptables –F NAME_DER_KETTE
Beispiel:

[root@localhost ~]# sudo iptables -F Test

 

Policy für die Kette festlegen: 

Im unten aufgeführten Beispiel wird das Paket automatisch angenommen, wenn die Filterregeln der Kette INPUT nicht greifen.

[root@localhost ~]# sudo iptables -P INPUT ACCEPT

 

Eine neue Regel an eine ausgewählte Kette hängen:

sudo iptables -A NAME_DER_KETTE -s IP-ADRESSE -j DROP
Im unten aufgeführten Beispiel wird die Regel, Datenpakete von der IP-Adresse 217.160.172.48 zu verwerfen, zur Kette Test hinzugefügt.

[root@localhost ~]# sudo iptables -A Test -s 217.160.172.48 -j DROP

 

Angegebene Regel der ausgewählten Kette löschen:

sudo iptables -D NAME_DER_KETTE -s IP-ADRESSE -j DROP
Beispiel:

[root@localhost ~]# sudo iptables -D Test -s 217.160.172.48 -j DROP

 

Die neue Regel an die ausgewählte Position der Kette einfügen: 

sudo iptables -I NAME_DER_KETTE 1 -s IP-ADRESSE -j DROP
In diesem Beispiel wird die Kette an Position 1 eingefügt.

Beispiel:

[root@localhost ~]# sudo iptables -I Test 1 -s 217.160.172.48 -j DROP

 

Regel der ausgewählten Kette unter Angabe der Position löschen:

sudo iptables -D NAME_DER_KETTE 1 
Beispiel:

[root@localhost ~]# sudo iptables -D Test 1

Ergebnisse speichern

Um die Einstellungen die Sie mit iptables vornehmen, dauerhaft in einer Datei zu speichern, geben Sie den folgenden Befehl ein: 

Ubuntu

sudo iptables-save > /etc/iptables/rules.v4
CentOS

iptables-save > /etc/sysconfig/iptables

 

Um die Datei wieder für IPv4 zu laden, geben Sie den folgenden Befehl ein: 

Debian/Ubuntu

iptables-restore < /etc/iptables/rules.v4
CentOS 

iptables-restore < /etc/sysconfig/iptables

 

Um die Regeln automatisch zu laden, können Sie die folgenden Methoden nutzen:

Ubuntu

Mit iptables-persistent werden die Firewall-Regeln in Konfigurationsdateien unter /etc/iptables/ abgelegt. Diese werden beim Serverstart wieder geladen und werden somit erneut aktiviert.  Zu diesem Zweck müssen die Regeln in der Datei /etc/iptables/rules.v4 für IPv4 gespeichert werden.

Um iptables-persistent zu nutzen, müssen Sie das folgende Paket installieren:

apt-get install iptables-persistent

CentOS 7

Für das dauerhafte Speichern der iptables-Rules muss der Dienst iptables-services installiert werden.

yum install -y iptables-services
Um iptables weiterhin verwenden zu können, muss der Dienst firewalld zunächst deaktiviert werden.

systemctl stop firewalld
systemctl mask firewalld

Anschließend muss der Dienst aktiviert werden.

systemctl enable iptables.service
systemctl -t service | grep iptables

Die Regeln werden für IPv4 in der Datei /etc/sysconfig/iptables gespeichert. 

Für das Speichern der aktuellen Rules kann auch das folgende Skript verwendet werden:

[root@localhost ~]# /usr/libexec/iptables/iptables.init save

Hinweis

Prüfen Sie nach der Konfiguration von iptables und dem dauerhaften Speichern der Regeln, ob diese nach dem Neustart des Servers geladen werden.

Die Regeln können Sie sich nach dem Neustart mit dem folgenden Befehl anzeigen lassen:

iptables -L
Alternativ können Sie den folgenden Befehl eingeben, um den Status von ip-tables zu prüfen:

systemctl status iptables.service

Firewall-Konfiguration prüfen (CentOS 8)

CentOS 8 richtet Firewalls standardmäßig mit der nftables-Infrastruktur ein und verwendet nftables als Standard-Backend. 

Standardmäßig erstellt nftables keine Tabellen und Ketten wie sein Vorgänger iptables. Als Administrator erstellen Sie zuerst die Tabellen und ergänzen diese um Chains, die sich als Netfilter-Hooks in den Linux-Kernel einklinken. Anschließend erstellen für die Chains die passenden Rules.

Weitere wichtige Unterschiede zwischen nftables und iptables sind:

  • Tabellen und Ketten sind vollständig konfigurierbar

  • Es gibt zwischen Matches und Targets keine Unterscheidung mehr.

  • Sie können mehrere Aktionen in einer einzigen Regel angeben.

  • Bessere Unterstützung für dynamische Regelsatz-Updates.


Weitere Informationen zu den Unterschieden zwischen iptables und nftables finden Sie hier:

https://wiki.nftables.org/wiki-nftables/index.php/Main_differences_with_iptables

Syntax der Befehle

Die grundlegenden Befehle für Tabellen, Chains und Regeln sind stets wie folgt aufgebaut:

nft <add|list|flush|delete> <table|chain|rule> <WeitereOptionen>

Tabelle erstellen

Um eine Tabelle und ein Regelset zu erstellen, geben Sie den folgenden Befehl ein:

[root@localhost ~]# nft add table inet meine_tabelle
nft list ruleset
table inet meine_tabelle {
}

Um eine Kette zu erstellen, geben Sie den unten stehenden Befehl ein. Beim Erstellen der Kette müssen Sie angeben, zu welcher Tabelle die Chain gehört. Ferner müssen Sie den Typ, den Hook und die Priorität definieren.

nft add chain inet meine_tabelle meine_filter_chain { type filter hook input priority 0 \; }

Hinweis

Der Backslash (\) ist notwendig, damit die Shell das Semikolon nicht als das Ende des Befehls interpretiert.

Chains können auch ohne Angabe eines Hooks erstellt werden. Chains, die Sie ohne Angabe eines Hooks erstellen, sind äquivalent zu den benutzerdefinierten iptables-Ketten. Regeln können die jump- oder goto-Anweisungen verwenden, um Regeln in der Kette auszuführen. Dies ist nützlich, um Regeln logisch zu trennen oder um eine Teilmenge von Regeln gemeinsam zu nutzen, die sonst doppelt vorhanden wären.

Eine wesentliche Neuerung bei nftables ist das Konzept der Families: Für die Erstellung von Regeln stellt nft eine Reihe von Adressfamilien bereit. Vordefiniert sind arp (ARP), bridge (vorher von Ebtables bereitgestellt), inet (umfasst IPv4 und IPv6), ip (für IPv4), ip6 (für IPv6) sowie netdev. Alle zueinandergehörenden Tabellen müssen sich in der gleichen Familie befinden. Dies ist vor allem für das Generieren von Tabellen und Ketten relevant.

Um z.B. eine Regel für die Chain zu erstellen, die eine SSH-Verbindung erlaubt, geben Sie den folgenden Befehl ein:

nft add rule adressfamilie meine_tabelle meine_filter_chain tcp dport ssh accept 
Beispiel:

[root@localhost ~]# nft add rule inet meine_tabelle meine_filter_chain tcp dport ssh accept
Das Löschen von Regeln erfolgt mit Hilfe von Regelhandles. Um eine Regel zu löschen, müssen Sie das Handle der Regel finden, die Sie löschen möchten. Beispiel:

[root@localhost ~]#  nft --handle list ruleset
table inet meine_tabelle { # handle 21
    chain meine_filter_chain { # handle 1
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 3
    tcp dport 1234 accept # handle 8
    tcp dport nfs accept # handle 7
    tcp dport ssh accept # handle 2
    }
}

Anschließend verwenden Sie den Handle, um die Regel zu löschen. Geben Sie hierzu folgenden Befehl ein:

nft delete rule [<familie>] <tabelle> <chain> [handle <handle>]
Beispiel:

[root@localhost ~]# nft delete rule inet meine_tabelle meine_filter_chain handle 8
[root@localhost ~]# nft --handle list ruleset
table inet meine_tabelle { # handle 21
    chain meine_filter_chain { # handle 1
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 3
    tcp dport nfs accept # handle 7
    tcp dport ssh accept # handle 2
    }
}

Regeln auflisten

Um eine Tabelle aufzulisten, verwenden Sie die folgenden Befehle:

nft list tables [<familie>]
nft list table [<familie >] <name> [-n] [-a]
nft (add | delete | flush) table [<familie >] <name>

Um alle Regeln in einer bestimmten Tabelle aufzurufen, geben Sie den folgenden Befehl ein:

[root@localhost ~]#  nft list table inet meine_tabelle
table inet meine_tabelle {
    chain meine_filter_chain {
        type filter hook input priority 0; policy accept;
        tcp dport http accept
        tcp dport nfs accept
        tcp dport ssh accept
    }
}

Um alle Regeln in einer Chain aufzurufen, geben Sie anschließend den folgenden Befehl ein:

[root@localhost ~]#  nft list chain inet meine_tabelle meine_andere_chain
table inet meine_tabelle {
    chain meine_filter_chain {
        udp dport 12345 log prefix "UDP-12345"
    }
}


Mit dem folgenden Befehl können Sie ein Regelset speichern:

nft list ruleset > /root/nftables.conf

Ein Regelset können Sie mit dem folgenden Befehl erstellen:

nft -f /root/nftables.conf

Um den systemd-Dienst zu aktivieren und Ihre Regeln beim Neustart wiederherstellen lassen, geben Sie den folgenden Befehl ein:

systemctl enable nftables
nft list ruleset > /etc/sysconfig/nftables.conf

Weitere Informationen zu nftables finden Sie hier:

https://wiki.nftables.org/wiki-nftables/index.php/Main_Page