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:
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: