Verbindungsverfolgung ist die Grundlage vieler Webanwendungen. Beispielsweise sind der Kubernetes-Dienst, der ServiceMesh-Sidecar, der vierschichtige Software-Load-Balancer LVS/IPVS, das Docker-Netzwerk, OVS, die Iptables-Host-Firewall usw. alle auf die Verbindungsverfolgungsfunktion angewiesen. Verbindungsverfolgung dient, wie der Name schon sagt, dazu, den Status der Verbindung zu verfolgen (und aufzuzeichnen). Abbildung 1.1 zeigt beispielsweise eine Linux-Maschine mit der IP-Adresse 10.1.1.2. Wir können sehen, dass es auf dieser Maschine drei Verbindungen gibt:
Die Verbindung für die Maschine, um auf den externen HTTP-Dienst (Ziel) zuzugreifen Port 80)
Die Verbindung von der externen Zugriffsmaschine zum FTP-Dienst (Zielport 21)
Die Verbindung von der Maschine zum externen DNS-Dienst (Zielport 53)
Die Funktion der Verbindungsverfolgung besteht darin, den Status dieser Verbindungen zu ermitteln und zu verfolgen:
Tupelinformationen aus dem Datenpaket extrahieren, den Datenfluss (Flow) und die entsprechende Verbindung (Verbindung) identifizieren.
Pflegen Sie eine Statusdatenbank (Conntrack-Tabelle) für alle Verbindungen, z. B. die Erstellungszeit der Verbindung, die Anzahl der gesendeten Pakete, die Anzahl der gesendeten Bytes usw.
Abgelaufene Verbindungen (GC) wiederverwenden.
Bereitstellung von Diensten für übergeordnete Funktionen (z. B. NAT).
Es ist zu beachten, dass das Konzept der „Verbindung“ bei der Verbindungsverfolgung nicht genau das gleiche ist wie das „verbindungsorientierte“ im TCP/IP-Protokoll. Vereinfacht ausgedrückt:
In Beim TCP/IP-Protokoll handelt es sich bei der Verbindung um ein Layer-4-Konzept. TCP ist verbindungsorientiert und alle gesendeten Pakete erfordern eine Antwort (ACK) vom Peer, und es gibt einen Neuübertragungsmechanismus. UDP ist verbindungslos und die gesendeten Pakete erfordern keine Antwort vom Peer, und es gibt keinen Neuübertragungsmechanismus. In
conntrack(CT) stellt ein durch ein Tupel (Tupel) definierter Datenfluss (Flow) eine Verbindung (Verbindung) dar. Wir werden später sehen, dass dreischichtige Protokolle wie UDP und sogar ICMP auch Verbindungsdatensätze in CT haben, aber nicht alle Protokolle werden verbunden.
Netfilter
Linux-Verbindungsverfolgung ist in Netfilter implementiert. Netfilter ist ein Framework im Linux-Kernel zur Steuerung, Änderung und Filterung von Datenpaketen (Manipulation und Filterung). Es setzt mehrere Hook-Punkte im Kernel-Protokollstapel, um Datenpakete abzufangen, zu filtern oder anderweitig zu verarbeiten.Wenn jetzt von Verbindungsverfolgung (conntrack) die Rede ist, fällt einem vielleicht zuerst Netfilter ein, es handelt sich lediglich um eine Verbindungsverfolgungsimplementierung im Linux-Kernel. Mit anderen Worten: Solange Sie über die Hook-Fähigkeit verfügen und jedes beim Host ein- und ausgehende Paket abfangen können, können Sie auf dieser Grundlage selbst eine Reihe von Verbindungsverfolgungen implementieren. Die cloudnative Netzwerklösung Cilium hat in Version 1.7.4+ einen solchen unabhängigen Verbindungsverfolgungs- und NAT-Mechanismus implementiert (vollständige Funktionalität erfordert Kernel 4.19+). Das Grundprinzip lautet:
Implementieren Sie die Paketabfangfunktion basierend auf dem BPF-Hook (entspricht dem Hook-Mechanismus im Netfilter).
Implementieren Sie basierend auf dem BPF-Hook einen neuen Satz von Conntrack und NAT. Daher sogar Wenn Netfilter deinstalliert wird, hat dies keine Auswirkungen auf die Unterstützung von Cilium für Funktionen wie Kubernetes ClusterIP, NodePort, ExternalIPs und LoadBalancer. Da dieser Verbindungsverfolgungsmechanismus unabhängig von Netfilter ist, werden seine Conntrack- und NAT-Informationen nicht in der Conntrack-Tabelle und der NAT-Tabelle des Kernels (d. h. Netfilters) gespeichert.Daher sind reguläre conntrack/netstats/ss/lsof und andere Tools nicht sichtbar. Sie müssen Cilium-Befehle verwenden, wie zum Beispiel:
$ cilium bpf nat list$ cilium bpf ct list global
Nach dem Login kopieren
Iptables
Iptables ist ein User-Space-Tool zum Konfigurieren der Netfilter-Filterung Funktion. Netfilter ist das eigentliche Sicherheits-Framework der Firewall und Netfilter befindet sich im Kernel-Bereich. iptables ist eigentlich ein Befehlszeilentool, das sich im Benutzerbereich befindet. Wir verwenden dieses Tool, um das eigentliche Framework zu betreiben. Iptable verarbeitet Datenpakete gemäß den durch Regeln definierten Methoden wie Akzeptieren, Ablehnen, Verwerfen usw. Wenn der Client beispielsweise auf den Webdienst des Servers zugreift, sendet der Client eine Nachricht an die Netzwerkkarte, und der TCP/IP-Protokollstapel ist Teil des Kernels, sodass die Informationen des Clients an den Benutzerbereich übertragen werden über das TCP-Protokoll des Kernels Im Webdienst ist der Zielendpunkt der Clientnachricht zu diesem Zeitpunkt der vom Webdienst überwachte Socket (IP:Port), wenn der Webdienst auf die Clientanforderung antworten muss, die Antwortnachricht Vom Webdienst gesendet Der Zielendpunkt ist der Client. Zu diesem Zeitpunkt werden die vom Webdienst überwachte IP und der Port zum Ursprung. Wir haben gesagt, dass Netfilter die eigentliche Firewall ist Wir möchten, dass die Firewall den Zweck des „Brandschutzes“ erfüllt. Alle eingehenden und ausgehenden Nachrichten müssen diese Prüfpunkte passieren. Nach der Überprüfung können nur diejenigen freigegeben werden, die die Freigabebedingungen erfüllen. und diejenigen, die die Sperrbedingungen erfüllen, müssen blockiert werden. iptables enthält 4 Tische und 5 Ketten. Die Tabelle wird nach der Operation am Datenpaket (Filterung, NAT usw.) unterschieden, und die Kette wird nach verschiedenen Hook-Punkten unterschieden. Tabelle und Kette sind eigentlich die beiden Dimensionen von Netfilter.Die vier Tabellen von iptables sind Filter, Mangle, Nat und Raw. Die Standardtabelle ist Filter.
Filtertabelle: Wird zum Filtern von Datenpaketen verwendet. Spezifische Regelanforderungen bestimmen, wie ein Datenpaket verarbeitet wird.
nat-Tabelle: Wird hauptsächlich zum Ändern der IP-Adresse und Portnummerninformationen von Datenpaketen verwendet.
Mangle-Tabelle: Wird hauptsächlich zum Ändern des Diensttyps und Lebenszyklus von Datenpaketen, zum Festlegen von Tags für Datenpakete, zum Implementieren von Traffic Shaping, Policy Routing usw. verwendet.
Rohtabelle: Wird hauptsächlich verwendet, um zu entscheiden, ob eine Statusverfolgung für Datenpakete durchgeführt werden soll.
Die fünf Ketten von iptables sind PREROUTING, INPUT, FORWARD, OUTPUT und POSTROUTING.
Eingabekette: Wenn ein Paket empfangen wird, das auf die lokale Adresse zugreift, werden die Regeln in dieser Kette angewendet.
Ausgabekette: Wenn die Maschine ein Paket sendet, werden die Regeln in dieser Kette angewendet.
Weiterleitungskette: Beim Empfang eines Datenpakets, das an andere Adressen weitergeleitet werden muss, werden die Regeln in dieser Kette angewendet. Beachten Sie, dass Sie die Funktion ip_forward aktivieren müssen, wenn Sie die Weiterleitung implementieren müssen der Linux-Kernel.
Prerouting-Kette: Die Regeln in dieser Kette werden vor dem Routing des Pakets angewendet.
Postrouting-Kette: Nach dem Routing des Pakets werden die Regeln in dieser Kette angewendet.
Die entsprechende Beziehung zwischen der Tabelle und der Kette ist in der folgenden Abbildung dargestellt: Wir können uns den Nachrichtenfluss in einigen gängigen Szenarien vorstellen:
Nachrichten an einen bestimmten Prozess weiter die lokale Maschine: PREROUTING –>
Von dieser Maschine weitergeleitete Nachrichten: PREROUTING –>
Eine Nachricht (normalerweise eine Antwortnachricht), die von einem Prozess auf dem lokalen Computer gesendet wird: OUTPUT –>Wir können den Prozess der Datenpakete zusammenfassen, die durch die Firewall gehen wie folgt:
Query Rules
-T: Tabellenname
-n: Nicht lösen IP-Adresse
-v: Zeigt die Zählerinformationen, die Anzahl und Größe der Pakete an
-x: Die Option gibt an, den genauen Wert des Zählers anzuzeigen
--line-numbers: Die Seriennummer der Anzeigeregel (abgekürzt als --line)
Außerdem sollten Sie bei der Suche nach dem öffentlichen Konto Linux auf diese Weise lernen, mit „Monkey“ im zu antworten Hintergrund und erhalte ein Überraschungsgeschenkpaket.
当我们通过 http 的 url 访问某个网站的网页时,客户端向服务端的 80 端口发起请求,服务端再通过 80 端口响应我们的请求,于是,作为客户端,我们似乎应该理所应当的放行 80 端口,以便服务端回应我们的报文可以进入客户端主机,于是,我们在客户端放行了 80 端口,同理,当我们通过 ssh 工具远程连接到某台服务器时,客户端向服务端的 22 号端口发起请求,服务端再通过 22 号端口响应我们的请求,于是我们理所应当的放行了所有 22 号端口,以便远程主机的响应请求能够通过防火墙,但是,作为客户端,如果我们并没有主动向 80 端口发起请求,也没有主动向 22 号端口发起请求,那么其他主机通过 80 端口或者 22 号端口向我们发送数据时,我们可以接收到吗?应该是可以的,因为我们为了收到 http 与 ssh 的响应报文,已经放行了 80 端口与 22 号端口,所以,不管是”响应”我们的报文,还是”主动发送”给我们的报文,应该都是可以通过这两个端口的,那么仔细想想,这样是不是不太安全呢?此时 state 扩展模块就派上用场了。Für die Verbindung des Statusmoduls können die Nachrichten in der „Verbindung“ in 5 Zustände unterteilt werden, nämlich:
NEU: Das erste Paket in der Verbindung, der Zustand ist NEU, wir Es versteht sich, dass der Status des ersten Pakets der neuen Verbindung NEU ist.
ESTABLISHED: Wir können den Status des Pakets nach dem NEUEN Statuspaket als ESTABLISHED verstehen, was darauf hinweist, dass die Verbindung hergestellt wurde.
RELATED wird wörtlich als Beziehung übersetzt, ist aber dennoch nicht leicht zu verstehen. Im FTP-Dienst erstellt der FTP-Server beispielsweise zwei Prozesse, einen Befehlsprozess und einen Datenprozess. Der Befehlsprozess ist für die Befehlsübertragung zwischen dem Server und dem Client verantwortlich (wir können diesen Übertragungsprozess als eine sogenannte „Verbindung“ im Status verstehen, die vorübergehend als „Befehlsverbindung“ bezeichnet wird). Der Datenprozess ist für die Datenübertragung zwischen dem Server und dem Client verantwortlich (wir nennen diesen Prozess vorübergehend „Datenverbindung“). Die zu übertragenden spezifischen Daten werden jedoch durch den Befehl gesteuert. Daher sind die Nachrichten in der „Datenverbindung“ mit der „Befehlsverbindung“ „bezogen“. Dann können sich die Pakete in der „Datenverbindung“ im RELATED-Zustand befinden, da diese Pakete mit den Paketen in der „Befehlsverbindung“ in Beziehung stehen. (Hinweis: Wenn Sie eine Verbindungsverfolgung für FTP durchführen möchten, müssen Sie das entsprechende Kernelmodul nf_conntrack_ftp separat laden. Wenn Sie es automatisch laden möchten, können Sie die Datei /etc/sysconfig/iptables-config konfigurieren)
UNGÜLTIG: Wenn es für ein Paket keine Möglichkeit gibt, es zu identifizieren, oder das Paket keinen Status hat, dann ist der Status dieses Pakets UNGÜLTIG. Wir können die Pakete mit dem Status UNGÜLTIG blockieren.
UNTRACKED: Wenn der Status des Pakets „Untracked“ lautet, bedeutet dies, dass das Paket nicht verfolgt wurde. Wenn der Status des Pakets „Untracked“ lautet, bedeutet dies normalerweise, dass die entsprechende Verbindung nicht gefunden werden kann.
刚才举例中的问题即可使用 state 扩展模块解决,我们只要放行状态为 ESTABLISHED 的报文即可,因为如果报文的状态为 ESTABLISHED,那么报文肯定是之前发出的报文的回应,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙:
iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT
Wenn die Standardkette zu viele Regeln enthält, ist die Verwaltung für uns unpraktisch. Stellen Sie sich vor, dass in der INPUT-Kette 200 Regeln gespeichert sind. Einige dieser 200 Regeln gelten für den HTTPD-Dienst, einige für die IP des privaten Netzwerks und einige für die IP des öffentlichen Netzwerks Müssen wir die Regeln im Zusammenhang mit dem httpd-Dienst von Anfang an lesen, um herauszufinden, welche Regeln spezifisch für httpd sind? Das ist offensichtlich unvernünftig. In iptables können Sie also die Kette anpassen, und die oben genannten Probleme können durch Anpassen der Kette gelöst werden. Angenommen, wir passen eine Kette namens IN_WEB an. Wir können alle eingehenden Regeln für Port 80 in die Zukunft schreiben. Wenn wir die eingehenden Regeln für Webdienste ändern möchten, können wir einfach die Regeln in der IN_WEB-Kette ändern Wenn die Standardkette weitere Regeln enthält, haben wir keine Angst, da wir wissen, dass alle eingehenden Regeln für Port 80 in der IN_WEB-Kette gespeichert sind.
Das obige ist der detaillierte Inhalt vonIch weiß nicht, wie man die Linux-Firewall-Software IPtables verwendet! Was für ein Betriebs- und Wartungstyp sind Sie?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn