Server-Hacking und unbefugter Zugriff sind echte Bedrohungen. Aus diesen Gründen sollten Sie eine Firewall als Teil Ihrer gesamten Netzwerksicherheitsstrategie implementieren. Das Konfigurieren einer Firewall mit iptables-Regeln ist eine Möglichkeit, solche Risiken auf Linux-Systemen zu mindern.
Glücklicherweise zeigt Ihnen dieses Tutorial, wie Sie eine Firewall mit einer grundlegenden Konfiguration von iptables-Regeln implementieren, die Sie dann basierend auf Ihren Anforderungen anpassen können. Bereit, sich die Hände schmutzig zu machen? Zeit einzutauchen!
Voraussetzungen
Dieses Tutorial enthält praktische Demonstrationen. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie einen Linux-Server oder Desktop-Computer haben. Dieses Tutorial verwendet Ubuntu 14.04 für die Beispiele, sollte aber mit anderen Linux-Distributionen und neueren Ubuntu-Versionen funktionieren.
Den Iptables Persistent Firewall Service installieren
Wie der Name schon sagt, ist die IPTables Persistent Firewall ein Dienst, der Ihre Regelsätze speichert und automatisch IPTables-Regeln bei Serverneustarts anwendet. Aber zuerst müssen Sie das persistente Firewall-Paket installieren.
Um die Persistent Firewall von IPTables zu installieren, gehen Sie wie folgt vor.
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 Paketquellencache Ihres Servers zu aktualisieren.
# Updating the package source cache
sudo apt update -y
3. Führen Sie nun den folgenden Befehl aus, um die Persistent Firewall von IPTables zu installieren.
# Installing the Persistent Firewall Package
sudo apt install iptables-persistent -y
4. Um aktuelle IPv4-Regeln zu speichern , wählen Sie Ja aus und drücken Sie bei der Eingabeaufforderung die Eingabetaste. Der Installer speichert die IPv4-Regeln in der Datei /etc/iptables/rules.v4.
5. Die nächste Eingabeaufforderung fordert Sie auf, Aktuelle IPv6-Regeln zu speichern , wählen Sie Ja aus und drücken Sie die Eingabetaste. Der Installer speichert die IPv6-Regeln in der Datei /etc/iptables/rules.v6.
Bestätigen Sie abschließend, dass netfilter-persistent.service
ist aktiv und aktiviert.
sudo systemctl status netfilter-persistent
Grundlegende Iptables-Regeln einrichten
In 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 ein „alle ablehnen – alle akzeptieren ein ”-Richtlinie, was bedeutet, dass jede eingehende Anfrage von jeder IP verweigert wird, außer Ihrer IP und SSH-Port 22 (für Admin-Zugriff).
Alle laufenden Verbindungen von Ihrer Server-IP zum breiteren Internet werden zugelassen; alle eingehenden Verbindungen werden verworfen (außer SSH). Anschließend erstellen Sie Ausnahmen für die spezifischen Dienste und Verkehrstypen, die Sie benötigen, und lernen später in diesem Tutorial schrittweise mehr darüber.
1. Öffnen Sie /etc/iptables/rules.v4 Datei in einem Texteditor. Dieses Beispiel verwendet nano
als Redakteur.
sudo nano /etc/iptables/rules.v4
Löschen Sie als Nächstes den gesamten Inhalt in /etc/iptables/rules.v4 Datei und ersetzen Sie sie durch die folgenden Zeilen. Sehen Sie sich die Inline-Kommentare an, um zu verstehen, was jede Zeile/jeder Abschnitt tut.
Hinweis:Die Firewall-Konfiguration unten ist das, was Sie als streng bezeichnen können, und dient nur zum Erstellen 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. In nano
, drücken Sie STRG+X, Y, Enter.
4. Führen Sie iptables-restore
aus Befehl unten, um Syntaxfehler zu validieren oder zu finden. Wenn keine Fehler vorliegen, wird die Firewall mit den Regeln neu gestartet, die Sie in der Datei definiert haben. Wenn Fehler vorhanden sind, 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 mit folgenden Zeilen. Speichern und beenden Sie /etc/iptables/rules.v6 indem Sie STRG+X, Y, Enter drücken.
Die iptables-Regeln unten lassen den gesamten IPv6-Datenverkehr fallen und gehen davon aus, dass es keine Anwendung oder keinen Dienst auf dem Server gibt, der IPv6 benötigt oder verwendet.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
7. Führen Sie den folgenden Befehl aus, um Syntaxfehler zu finden und zu beheben.
sudo ip6tables-restore -t /etc/iptables/rules.v6
8. Laden Sie nun die netfilter-persistent
neu Dienst, 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 schließlich 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 Nebeneffekten 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 keine Nameserver für IPv6 suchen.
Beispielsweise funktionieren einige Ihrer APT-Repositories möglicherweise nicht, wenn die Firewall den gesamten IPv6-Verkehr blockiert. Wenn Sie versuchen, sudo apt update
erneut auszuführen Befehl erhalten Sie möglicherweise die folgende Fehlermeldung.
Die Lösung besteht darin, Ihre Netzwerkkonfigurationsdatei zu aktualisieren und die Verwendung von IPv4-Nameservern (z. B. 8.8.8.8 und 8.8.4.4) vorzuziehen.
1. Öffnen Sie /etc/network/interfaces Datei in einem Texteditor.
Die Konfigurationsdateien für die Netzwerkschnittstelle können sich je nach Linux-Distribution oder -Version unterscheiden. Das folgende Beispiel gilt speziell für Ubuntu 14.04 LTS.
sudo nano /etc/network/interfaces
2. Suchen Sie nach dns-nameservers
Richtlinie. Ändern Sie diese Direktive 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. Sie können gerne andere DNS-Server wie OpenDNS oder ein internes IPv4-DNS in Ihrer Organisation verwenden.
3. Führen Sie den folgenden Befehl aus, um die Netzwerkschnittstelle Ihres Servers zu durchlaufen und die neuen Nameserver zu verwenden.
sudo ifdown eth0 && sudo ifup eth0
4. Als nächstes öffnen Sie /etc/apt/apt.conf.d/99force-ipv4 in einem Texteditor. Diese Standardkonfigurationsdatei APT
verwendet für dauerhafte Einstellungen.
sudo nano /etc/apt/apt.conf.d/99force-ipv4
5. Füllen Sie 99force-ipv4 aus Datei mit der folgenden Zeile. Dieser Wert zwingt APT, IPv4 für die Namensauflösung zu verwenden. Speichern und beenden Sie 99force-ipv4 .
Acquire::ForceIPv4 "true";
6. Melden Sie sich von Ihrer SSH-Sitzung ab und wieder an und führen Sie sudo apt update
erneut aus Befehl. Die Namensauflösungsfehler sollten nicht mehr angezeigt werden.
Hinzufügen von Ausnahmen für bestimmte Dienste
Jetzt, da Sie die funktionierenden iptables-Regeln „Alle zulassen – Alle ablehnen“ haben, können Sie jetzt nach 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-Datenverkehr und Port 443 für HTTPS-Datenverkehr zu öffnen.
- Der
-A
Parameter akzeptiert, welche Kette an die Regel angehängt werden soll. - Die
-p
Der Parameter gibt den Protokolltyp an, auf den die Regel angewendet wird. - Die
--dport
Parameterwert ist die Zielportnummer. - Die
-j
Der Parameter bestimmt, welche Aktion ausgeführt werden soll, wenn die Regel zutrifft.
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, z. B. von einer oder mehreren IP-Adressen. Beispielsweise kann Ihr Unternehmen drei Standorte haben, von denen jeder seine eigene IP-Adresse hat (z. B. 192.168.1.20, 192.168.1.30 und 192.168.1.40).
Sie möchten wahrscheinlich Verbindungen zu Ihrem Server von jedem Standort aus zulassen. Dazu erstellen Sie drei separate Regeln mit dem -s
um die spezifische Quelle anzugeben.
1. Führen Sie die folgenden Befehle aus, um die Verbindungen von drei bestimmten IP-Adressen zuzulassen.
Die folgenden IP-Adressen dienen nur Beispielzwecken und spiegeln möglicherweise kein reales Szenario wider. Die IP-Adressen Ihrer Websites sind unterschiedlich.
# 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, die es ihnen ermöglichen, sich mit Ihrem Server zu verbinden.
3. Vergessen Sie schließlich nicht, Ihre iptables-Regeln zu speichern, indem Sie den folgenden Befehl ausführen.
sudo service netfilter-persistent save
IPtables-Regeln zurücksetzen
Sie haben jetzt erfolgreich eine Firewall mit iptables-Regeln konfiguriert. Aber nicht immer läuft alles nach Plan. Aber was ist, wenn du es vermasselt hast und neu anfangen wolltest?
Eine Möglichkeit besteht darin, alle Ihre iptables-Regeln zurückzusetzen. Führen Sie dazu die folgenden Schritte aus.
1. Erstellen Sie zunächst eine Sicherungskopie Ihrer bestehenden iptables-Regeln. Der folgende Befehl kopiert die rules.v4 und rules.v6 Dateien in Ihr Home-Verzeichnis.
sudo cp /etc/iptables/* ~/
2. Löschen Sie als Nächstes alle Ihre vorhandenen iptables-Regeln, indem Sie den folgenden Befehl ausführen.
sudo service netfilter-persistent flush
3. Bestätigen Sie, dass die Regeln nicht mehr existieren.
sudo iptables -S
Wie Sie unten sehen können, bleiben nur die standardmäßigen iptables-Regeln übrig, die alle zulassen. Dieses Verhalten stellt sicher, dass das Zurücksetzen der Regeln nicht zu einem Szenario mit einer Administratorzugriffssperre führt.
Schlussfolgerung
In diesem Tutorial haben Sie gelernt, wie Sie Ihre Linux-Firewall mit iptables-Regeln sichern und wie Sie Ausnahmen konfigurieren.
Einige Linux-Administratoren argumentieren möglicherweise, dass iptables veraltet ist, um die Linux-Firewall zu konfigurieren. Aber viele Anwendungen verlassen sich immer noch auf iptables, was bedeuten könnte, dass es für viele weitere Jahre eine tragende Säule bleiben wird.
Was halten Sie von der Verwendung von persistenten iptables-Regeln? Ziehen Sie eine Implementierung in Betracht oder wechseln Sie zu neueren Optionen wie der unkomplizierten Firewall (UFW)?