Website-Suche

So sichern Sie eine Linux-Firewall mit IPTables-Regeln


Server-Hacking und unbefugter Zugriff sind echte Bedrohungen. Aus diesen Gründen sollten Sie eine Firewall als Teil Ihrer gesamten Netzwerksicherheitsstrategie implementieren. Die Konfiguration einer Firewall mit iptables-Regeln ist eine Möglichkeit, solche Risiken auf Linux-Systemen zu mindern.

Zum Glück lernen Sie in diesem Tutorial, wie Sie eine Firewall mit grundlegender Konfiguration der Iptables-Regeln implementieren, die Sie dann entsprechend Ihren Anforderungen anpassen können. Bereit, sich die Hände schmutzig zu machen? Zeit zum Eintauchen!

Voraussetzungen

Dieses Tutorial enthält praktische Demonstrationen. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie über einen Linux-Server oder Desktop-Computer verfügen. Dieses Tutorial verwendet Ubuntu 14.04 für die Beispiele, sollte aber mit anderen Linux-Distributionen und neueren Ubuntu-Versionen funktionieren.

Installieren des Iptables Persistent Firewall-Dienstes

Wie der Name schon sagt, handelt es sich bei der IPTables Persistent Firewall um einen Dienst, der Ihre Regelsätze speichert und bei Serverneustarts automatisch IPTables-Regeln anwendet. Zunächst müssen Sie jedoch das persistente Firewall-Paket installieren.

Um die IPTables Persistent Firewall zu installieren, fahren Sie mit den folgenden Schritten fort.

1. Öffnen Sie eine Terminalsitzung auf Ihrem Server, entweder lokal oder über SSH.

2. Führen Sie als Nächstes den folgenden Befehl aus, um den Paketquellcache Ihres Servers zu aktualisieren.

# Updating the package source cache
sudo apt update -y

3. Führen Sie nun den folgenden Befehl aus, um die IPTables Persistent Firewall zu installieren.

# Installing the Persistent Firewall Package
sudo apt install iptables-persistent -y

4. Umaktuelle IPv4-Regeln zu speichern, wählen Sie Ja und drücken Sie bei der Eingabeaufforderung die Eingabetaste. Das Installationsprogramm speichert die IPv4-Regeln in der Datei /etc/iptables/rules.v4.

5. In der nächsten Eingabeaufforderung werden Sie aufgefordert, Aktuelle IPv6-Regeln zu speichern, Ja auszuwählen und die Eingabetaste zu drücken. Das Installationsprogramm speichert die IPv6-Regeln in der Datei /etc/iptables/rules.v6.

Bestätigen Sie abschließend, dass der netfilter-persistent.service aktiv und aktiviert ist.

sudo systemctl status netfilter-persistent

Einrichten grundlegender Iptables-Regeln

Bei der grundlegenden Firewall-Einrichtung erstellen Sie ein erweiterbares Framework, auf dem Sie für die Konfiguration Ihrer Firewall aufbauen können. Im Allgemeinen richten Sie eine „alles verweigern-alle akzeptieren“-Richtlinie ein, was bedeutet, dass alle eingehenden Anfragen von jeder IP-Adresse abgelehnt werden, mit Ausnahme Ihrer IP-Adresse und des SSH-Ports 22 (für Administratorzugriff).

Alle laufenden Verbindungen von Ihrer Server-IP zum breiteren Internet werden zugelassen; Alle eingehenden Verbindungen werden unterbrochen (außer SSH). Anschließend erstellen Sie Ausnahmen für die spezifischen Dienste und Verkehrstypen, die Sie benötigen, und lernen dies später in diesem Tutorial schrittweise kennen.

1. Öffnen Sie die Datei /etc/iptables/rules.v4 in einem Texteditor. In diesem Beispiel wird nano als Editor verwendet.

sudo nano /etc/iptables/rules.v4

Löschen Sie als Nächstes den gesamten Inhalt in der Datei /etc/iptables/rules.v4 und ersetzen Sie ihn durch die folgenden Zeilen. Sehen Sie sich die Inline-Kommentare an, um zu verstehen, was die einzelnen Zeilen/Abschnitte bewirken.

Hinweis: Die unten stehende Firewall-Konfiguration ist das, was Sie als streng bezeichnen könnten, und dient lediglich der Erstellung einer grundlegenden Firewall-Regel, die Sie später anpassen können.

*filter
# Setting up a "deny all-accept all" policy
# Allow all outgoing, but deny/drop all incoming and forwarding traffic
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Custom per-protocol chains
# Defining custom rules for UDP protocol.
:UDP - [0:0]
# Defining custom rules for TCP protocol.
:TCP - [0:0]
# Defining custom rules for ICMP protocol.
:ICMP - [0:0]

# Accept SSH UDP traffic
-A TCP -p udp --dport 22 -j ACCEPT
# Accept SSH TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT

# Acceptable ICMP traffic

# Boilerplate acceptance policy
# Allowing packets based on the CONNTRACK connection states of ESTABLISHED and RELATED
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Allowing packets through the loopback interface, which is used for local connections
-A INPUT -i lo -j ACCEPT

# Packets that do not match any rules in the protocol-specific should be dropped.
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Allowing new protocol-specific chains to process packets for UDP that have a NEW conntrack state.
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
# Allowing new protocol-specific chains to process packets for TCP that have a NEW conntrack state.
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
# Allowing new protocol-specific chains to process packets for ICMP that have a NEW conntrack state.
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP

# Reject anything at this point. And print out rejection message with its specific protocol.
# Issuing an ICMP "port unreachable" message to any new incoming UDP packets, rejecting them.
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
# Issuing a "tcp-reset" message to any new incoming TCP packets, rejecting them.
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
# Issuing an "icmp-proto-unreachable" message to any new incoming TCP packets, dropping all other incoming packets.
-A INPUT -j REJECT --reject-with icmp-proto-unreachable

# Commit the changes
COMMIT

*raw
# Allowing packets in the PREROUTING chain
:PREROUTING ACCEPT [0:0]
# Allows packets in the OUTPUT chain, which is used for locally generated packets
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT
# NAT table is used to alter packets as they are routed through the system
*nat
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for NAT
:INPUT ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for NAT
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for NAT
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

*security
# Allowing packets in the INPUT chains for security
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for security
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for security
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

*mangle
# Allowing packets in the PREROUTING chains for mangle
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for mangle
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for mangle
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for mangle
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for mangle
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

3. Speichern Sie die Datei. Drücken Sie in nano STRG+X, Y, Eingabetaste.

4. Führen Sie den folgenden Befehl iptables-restore aus, um Syntaxfehler zu überprüfen oder zu finden. Wenn keine Fehler vorliegen, wird die Firewall mit den Regeln neu gestartet, die Sie in der Datei definiert haben. Wenn Fehler vorliegen, gibt der Befehl eine Liste der Fehler und deren Behebung zurück.

sudo iptables-restore -t /etc/iptables/rules.v4

5. Bearbeiten Sie als Nächstes die Datei /etc/iptables/rules.v6, um Ihre Firewall-Richtlinie und Ihr Framework für IPv6 zu implementieren.

sudo nano /etc/iptables/rules.v6

6. Ersetzen Sie die Datei /etc/iptables/rules.v6 durch die folgenden Zeilen. Speichern und beenden Sie /etc/iptables/rules.v6, indem Sie STRG+X, Y, Eingabetaste drücken.

Die folgenden iptables-Regeln verwerfen den gesamten IPv6-Verkehr und gehen davon aus, dass es auf dem Server keine Anwendung oder keinen Dienst gibt, der auf IPv6 angewiesen ist oder dieses verwendet.

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

7. Führen Sie den folgenden Befehl aus, um etwaige Syntaxfehler zu finden und zu beheben.

sudo ip6tables-restore -t /etc/iptables/rules.v6

8. Laden Sie nun den netfilter-persistent-Dienst neu, damit die iptables-Regeln wirksam werden.

sudo service netfilter-persistent reload

9. Führen Sie den folgenden Befehl aus, um die neuen iptables-Regeln zu speichern.

sudo service netfilter-persistent save

10. Führen Sie den folgenden Befehl aus, um alle derzeit verwendeten Regeln für IPv4 aufzulisten.

sudo iptables -S

10. Listen Sie abschließend die iptables-Regeln für IPv6 auf.

sudo ip6tables -S

Ändern der DNS-Server-IP-Adresse Ihres Servers (bedingt)

Das Blockieren des gesamten IPv6-Verkehrs kann zu ungünstigen Nebenwirkungen führen, insbesondere wenn Ihr Server für die Namensauflösung auf IPv6 angewiesen ist.

In diesem Beispiel basiert die Netzwerkkonfiguration auf IPv6-Nameservern (z. B. 2001:4860:4860::8888 und 2001:4860:4860::8844). Da die Firewall nur IPv4-Verkehr erzwingt, kann das System nicht nach Nameservern für IPv6 suchen.

Beispielsweise funktionieren einige Ihrer APT-Repositorys möglicherweise nicht, wenn die Firewall den gesamten IPv6-Verkehr blockiert. Wenn Sie versuchen, den Befehl sudo apt update erneut auszuführen, erhalten Sie möglicherweise die folgende Fehlermeldung.

Die Lösung besteht darin, Ihre Netzwerkkonfigurationsdatei zu aktualisieren und dabei vorzugsweise IPv4-Nameserver (z. B. 8.8.8.8 und 8.8.4.4) zu verwenden.

1. Öffnen Sie die Datei /etc/network/interfaces in einem Texteditor.

Die Netzwerkschnittstellen-Konfigurationsdateien können je nach Linux-Distribution oder -Version unterschiedlich sein. Das folgende Beispiel ist speziell für Ubuntu 14.04 LTS.

sudo nano /etc/network/interfaces

2. Suchen Sie nach der Anweisung dns-nameservers. Ändern Sie diese Anweisung in dns-nameservers 8.8.8.8 8.8.4.4.

8.8.8.8 und 8.8.4.4 sind öffentliche DNS-Server, die von Google betrieben werden. Diese öffentlichen DNS-Server sind zuverlässig und schnell. Fühlen Sie sich frei, andere DNS-Server wie OpenDNS oder ein internes IPv4-DNS in Ihrer Organisation zu verwenden.

3. Führen Sie den folgenden Befehl aus, um die Netzwerkschnittstelle Ihres Servers zu wechseln und die neuen Nameserver zu verwenden.

sudo ifdown eth0 && sudo ifup eth0

4. Öffnen Sie als Nächstes /etc/apt/apt.conf.d/99force-ipv4 in einem Texteditor. Diese Standardkonfiguration legt fest, was APT für dauerhafte Einstellungen verwendet.

sudo nano /etc/apt/apt.conf.d/99force-ipv4

5. Füllen Sie die Datei 99force-ipv4 mit der folgenden Zeile. Dieser Wert zwingt APT dazu, IPv4 für die Namensauflösung zu verwenden. Speichern und beenden Sie 99force-ipv4.

Acquire::ForceIPv4 "true";

6. Melden Sie sich bei Ihrer SSH-Sitzung ab und wieder an und führen Sie den Befehl sudo apt update erneut aus. Die Namensauflösungsfehler sollten nicht mehr angezeigt werden.

Ausnahmen für bestimmte Dienste hinzufügen

Da Sie nun über die funktionierenden Iptables-Regeln „Alles zulassen/alles verweigern“ verfügen, können Sie bei Bedarf bestimmte Ports für bestimmte Dienste öffnen. Wenn Ihr Server beispielsweise eine Website hostet oder hosten wird, müssen Sie Datenverkehr über HTTP-Port 80 oder HTTPS-Port 443 zulassen. Gehen Sie dazu wie folgt vor.

1. Führen Sie auf dem Terminal den folgenden Befehl aus, um TCP-Port 80 für HTTP-Verkehr und Port 443 für HTTPS-Verkehr zu öffnen.

  • Der Parameter -A akzeptiert, welche Kette an die Regel angehängt werden soll.
  • Der Parameter -p gibt den Protokolltyp an, den die Regel anwendet.
  • Der Parameterwert --dport ist die Zielportnummer.
  • Der Parameter -j legt fest, welche Aktion ausgeführt werden soll, wenn die Regel übereinstimmt.
sudo iptables -A TCP -p tcp --dport 80 -j ACCEPT
sudo iptables -A TCP -p tcp --dport 443 -j ACCEPT

2. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die neuen Regeln jetzt wirksam sind.

sudo iptables -L -v

Sie sehen Ihre beiden Einträge für HTTP bzw. HTTPS.

3. Führen Sie abschließend den folgenden Befehl aus, um Ihre Änderungen an den iptables-Regeln zu speichern.

sudo service netfilter-persistent save

Zulassen von Verbindungen basierend auf der Quelle

Mit Iptables können Sie auch Regeln erstellen, um Datenverkehr von bestimmten Quellen zuzulassen, beispielsweise von einer oder mehreren IP-Adressen. Beispielsweise verfügt Ihr Unternehmen möglicherweise über drei Standorte, von denen jeder eine eigene IP-Adresse hat (z. B. 192.168.1.20, 192.168.1.30 und 192.168.1.40).

Sie möchten wahrscheinlich von jedem Standort aus Verbindungen zu Ihrem Server zulassen. Dazu erstellen Sie drei separate Regeln mit den -s, um die spezifische Quelle anzugeben.

1. Führen Sie die folgenden Befehle aus, um Verbindungen von drei bestimmten IP-Adressen zuzulassen.

Die unten aufgeführten IP-Adressen dienen lediglich Beispielzwecken und spiegeln möglicherweise nicht ein reales Szenario wider. Die IP-Adressen Ihrer Websites werden unterschiedlich sein.

# Allowing connection from 192.168.1.20
sudo iptables -A TCP -s 192.168.1.20 -j ACCEPT
# Allowing connection from 192.168.1.30
sudo iptables -A TCP -s 192.168.1.30 -j ACCEPT
# Allowing connection from 192.168.1.40
sudo iptables -A TCP -s 192.168.1.40 -j ACCEPT

2. Führen Sie den folgenden Befehl erneut aus, um zu überprüfen, ob die neuen Regeln hinzugefügt wurden.

sudo iptables -L -v

Sie sehen drei Einträge für Ihre drei spezifischen Quellen, sodass diese eine Verbindung zu Ihrem Server herstellen können.

3. Vergessen Sie abschließend nicht, Ihre iptables-Regeln zu speichern, indem Sie den folgenden Befehl ausführen.

sudo service netfilter-persistent save

Iptables-Regeln zurücksetzen

Sie haben nun erfolgreich eine Firewall mit iptables-Regeln konfiguriert. Aber nicht immer läuft alles nach Plan. Aber was wäre, wenn Sie es vermasselt hätten und neu anfangen wollten?

Eine Möglichkeit besteht darin, alle Ihre iptables-Regeln zurückzusetzen. Befolgen Sie dazu die folgenden Schritte.

1. Erstellen Sie zunächst eine Sicherungskopie Ihrer vorhandenen iptables-Regeln. Der folgende Befehl kopiert die Dateien rules.v4 und rules.v6 in Ihr Home-Verzeichnis.

sudo cp /etc/iptables/* ~/

2. Löschen Sie als Nächstes alle vorhandenen Iptables-Regeln, indem Sie den folgenden Befehl ausführen.

sudo service netfilter-persistent flush

3. Bestätigen Sie, dass die Regeln nicht mehr vorhanden sind.

sudo iptables -S

Wie Sie unten sehen können, bleiben nur die Standardregeln von iptables übrig, die alle zulassen. Durch dieses Verhalten wird sichergestellt, dass das Zurücksetzen der Regeln nicht zu einer Sperrung des Administratorzugriffs führt.

Abschluss

In diesem Tutorial haben Sie gelernt, wie Sie Ihre Linux-Firewall mit iptables-Regeln sichern und Ausnahmen konfigurieren.

Einige Linux-Administratoren argumentieren möglicherweise, dass iptables zum Konfigurieren der Linux-Firewall veraltet sei. Viele Anwendungen basieren jedoch immer noch auf iptables, was bedeuten könnte, dass es noch viele Jahre lang eine tragende Säule bleiben wird.

Was halten Sie von der Verwendung dauerhafter Iptables-Regeln? Erwägen Sie die Implementierung oder wechseln Sie zu neueren Optionen wie der unkomplizierten Firewall (UFW)?