Dies ist eine vorgeschlagene kanonische Frage zum Verständnis und Debuggen der Software-Firewall auf Linux-Systemen.
Als Antwort auf die Antwort der EEAA und auf die Bemerkung von @ Shog, dass wir eine geeignete kanonische Frage und Antwort benötigen, um gängige, relativ einfache Fragen zu iptables zu beantworten.
Was ist eine strukturierte Methode zum Debuggen von Problemen mit der Linux-Software-Firewall, dem Netfilter- Paketfilter-Framework, auf das in der Benutzeroberfläche iptables häufig Bezug genommen wird ?
Was sind häufige Fallstricke, wiederkehrende Fragen und einfache oder etwas undeutlichere Dinge, die ein gelegentlicher Firewall-Administrator übersehen oder auf andere Weise davon profitieren könnte?
Selbst wenn Sie Tools wie UFW , FirewallD (aka firewall-cmd
), Shorewall oder ähnliches verwenden, können Sie davon profitieren, wenn Sie ohne die Abstraktionsschicht, die diese Tools bieten, unter die Haube schauen.
Diese Frage ist nicht als How-To soll Firewalls für den Bau: die Überprüfen der Produktdokumentation für die und zum Beispiel dazu beitragen , Rezepte zu iptables Reise & Tricks oder suchen Sie die markierten iptables ufw firewalld Firewall-cmd Fragen für bestehende häufiges und gut angesehen High-Scoring Fragen und Antworten.
net.netfilter.nf_conntrack_log_invalid
auf 255 erfasst ziemlich gut ungültige Pakete, was helfen kann, wenn der zustandsbehaftete Teil von netfilter das schlechte Verhalten erzeugt.Antworten:
Im Allgemeinen:
Das Anzeigen und Ändern der Firewall-Konfiguration erfordert Administratorrechte (
root
) sowie das Öffnen von Diensten im eingeschränkten Portnummernbereich. Das bedeutet, dass Sie entweder angemeldet seinroot
oder alternativsudo
den Befehl als root ausführen müssen. Ich werde versuchen, solche Befehle mit dem optionalen zu markieren[sudo]
.Inhalt:
-I
und-A
iptables -L -v -n
1. Ordnungsangelegenheiten oder der Unterschied zwischen
-I
und-A
Beachten Sie, dass die Firewall-Regeln in der angegebenen Reihenfolge überprüft werden. Der Kernel beendet die Verarbeitung der Kette, wenn eine Regel ausgelöst wird, die ein Paket oder eine Verbindung entweder zulässt oder sperrt.
Ich denke, der häufigste Fehler für unerfahrene Firewall-Administratoren ist, dass sie die richtigen Anweisungen befolgen, um einen neuen Port zu öffnen, wie den folgenden:
und dann feststellen, dass es nicht wirksam wird.
Der Grund dafür ist, dass die
-A
Option diese neue Regel nach allen vorhandenen Regeln hinzufügt und da sehr oft die letzte Regel in der vorhandenen Firewall eine ist, die den gesamten Verkehr blockiert, der nicht explizit zulässig ist, was dazu führtOder gleichwertig in iptables-save:
und die neue Regel, die den TCP-Port 8080 öffnet, wird niemals erreicht. (Dies zeigt sich daran, dass die Zähler hartnäckig bei 0 Paketen und 0 Bytes bleiben).
Das Einfügen der Regel mit
-I
der neuen Regel wäre die erste in der Kette gewesen und würde funktionieren.2. Zeigen Sie die aktuelle Firewall-Konfiguration an
Ich empfehle dem Firewall-Administrator, sich die tatsächliche Konfiguration des Linux-Kernels anzusehen, anstatt zu versuchen, Firewall-Probleme mithilfe benutzerfreundlicher Tools zu diagnostizieren. Wenn Sie die zugrunde liegenden Probleme verstanden haben, können Sie sie häufig problemlos in einer von diesen Tools unterstützten Angelegenheit lösen.
Der Befehl
[sudo] iptables -L -v -n
ist dein Freund (obwohl manche Leute esiptables-save
besser mögen ). Bei der Besprechung von Konfigurationen ist es oft nützlich, die--line-numbers
Option auch zum Nummerieren von Zeilen zu verwenden. Wenn Sie sich auf Regel #X beziehen, wird das Erörtern dieser Regeln etwas einfacher.Hinweis: NAT-Regeln sind in der
iptables-save
Ausgabe enthalten, müssen jedoch separat aufgelistet werden, indem die-t nat
Option dh[sudo] iptables -L -v -n -t nat --line-numbers
.Wenn Sie den Befehl mehrmals ausführen und nach inkrementierenden Zählern suchen, kann dies hilfreich sein, um festzustellen, ob tatsächlich eine neue Regel ausgelöst wird.
Alternativ gibt die Ausgabe von
iptables-save
ein Skript aus, das die obige Firewall-Konfiguration neu generieren kann:Es ist eine Frage der Präferenz, was für Sie verständlicher ist.
3. Interpretation der Ausgabe von
iptables -L -v -n
Die Richtlinie legt die Standardaktion fest, die die Kette verwendet, wenn keine explizite Regel zutrifft. In der
INPUT
Kette, die auf ACCEPT all traffic gesetzt ist.Die erste Regel in der INPUT-Kette ist sofort eine interessante Regel. Sie sendet den gesamten Verkehr (Quelle 0.0.0.0/0 und Ziel 0.0.0.0/0), der für TCP-Port 22 (
tcp dpt:22
) bestimmt ist, an ein benutzerdefiniertes Ziel (fail2ban-SSH
). . Wie der Name schon sagt, wird diese Regel von fail2ban (einem Sicherheitsprodukt, das unter anderem Systemprotokolldateien auf möglichen Missbrauch überprüft und die IP-Adresse des Missbrauchers blockiert) verwaltet.Diese Regel wurde von einer iptables-Befehlszeile erstellt,
iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
die der Ausgabe von iptables-save as ähnelt oder in dieser enthalten ist-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Oft finden Sie eine dieser Notationen in der Dokumentation.Die Zähler zeigen an, dass diese Regel 784'000 Paketen und 65 Megabyte Daten entspricht.
Datenverkehr, der mit dieser ersten Regel übereinstimmt, wird dann von der
fail2ban-SSH
Kette verarbeitet , die als nicht standardmäßige Kette unterhalb der OUTPUT-Kette aufgelistet wird.Diese Kette besteht aus zwei Regeln, eine für jeden Missbraucher (Quell-IP-Adresse 117.253.221.166 oder 58.218.211.166), der blockiert ist (mit einem
reject-with icm-port-unreachable
).SSH-Pakete, die nicht von diesen blockierten Hosts stammen, sind noch nicht zulässig oder nicht zulässig. Sobald die benutzerdefinierte Kette abgeschlossen ist, wird sie anhand der zweiten Regel in der INPUT-Kette überprüft.
Alle Pakete, die nicht für Port 22 bestimmt waren, haben die erste Regel in der INPUT-Kette bestanden und werden auch in der INPUT-Regel # 2 ausgewertet.
Die INPUT-Regel Nummer 2 macht dies zu einer Statefull-Firewall , die Verbindungen nachverfolgt . Dies hat einige Vorteile, da nur die Pakete für neue Verbindungen gegen den vollständigen Regelsatz geprüft werden müssen, aber sobald dies zulässig ist, werden zusätzliche Pakete, die zu einer eingerichteten oder verwandten Verbindung gehören, ohne weitere Prüfung akzeptiert.
Die Eingaberegel 2 stimmt mit allen offenen und verwandten Verbindungen überein, und Pakete, die mit dieser Regel übereinstimmen, müssen nicht weiter ausgewertet werden.
Hinweis: Regeländerungen in der Konfiguration einer Stateful Firewall wirken sich nur auf neue Verbindungen aus, nicht auf hergestellte Verbindungen.
Im Gegensatz dazu testet ein einfacher Paketfilter jedes Paket anhand des vollständigen Regelsatzes, ohne den Verbindungsstatus zu verfolgen. In einem solchen Firewall keine staatlichen Schlüsselwörter verwendet werden würde.
Die INPUT-Regel Nr. 3 ist ziemlich langweilig. Der gesamte Datenverkehr, der mit der Loopback-
lo
Schnittstelle ( oder 127.0.0.1) verbunden ist, ist zulässig.Mit den INPUT-Regeln 4, 5 und 6 werden die TCP-Ports 22, 80 und 443 (die Standardports für SSH, HTTP und HTTPS) geöffnet, indem der Zugriff auf NEUE Verbindungen gewährt wird (bestehende Verbindungen sind bereits nach INPUT-Regel 2 zulässig).
In einer zustandslosen Firewall werden diese Regeln ohne die Statusattribute angezeigt:
oder
Die letzte INPUT-Regel, # 7, blockiert den gesamten Datenverkehr, für den in den INPUT-Regeln 1-7 KEIN Zugriff gewährt wurde. Eine ziemlich verbreitete Konvention: Alles, was nicht erlaubt ist, wird abgelehnt. Theoretisch hätte diese Regel entfallen können, wenn die Standard-POLICY auf REJECT gesetzt worden wäre.
Untersuchen Sie immer die gesamte Kette.
4. Kennen Sie Ihre Umgebung
4.1. Die Einstellungen in einer Software-Firewall wirken sich nicht auf Sicherheitseinstellungen aus, die an anderer Stelle im Netzwerk gespeichert werden. Das heißt, trotz des Öffnens eines Netzwerkdienstes mit
iptables
den unveränderten Zugriffssteuerungslisten auf Routern oder anderen Firewalls in Ihrem Netzwerk wird der Datenverkehr möglicherweise weiterhin blockiert.4.2. Wenn kein Dienst empfangsbereit ist, können Sie unabhängig von den Firewall-Einstellungen keine Verbindung herstellen und erhalten den Fehler "Verbindung abgelehnt" . Deshalb:
[sudo] netstat -plnut
oder diese alternativ verwendetss -tnlp
.[sudo] nc -l -p 123
oderopenssl s_server -accept 1234 [options]
wenn Sie einen TLS / SSL-Listener benötigen (prüfen Sie, obman s_server
Optionen verfügbar sind ).telnet <IP of Server> 123
oderecho "Hello" | nc <IP of Server> 123
wenn Sie den TLS / SSL-gesicherten Dienst testenopenssl s_client -connect <IP of Server>:1234
, bevor Sie ihn von einem Remotehost aus versuchen.4.3. Verstehen Sie die von Ihren Diensten verwendeten Protokolle. Sie können Dienste, die Sie nicht ausreichend verstehen, nicht ordnungsgemäß aktivieren / deaktivieren. Zum Beispiel:
/etc/services
stimmen nicht unbedingt mit dem tatsächlichen Dienst überein, der einen Port verwendet.4.4. Der Kernel-Paketfilter ist nicht das einzige, was die Netzwerkkonnektivität einschränken kann:
getenforce
wird bestätigen, ob SELinux läuft.ldd /path/to/service |grep libwrap
und die/hosts.[allow|deny]
Steuerdateien.5.
INPUT
oderFORWARD
KettenDas Konzept der Ketten wird hier ausführlicher erklärt , aber die kurze davon ist:
In der
INPUT
Kette öffnen und / oder schließen Sie Netzwerkports für lokal ausgeführte Dienste auf dem Host, auf dem Sie die iptables-Befehle absetzen.In dieser
FORWARD
Kette wenden Sie Regeln an, um den Datenverkehr zu filtern, der vom Kernel an andere Systeme, tatsächliche Systeme, aber auch Docker-Container und virtuelle Gastserver weitergeleitet wird, wenn Ihr Linux-Computer als Bridge, Router, Hypervisor und / oder Netzwerkadresse fungiert Übersetzung und Portweiterleitung.Da ein Docker-Container oder ein KVM-Gast lokal ausgeführt wird, sollte die anzuwendende Filterregel in der INPUT-Kette enthalten sein. Dies ist jedoch normalerweise nicht der Fall.
6. Kernel-Module
Da der Paketfilter im Linux-Kernel ausgeführt wird, kann er auch als dynamisches Modul kompiliert werden, dh als mehrere Module. Die meisten Distributionen enthalten Netfilter als Module, und die erforderlichen Netfilter-Module werden nach Bedarf in den Kernel geladen. Bei einigen Modulen muss ein Firewall-Administrator jedoch manuell sicherstellen, dass sie geladen werden. Dies betrifft in erster Linie die Verbindungsverfolgungsmodule, mit
nf_conntrack_ftp
denen beispielsweise geladen werden kanninsmod
.Mit können die aktuell in den laufenden Kernel geladenen Module angezeigt werden
lsmod
.Die Methode, mit der sichergestellt wird, dass Module über Neustarts hinweg dauerhaft geladen werden, hängt von der Linux-Distribution ab.
quelle
watch --difference -n 1 iptables -L FORWARD -v -n
. Wenn das Tool den Befehl regelmäßig ausführt und die Änderungen hervorhebt, ist dies viel einfacher.iptables-save
Ausgabe (vorzugsweise mit-c
) jedes Mal über diese gefürchteteiptables -L
(mit verschiedenen Argumenten) Ausgabe nehmen.Häufige Probleme mit verschiedenen Protokollen
DNS: DNS verwendet standardmäßig UDP-Port 53, aber Nachrichten, die nicht in ein einzelnes UDP-Datagramm passen, werden stattdessen über TCP übertragen (in der Regel Zonenübertragungen usw.), wobei auch TCP-Port 53 geöffnet sein muss, wenn Sie einen Nameserver ausführen .
E-Mail: Viele Internetdienstanbieter blockieren den SMTP-Verkehr (oder zumindest den Standardport TCP 25), sodass E-Mails nicht direkt empfangen oder gesendet werden können und ihre Kunden gezwungen sind, das SMTP-Relay des Internetdienstanbieters für alle ausgehenden E-Mails und manchmal auch für eingehende E-Mails zu verwenden . Bezieht sich auf §1.1.
FTP: FTP ist ein ungewöhnliches Protokoll, wenn zwei Verbindungen verwendet werden. Die erste ist die Steuerverbindung. Standardmäßig überwacht ein FTP-Server den TCP-Port 21 darauf. Die Steuerverbindung wird zur Authentifizierung und zur Ausgabe von Befehlen verwendet. Die eigentlichen Dateiübertragungen und Dinge wie die Ausgabe einer Verzeichnisliste gehen über eine zweite TCP-Verbindung, die DATA-Verbindung. Bei aktivem FTP würde diese DATA-Verbindung vom FTP-Server über TCP-Port 20 initiiert und eine Verbindung zum FTP-Client hergestellt. Active FTP funktioniert bei Benutzern hinter Firewalls und NAT-Gateways nicht besonders gut, weshalb es größtenteils nicht mehr genutzt wird. Die meisten FTP-Server unterstützen stattdessen Passives FTP. Mit Passives FTP öffnet der FTP-Server einen Listener für die DATA-Verbindung an einem zweiten Port, mit dem sich der FTP-Client verbinden kann. Das Problem für eine Firewall besteht darin, dass der DATA-Port ein beliebiger verfügbarer unprivilegierter Port zwischen 1024 und 65536 sein kann.
In einer zustandslosen Firewall wird dies normalerweise behoben, indem die Anzahl der vom FTP-Server zugewiesenen passiven Ports beschränkt und diese Ports dann explizit geöffnet werden. dh
In einer Stateful-Firewall muss der DATA-Port nicht explizit geöffnet werden. Das Netfilter-Hilfsmodul erkennt den zugewiesenen dynamischen Port und öffnet diesen Port dynamisch für den richtigen Client, indem die DATA-Verbindung als
RELATED
mit der generischen Regel übereinstimmend markiert wird :Dies setzt voraus , dass das richtige Kernel-Modul geladen ist, im FTP-Fall beispielsweise durch manuelles Ausführen
insmod nf_conntrack_ftp
, sodass die Dauerhaftigkeit beim Neustart von der Distribution abhängt.Hinweis: Das FTP-Verbindungsverfolgungsmodul schlägt fehl, wenn FTP mit SSL verwendet wird, da die Steuerverbindung verschlüsselt wird und der nf_conntrack_ftp die PASV-Antwort nicht mehr lesen kann.
NFS und ähnliche RPC-Dienste: Das Problem bei RPC-Diensten besteht darin, dass sie standardmäßig keinen bestimmten festen Port verwenden. Sie können jeden verfügbaren Port nach dem Zufallsprinzip auswählen, der dann beim RPC-Portmap-Dämon registriert wird. Ein Client, der versucht, eine Verbindung herzustellen, fragt den Portmap-Dämon ab und stellt dann eine direkte Verbindung zum richtigen Port her. Damit wurde das Problem gelöst, dass nicht mehr genügend reservierte Ports zur Verfügung stehen ...
Aus Firewall-Sicht muss der TCP / UDP-Port 111 und der tatsächliche Port, den der RPC-Dienst derzeit verwendet, geöffnet sein. Das Problem des Öffnens eines solchen zufälligen Ports in einer Firewall wird normalerweise dadurch gelöst, dass der RPC-Dienst, z. B. der NFS-Server, auf die Verwendung eines vordefinierten festen Ports beschränkt wird.
quelle
Iptables / Firewall "Einführung"
Eine Firewall ist im Grunde ein richtlinienbasierter Netzwerkfilter. Linux-Firewalls basieren auf Netfilter. Das Netzwerk-Paketverarbeitungs-Framework des Kernels, das aus mehreren Kernel-Modulen besteht, die bestimmte Aufgaben ausführen:
Benutzer konfigurieren das Netfilter-Framework mithilfe von iptables über die Befehlszeile so, dass es ihren Firewall-Anforderungen entspricht. Mit iptables definieren wir Regeln, die den Kernel anweisen, was mit IP-Paketen zu tun ist, wenn sie in unserer Linux-Box ankommen, diese passieren oder diese verlassen. Jeder Netfilter-Hauptprozess wird durch eine TABELLE (FILTER, NAT, MANGLE) auf iptables-Jargon dargestellt. Sie haben mehrere spezifische Hook-Punkte in der Netzwerkpaketflusskarte, an denen sie vom Kernel aufgerufen werden, um ihre Aufgaben auszuführen. Bestimmte speziell lokalisierte Sequenzen von TABLE-Aufrufen werden allgemein als integrierte Ketten bezeichnet, die die Namen PREROUTING, INPUT, FORWARD, OUTPUT und POSTROUTING empfangen. Es ist leicht zu merken, ob wir eine TABELLE einem "Prozesstyp" und eine KETTE dem "Ort" auf der Netzwerkpaketflusskarte zuordnen, an dem Instanzen dieser Prozesse aufgerufen werden.
Da ein IP-Paket auf einer Netzwerkschnittstelle empfangen oder von einem lokalen Prozess erstellt wird, bis es endgültig zugestellt oder verworfen wird, testet die Netfilter-Engine nacheinander die in der Netzwerkpaketflusskarte enthaltenen Regeln und wendet sie an. Bei jedem Block, der durch ein TABLE @ CHAIN-Paar identifiziert wird, kann der Benutzer eine oder mehrere dieser aufeinanderfolgenden Regeln hinzufügen, die ein IP-Paket-Übereinstimmungskriterium und eine entsprechende Vorgehensweise enthalten. Es gibt Aktionen (dh ACCEPT, DROP usw.), die von mehr als einer TABLE ausgeführt werden können, und andere Aktionen (dh SNAT, DNAT usw.), die TABLE-spezifisch sind.
Das heißt, wenn ein IP-Paket von einer Netzwerkschnittstelle ankommt, wird es zuerst von der PREROUTING-Kette verarbeitet, wobei gegebenenfalls die benutzerdefinierten Regeln der MANGLE-Tabelle aufgerufen werden. Wenn es keine Regeln gibt, die mit dem aktuellen Paket übereinstimmen, gilt die entsprechende MANGLE @ PREROUTING-Standardaktion oder "Richtlinie". An diesem Punkt, wenn das Paket nicht verworfen wurde, wird der Prozess fortgesetzt und die Regeln der NAT-Tabelle in der PREROUTING-Kette (siehe Karte) und so weiter aufgerufen. Um das Layout der Regeln zu vereinfachen, können Benutzer auch ihre eigenen benutzerdefinierten Ketten erstellen und von verschiedenen Punkten der Karte aus darauf "springen".
Während integrierte Ketten benutzerdefinierte Richtlinien für ACCEPT- oder DROP-Pakete haben können, haben benutzerdefinierte Ketten immer eine unveränderbare Standardrichtlinie von RETURN für den Aufrufer, um den Prozess fortzusetzen.
Iptables-Befehle
Die iptables-Hauptbefehle füllen die Netzwerkpaketflusskarte mit den erforderlichen Verarbeitungsregeln.
Die generische iptables-Regel kann wie folgt geschrieben werden:
# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>
Es könnte gelesen werden wie:
Die Hilfsbefehle von iptables vervollständigen das Szenario, indem Standardbedingungen festgelegt, Regeln aufgelistet, Regeln gelöscht usw. werden.
Iptables lädt unsere Befehle zur Laufzeit in die Netfilter-Engine. Netfilter erzwingt sofort die geladenen Regeln und Einstellungen, sie sind jedoch nicht dauerhaft. Nach einem Neustart gehen alle zuvor geladenen Netfilter-Regeln und -Einstellungen verloren. Aus diesem Grund gibt es iptables-Dienstprogramme, mit denen Sie den derzeit aktiven Regelsatz in einer Datei speichern und später erneut laden können.
Iptables Zusammenfassung
Netfilter ist ein extrem flexibles und leistungsstarkes Framework, für das jedoch ein Preis zu zahlen ist. Iptables ist komplex. Aus Anwendersicht stimmen bestimmte Begriffe wie TABLE, CHAIN, TARGET nicht wirklich mit dem Konzept überein, das sie darstellen, und ergeben zunächst keinen Sinn. Das Thema ist lang, Befehle scheinen eine endlose Liste von Parametern zu haben. Erschwerend kommt hinzu, dass es kein einziges Buch gibt, das Iptables wirklich beherrscht. Sie fallen meist in zwei Kategorien: "Rezeptbuch" oder "Handbuch". Ich denke, diese Einführung gibt Ihnen einen Überblick über die Netfilter / Iptables-Landschaft sowie die notwendige Dosis vorverdauten Manpage-Materials. Wenn Sie neu bei iptables sind, können Sie nach mehrmaligem Lesen dieser Absätze Beispiele für iptables lesen. Mit etwas Übung werden Sie bald feststellen, dass Sie Ihre eigenen Regeln schreiben.
Firewalls
Eine Firewall dient hauptsächlich dazu, den Netzwerkverkehr basierend auf einer Reihe von Regeln dynamisch zuzulassen oder abzulehnen. An dieser Stelle ist es leicht zu verstehen, warum das Linux Netfilter / Iptables-Framework perfekt für die Firewall-Erstellung geeignet ist. In der Netzwerk-Paketflusskarte finden wir zwei besonders interessante Stellen in der FILTER-Tabelle in den Ketten INPUT und FORWARD. Wir können dort über die IP-Quelladresse, das IP-Protokoll (UDP / TCP), den Zielport (80, 21, 443 usw.) usw. entscheiden, ob wir ein bestimmtes IP-Paket akzeptieren, ablehnen oder einfach fallen lassen. Dies ist, was eine Firewall 80% der Zeit tut, wenn zB ein Webserver vor nicht autorisierten Netzwerkanforderungen geschützt wird. Die anderen 20% der Zeit manipulieren (NAT, MANGLE) Netzwerkpakete.
Firewalls-Szenarien
Es gibt Hunderte verschiedener Firewall-Layouts, die unterschiedliche Anforderungen erfüllen, aber drei davon können als die typischsten Firewall-Szenarien angesehen werden.
Ich habe dies geschrieben für: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html
quelle