Dieser Artikel ist ein Auszug aus meinem Buch „Linux in Action“ und einem zweiten Manning-Projekt, das noch veröffentlicht werden muss.
Die Firewall
Eine Firewall ist eine Reihe von Regeln. Wenn sich ein Datenpaket in oder aus einem geschützten Netzwerkbereich bewegt, wird sein Inhalt (insbesondere Informationen über seinen Ursprung, sein Ziel und das zu verwendende Protokoll) anhand der Firewall-Regeln getestet, um festzustellen, ob es durchgelassen werden sollte. Hier ist ein einfaches Beispiel:
Auf der einen Seite ist iptables ein Tool zum Verwalten von Firewall-Regeln auf einem Linux-Rechner.
Andererseits ist firewalld auch ein Tool zum Verwalten von Firewall-Regeln auf einem Linux-Rechner.
Hast du ein Problem damit? Und würde es Ihnen den Tag verderben, wenn ich Ihnen sagen würde, dass es ein anderes Tool namens nftables gibt?
OK, ich gebe zu, dass das Ganze etwas komisch riecht, also lass es mich erklären. Alles beginnt mit Netfilter, das den Zugriff auf und vom Netzwerkstapel auf der Ebene des Linux-Kernelmoduls steuert. Jahrzehntelang war das primäre Befehlszeilentool zum Verwalten von Netfilter-Hooks der iptables-Regelsatz.
Das Linux-Terminal
- Die 7 besten Terminalemulatoren für Linux
- 10 Befehlszeilentools für die Datenanalyse unter Linux
- Jetzt herunterladen:SSH-Spickzettel
- Spickzettel für fortgeschrittene Linux-Befehle
- Linux-Befehlszeilen-Tutorials
Da die zum Aufrufen dieser Regeln erforderliche Syntax etwas geheimnisvoll wirken konnte, wurden verschiedene benutzerfreundliche Implementierungen wie ufw und firewalld als übergeordnete Netfilter-Interpreter eingeführt. Ufw und firewalld sind jedoch in erster Linie darauf ausgelegt, die Art von Problemen zu lösen, mit denen Einzelcomputer konfrontiert sind. Der Aufbau von Netzwerklösungen in voller Größe erfordert oft die zusätzliche Kraft von iptables oder, seit 2014, seinen Ersatz, nftables (über das nft-Befehlszeilentool).
iptables ist nirgendwo hingegangen und wird immer noch häufig verwendet. Tatsächlich sollten Sie davon ausgehen, dass Sie bei Ihrer Arbeit als Administrator noch viele Jahre lang auf iptables-geschützte Netzwerke stoßen werden. Aber nftables hat durch das Hinzufügen zum klassischen Netfilter-Toolset einige wichtige neue Funktionen gebracht.
Von hier an zeige ich anhand von Beispielen, wie firewalld und iptables einfache Verbindungsprobleme lösen.
Konfigurieren Sie den HTTP-Zugriff mit Firewalld
Wie Sie vielleicht anhand des Namens erraten haben, ist Firewalld Teil der Systemd-Familie. Firewalld kann auf Debian/Ubuntu-Rechnern installiert werden, ist aber standardmäßig auf Red Hat und CentOS vorhanden. Wenn auf Ihrem Computer ein Webserver wie Apache ausgeführt wird, können Sie bestätigen, dass die Firewall funktioniert, indem Sie zum Webstammverzeichnis Ihres Servers navigieren. Wenn die Site nicht erreichbar ist, erledigt Firewalld seine Arbeit.
Sie verwenden das firewall-cmd
Tool zum Verwalten von Firewalld-Einstellungen über die Befehlszeile. Hinzufügen des –state
Argument gibt den aktuellen Firewall-Status zurück:
# firewall-cmd --state
running
Standardmäßig ist firewalld aktiv und weist den gesamten eingehenden Datenverkehr mit einigen Ausnahmen wie SSH zurück. Das bedeutet, dass Ihre Website nicht zu viele Besucher bekommt, was Ihnen sicherlich eine Menge Kosten für die Datenübertragung erspart. Da dies jedoch wahrscheinlich nicht das ist, was Sie für Ihren Webserver im Sinn hatten, sollten Sie die HTTP- und HTTPS-Ports öffnen, die per Konvention als 80 bzw. 443 bezeichnet werden. Firewalld bietet zwei Möglichkeiten, dies zu tun. Einer ist durch den –add-port
-Argument, das die Portnummer direkt zusammen mit dem verwendeten Netzwerkprotokoll (in diesem Fall TCP) referenziert. Der –permanent
Argument weist Firewalld an, diese Regel jedes Mal zu laden, wenn der Server bootet:
# firewall-cmd --permanent --add-port=80/tcp
# firewall-cmd --permanent --add-port=443/tcp
Der –reload
Argument wendet diese Regeln auf die aktuelle Sitzung an:
# firewall-cmd --reload
Neugierig auf die aktuellen Einstellungen Ihrer Firewall? Führen Sie –list-services
aus :
# firewall-cmd --list-services
dhcpv6-client http https ssh
Angenommen, Sie haben den Browserzugriff wie zuvor beschrieben hinzugefügt, sollten die HTTP-, HTTPS- und SSH-Ports jetzt alle offen sein – zusammen mit dhcpv6-client
, wodurch Linux eine IPv6-IP-Adresse von einem lokalen DHCP-Server anfordern kann.
Konfigurieren Sie einen gesperrten Kundenkiosk mit iptables
Ich bin sicher, Sie haben Kioske gesehen – das sind die Tablets, Touchscreens und geldautomatenähnlichen PCs in einer Kiste, die Flughäfen, Bibliotheken und Unternehmen herumliegen lassen und Kunden und Passanten zum Durchsuchen von Inhalten einladen. Die Sache mit den meisten Kiosken ist, dass Sie normalerweise nicht möchten, dass sich die Benutzer wie zu Hause fühlen und sie wie ihre eigenen Geräte behandeln. Sie sind im Allgemeinen nicht zum Surfen, Anzeigen von YouTube-Videos oder zum Starten von Denial-of-Service-Angriffen gegen das Pentagon gedacht. Um sicherzustellen, dass sie nicht missbraucht werden, müssen Sie sie sperren.
Eine Möglichkeit besteht darin, eine Art Kioskmodus anzuwenden, sei es durch die geschickte Verwendung eines Linux-Display-Managers oder auf Browserebene. Aber um sicherzustellen, dass Sie alle Löcher gestopft haben, möchten Sie wahrscheinlich auch einige harte Netzwerkkontrollen durch eine Firewall hinzufügen. Im folgenden Abschnitt beschreibe ich, wie ich es mit iptables machen würde.
Es gibt zwei wichtige Dinge, die Sie bei der Verwendung von iptables beachten sollten:Die Reihenfolge, die Sie Ihren Regeln geben, ist entscheidend, und iptables-Regeln überleben einen Neustart nicht. Ich werde diese hier einzeln ansprechen.
Das Kiosk-Projekt
Stellen wir uns zur Veranschaulichung vor, wir arbeiten für ein Geschäft, das Teil einer größeren Kette namens BigMart ist. Es gibt sie schon seit Jahrzehnten; Tatsächlich sind unsere imaginären Großeltern wahrscheinlich mit dem Einkaufen dort aufgewachsen. Aber heutzutage zählen die Leute in der BigMart-Unternehmenszentrale wahrscheinlich nur die Stunden, bevor Amazon sie endgültig in den Abgrund treibt.
Nichtsdestotrotz gibt die IT-Abteilung von BigMart ihr Bestes und hat Ihnen gerade einige WLAN-fähige Kioskgeräte geschickt, die Sie voraussichtlich an strategischen Stellen in Ihrem Geschäft installieren werden. Die Idee ist, dass sie einen Webbrowser anzeigen, der auf den Produktseiten von BigMart.com angemeldet ist, sodass sie Warenmerkmale, Gangpositionen und Lagerbestände nachschlagen können. Die Kioske benötigen außerdem Zugriff auf bigmart-data.com, wo viele der Bild- und Videomedien gespeichert sind.
Außerdem möchten Sie Updates und, falls erforderlich, Paket-Downloads zulassen. Schließlich möchten Sie den eingehenden SSH-Zugriff nur von Ihrer lokalen Workstation aus zulassen und alle anderen blockieren. Die folgende Abbildung zeigt, wie das alles funktionieren wird:
Das Skript
So passt das alles in ein Bash-Skript:
#!/bin/bash
iptables -A OUTPUT -p tcp -d bigmart.com -j ACCEPT
iptables -A OUTPUT -p tcp -d bigmart-data.com -j ACCEPT
iptables -A OUTPUT -p tcp -d ubuntu.com -j ACCEPT
iptables -A OUTPUT -p tcp -d ca.archive.ubuntu.com -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j DROP
iptables -A OUTPUT -p tcp --dport 443 -j DROP
iptables -A INPUT -p tcp -s 10.0.3.1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
Der grundlegende Aufbau unserer Regeln beginnt mit -A
, indem Sie iptables mitteilen, dass wir die folgende Regel hinzufügen möchten. OUTPUT
bedeutet, dass diese Regel Teil der OUTPUT-Kette werden soll. -p
gibt an, dass diese Regel nur für Pakete gilt, die das TCP-Protokoll verwenden, wobei -d
sagt uns, das Ziel ist bigmart.com. Das -j
Flag zeigt auf ACCEPT
als Aktion, die ausgeführt werden soll, wenn ein Paket mit der Regel übereinstimmt. In dieser ersten Regel besteht diese Aktion darin, die Anforderung zuzulassen oder anzunehmen. Aber weiter unten sehen Sie Anfragen, die verworfen oder abgelehnt werden.
Denken Sie daran, dass die Reihenfolge wichtig ist. Und das liegt daran, dass iptables eine Anfrage über jede seiner Regeln hinaus laufen lässt, aber nur bis es eine Übereinstimmung erhält. Eine ausgehende Browseranfrage für beispielsweise youtube.com übergibt also die ersten vier Regeln, aber wenn sie zu einem der –dport 80
gelangt oder –dport 443
Regel – je nachdem, ob es sich um eine HTTP- oder HTTPS-Anfrage handelt – wird sie verworfen. iptables wird nicht weiter nachsehen, weil das eine Übereinstimmung war.
Andererseits wird eine Systemanfrage an ubuntu.com für ein Software-Upgrade durchkommen, wenn sie auf die entsprechende Regel trifft. Was wir hier tun, ist offensichtlich, ausgehende HTTP- oder HTTPS-Anforderungen nur an unsere BigMart- oder Ubuntu-Ziele und an keine anderen zuzulassen.
Die letzten beiden Regeln behandeln eingehende SSH-Anfragen. Sie wurden nicht bereits von den beiden vorherigen Drop-Regeln abgelehnt, da sie nicht die Ports 80 oder 443, sondern 22 verwenden. In diesem Fall werden Anmeldeanforderungen von meiner Workstation akzeptiert, Anforderungen für andere werden jedoch verworfen. Das ist wichtig:Stellen Sie sicher, dass die IP-Adresse, die Sie für Ihre Port-22-Regel verwenden, mit der Adresse des Computers übereinstimmt, den Sie zum Anmelden verwenden – wenn Sie das nicht tun, werden Sie sofort gesperrt. Es ist natürlich keine große Sache, denn so wie es derzeit konfiguriert ist, könnten Sie den Server einfach neu starten und die iptables-Regeln werden alle gelöscht. Wenn Sie einen LXC-Container als Server verwenden und sich von Ihrem LXC-Host aus anmelden, verwenden Sie die IP-Adresse, die Ihr Host verwendet, um sich mit dem Container zu verbinden, nicht seine öffentliche Adresse.
Sie müssen daran denken, diese Regel zu aktualisieren, wenn sich die IP-Adresse meines Computers jemals ändert. andernfalls werden Sie gesperrt.
Zu Hause mitspielen (hoffentlich auf einer Art Wegwerf-VM)? Toll. Erstellen Sie Ihr eigenes Skript. Jetzt kann ich das Skript speichern, benutze chmod
um es ausführbar zu machen, und führen Sie es als sudo
aus . Machen Sie sich keine Sorgen darüber, dass bigmart-data.com not found
wird Fehler – natürlich nicht gefunden; es existiert nicht.
chmod +X scriptname.sh
sudo ./scriptname.sh
Sie können Ihre Firewall über die Befehlszeile mit cURL
testen . Das Anfordern von ubuntu.com funktioniert, aber bemannen.com schlägt fehl.
curl ubuntu.com
curl manning.com
Konfigurieren von iptables zum Laden beim Systemstart
Das Linux-Terminal
- Die 7 besten Terminalemulatoren für Linux
- 10 Befehlszeilentools für die Datenanalyse unter Linux
- Jetzt herunterladen:SSH-Spickzettel
- Spickzettel für fortgeschrittene Linux-Befehle
- Linux-Befehlszeilen-Tutorials
Wie bekomme ich nun, dass diese Regeln jedes Mal automatisch geladen werden, wenn der Kiosk startet? Der erste Schritt besteht darin, die aktuellen Regeln mit iptables-save
in einer .rules-Datei zu speichern Werkzeug. Dadurch wird eine Datei im Stammverzeichnis erstellt, die eine Liste der Regeln enthält. Die Pipe, gefolgt vom tee-Befehl, ist notwendig, um mein sudo
anzuwenden Berechtigung für den zweiten Teil der Zeichenfolge:das tatsächliche Speichern einer Datei im ansonsten eingeschränkten Stammverzeichnis.
Ich kann das System dann anweisen, ein verwandtes Tool namens iptables-restore
auszuführen jedes Mal, wenn es bootet. Ein normaler Cron-Job, wie wir ihn im vorherigen Modul gesehen haben, hilft nicht, weil er zu festgelegten Zeiten ausgeführt wird, aber wir haben keine Ahnung, wann unser Computer abstürzen und neu starten könnte.
Es gibt viele Möglichkeiten, dieses Problem zu lösen. Hier ist einer:
Auf meinem Linux-Rechner installiere ich ein Programm namens anacron, das uns eine Datei namens anacrontab im Verzeichnis /etc/ zur Verfügung stellt. Ich werde die Datei bearbeiten und diese iptables-restore
hinzufügen Befehl, der ihm mitteilt, die aktuellen Werte dieser .rules-Datei jeden Tag (falls erforderlich) eine Minute nach dem Booten in iptables zu laden. Ich gebe dem Job eine Kennung (iptables-restore
) und fügen Sie dann den Befehl selbst hinzu. Da du zu Hause mit mir spielst, solltest du das alles testen, indem du dein System neu startest.
sudo iptables-save | sudo tee /root/my.active.firewall.rules
sudo apt install anacron
sudo nano /etc/anacrontab
1 1 iptables-restore iptables-restore < /root/my.active.firewall.rules
Ich hoffe, diese praktischen Beispiele haben gezeigt, wie man iptables und firewalld verwendet, um Verbindungsprobleme auf Linux-basierten Firewalls zu verwalten.