Einführung
In diesem Labor lernen Sie, wie Sie den Befehl netstat zur Analyse der Netzwerkaktivität auf einem Linux-System verwenden. Sie werden grundlegende Konzepte wie Netzwerkports, Sockets und aktive Verbindungen untersuchen, um Einblicke zu gewinnen, wie Dienste über das Netzwerk kommunizieren.
Sie beginnen damit, alle aktiven Sockets aufzulisten und filtern dann die Ergebnisse, um sich auf lauschende TCP- und UDP-Ports zu konzentrieren und diese ihren laufenden Diensten zuzuordnen. Um diese Konzepte in Aktion zu sehen, generieren Sie eine neue Verbindung, indem Sie eine Website durchsuchen, und verwenden dann netstat, um die neu erstellte ESTABLISHED-Sitzung und ihren zugehörigen temporären Port zu identifizieren.
Alle aktiven und lauschenden Sockets mit netstat -a auflisten
In diesem Schritt beginnen Sie mit der Untersuchung der Netzwerkaktivität Ihres Systems mithilfe des Befehls netstat. Dieser Befehl ist ein grundlegendes Werkzeug für Netzwerkadministratoren und Entwickler und liefert Einblicke in Netzwerkverbindungen, Routing-Tabellen und Schnittstellenstatistiken. Wir beginnen mit der Option -a, die netstat anweist, alle aktiven Sockets anzuzeigen, einschließlich Verbindungen zu entfernten Systemen und Ports, die auf neue eingehende Verbindungen "lauschen".
Stellen Sie zunächst sicher, dass Sie sich in Ihrem Standardarbeitsverzeichnis befinden. Alle Befehle in diesem Labor werden vom Terminal aus ausgeführt.
Listen wir nun alle Sockets auf. Geben Sie in Ihrem Terminal den folgenden Befehl ein und drücken Sie Enter:
netstat -a
Sie werden eine große Menge an Ausgabe sehen. Keine Sorge, wir werden sie aufschlüsseln. Die Ausgabe zeigt alle Arten von Sockets an, einschließlich TCP, UDP und UNIX-Domain-Sockets.
Untersuchen wir die Struktur der Ausgabe. Sie sollte in etwa so aussehen (die genauen Details auf Ihrem System können variieren):
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:6010 0.0.0.0:* LISTEN
tcp 0 52 labex-vm:ssh 192.168.0.10:54321 ESTABLISHED
tcp6 0 0 [::]:http-alt [::]:* LISTEN
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
...
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 23456 /run/systemd/notify
unix 2 [ ACC ] STREAM LISTENING 34567 /tmp/.X11-unix/X0
...
Hier ist eine Aufschlüsselung der wichtigsten Spalten für Internetverbindungen:
Proto: Das vom Socket verwendete Protokoll, z. B.tcp(für TCPv4),tcp6(für TCPv6) oderudp.Local Address: Die IP-Adresse Ihres Systems und die Portnummer, die es für diese Verbindung verwendet. Der Port ist die Nummer nach dem Doppelpunkt (:). Eine Adresse von0.0.0.0oder[::]bedeutet, dass der Port auf allen verfügbaren Netzwerkschnittstellen Ihres Rechners lauscht.Foreign Address: Die IP-Adresse und Portnummer des entfernten Systems. Wenn der StatusLISTENist, ist dies typischerweise0.0.0.0:*oder[::]:*, was darauf hinweist, dass auf eine Verbindung von einer beliebigen Adresse gewartet wird.State: Dies ist entscheidend für TCP-Verbindungen.LISTEN: Die Anwendung wartet auf eine eingehende Verbindung auf dem angegebenen Port derLocal Address. Dies ist ein serverseitiger Status.ESTABLISHED: Eine Verbindung ist aktiv und Daten können zwischen der lokalen und der entfernten Adresse übertragen werden.- Andere Status wie
TIME_WAIToderCLOSE_WAITbeziehen sich auf den Prozess des Schließens einer TCP-Verbindung.
Nehmen Sie sich einen Moment Zeit, um die Ausgabe durchzuscrollen und alle Einträge im Status LISTEN zu identifizieren. Diese repräsentieren Dienste auf Ihrem System, die bereit sind, Netzwerkverbindungen anzunehmen. Dies ist ein direkter Einblick in die Transportschicht (Schicht 4) in Aktion.
Nach lauschenden TCP/UDP-Ports filtern mit sudo netstat -tulnp
Im vorherigen Schritt lieferte uns der Befehl netstat -a eine vollständige, aber lange Liste aller Sockets. Um diese Informationen nützlicher zu machen, müssen wir sie filtern. In diesem Schritt lernen Sie, wie Sie mit spezifischen Optionen netstat verwenden, um nur die lauschenden TCP- und UDP-Ports anzuzeigen und, was am wichtigsten ist, zu identifizieren, welche Programme sie verwenden.
Um den Programmnamen, der einem Port zugeordnet ist, anzuzeigen, benötigen Sie oft Administratorrechte, da der Prozess dem System oder einem anderen Benutzer gehören könnte. Deshalb verwenden wir den Befehl sudo. In der LabEx-Umgebung können Sie sudo ohne Passwort verwenden.
Führen wir einen fokussierteren netstat-Befehl aus. Geben Sie in Ihrem Terminal Folgendes ein:
sudo netstat -tulnp
Lassen Sie uns diese Optionen aufschlüsseln, da sie häufig kombiniert werden:
t: Zeigt TCP-Verbindungen an.u: Zeigt UDP-Verbindungen an.l: Zeigt nur lauschende Sockets an. Dies ist unser primärer Filter, um zu sehen, welche Dienste auf Verbindungen warten.n: Zeigt numerische Adressen an. Dies verhindert, dassnetstatversucht, IP-Adressen und Portnummern in Hostnamen und Servicenamen aufzulösen (z. B. zeigt es22anstelle vonssh), was den Befehl viel schneller ausführt.p: Zeigt die Prozess-ID (PID) und den Namen des Programms an, zu dem der Socket gehört. Dies erfordertsudo, um alle Prozesse anzuzeigen.
Nachdem Sie Enter gedrückt haben, wird Ihre Ausgabe viel kürzer und informativer sein. Sie wird in etwa so aussehen:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 779/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3422/sshd
udp 0 0 127.0.0.53:53 0.0.0.0:* 779/systemd-resolve
Beachten Sie die neue Spalte am Ende: PID/Program name. Dies ist die wichtigste Information. Sie können nun einen lauschenden Port direkt der genauen Anwendung zuordnen, die ihn geöffnet hat. Im obigen Beispiel sehen Sie beispielsweise, dass Port 22 (der Standardport für SSH) vom Programm sshd mit einer Prozess-ID von 3422 verwendet wird.
Dieser Befehl ist für Systemadministratoren äußerst nützlich. Er ermöglicht es Ihnen, schnell zu überprüfen, welche Dienste ausgeführt werden und im Netzwerk verfügbar sind, was sowohl für die Fehlerbehebung als auch für die Sicherheitsüberprüfung unerlässlich ist.
Lauschende Ports laufenden Diensten zuordnen
In diesem Schritt festigen Sie Ihr Verständnis der Verbindung zwischen laufenden Anwendungen und lauschenden Netzwerkports. Sie haben gesehen, wie Sie bestehende Dienste mit netstat auflisten können. Nun starten Sie Ihren eigenen einfachen Webdienst und beobachten, wie er in der netstat-Ausgabe erscheint, um diese Beziehung in Echtzeit zu demonstrieren.
Wir verwenden das integrierte http.server-Modul von Python, um schnell einen Webserver zu starten. Dies ist ein praktisches Werkzeug für Entwicklung und Tests.
Starten wir zuerst den Webserver. Wir weisen ihn an, auf Port
8080zu lauschen, einem gängigen alternativen Port für Webdienste. Führen Sie in Ihrem Terminal den folgenden Befehl aus. Beachten Sie, dass Ihr Terminal "hängen" zu bleiben scheint, da es nun aktiv den Server ausführt.python3 -m http.server 8080Sie sollten eine Ausgabe sehen, die anzeigt, dass der Server gestartet wurde:
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...Dieses Terminal ist nun vom Webserver-Prozess belegt. Sie benötigen ein neues Terminal, um andere Befehle auszuführen. In der LabEx-Umgebung können Sie einen neuen Terminal-Tab öffnen, indem Sie auf das "Plus"-Symbol im Terminalfenster klicken oder das Menü (
Datei -> Neuer Tab) verwenden.Führen Sie in Ihrem neuen Terminal-Tab erneut den
netstat-Befehl aus, um die Liste der lauschenden Ports anzuzeigen.sudo netstat -tulnpUntersuchen Sie die Ausgabe sorgfältig. Sie werden nun einen neuen Eintrag für Port
8080sehen.Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 779/systemd-resolve tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3422/sshd tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 12345/python3 udp 0 0 127.0.0.53:53 0.0.0.0:* 779/systemd-resolve ...Wie Sie sehen können, meldet das System nun, dass das Programm
python3(mit einer spezifischen PID, z. B.12345) im StatusLISTENauf Port8080ist. Sie haben erfolgreich einen Dienst gestartet und bestätigt, dass er auf Netzwerkverbindungen wartet.Stoppen wir nun den Dienst. Kehren Sie zu Ihrem ersten Terminal-Tab (dem, der den Python-Server ausführt) zurück und drücken Sie
Ctrl+C. Dies unterbricht und beendet den Server-Prozess.Kehren Sie zum zweiten Terminal-Tab zurück und führen Sie den
netstat-Befehl ein letztes Mal aus.sudo netstat -tulnpDie Zeile für Port
8080wird verschwunden sein, was beweist, dass eine Anwendung, wenn sie beendet wird, nicht mehr auf dem Port lauscht.
Neue Verbindung durch Browsen einer Website erstellen
In diesem Schritt verlagern Sie Ihren Fokus von lauschenden Server-Ports auf aktive Client-Verbindungen. Bisher haben Sie Dienste beobachtet, die darauf warten, dass andere sich mit ihnen verbinden. Nun initiieren Sie eine Verbindung von Ihrem Rechner zu einem entfernten Server und beobachten, wie die Verbindung aufgebaut wird. Wir verwenden das Kommandozeilenwerkzeug curl, um den Besuch einer Website zu simulieren.
Um dieses flüchtige Ereignis zu beobachten, verwenden wir den Befehl watch, der einen anderen Befehl wiederholt ausführt und es uns ermöglicht, Änderungen in der Ausgabe von netstat nahezu in Echtzeit zu sehen.
Richten wir zunächst unser Überwachungsfenster ein. Führen Sie in Ihrem Terminal den folgenden Befehl aus. Dieser wird
netstat -antpalle zwei Sekunden ausführen und die Ergebnisse anzeigen, wobei der Bildschirm kontinuierlich aktualisiert wird.watch netstat -antpa: Zeigt alle Sockets an.n: Zeigt numerische Adressen an.t: Zeigt nur TCP-Verbindungen an.p: Zeigt die PID/den Programmnamen an.
Ihr Terminal wird nun mit der
netstat-Ausgabe gefüllt, die sich automatisch aktualisiert. Lassen Sie dieses Terminal geöffnet und sichtbar.Nun müssen Sie einen neuen Terminal-Tab öffnen, um den Befehl auszuführen, der die Verbindung herstellt. Klicken Sie auf das "Plus"-Symbol in der Tab-Leiste Ihres Terminals.
Im neuen Terminal-Tab verwenden Sie
curl, um die Homepage der LabEx-Website abzurufen. Das Symbol>leitet die HTML-Ausgabe nach/dev/nullum, damit sie Ihren Bildschirm nicht überfüllt.curl https://www.labex.io > /dev/nullSobald Sie
Enterdrücken, wechseln Sie schnell zurück zu Ihrem ersten Terminal-Tab (dem, derwatchausführt). Sie werden sehen, wie für einige Sekunden eine neue Verbindung erscheint. Sie wird ungefähr so aussehen:Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ... tcp 0 0 172.17.0.2:45678 104.21.5.141:443 ESTABLISHED 13579/curl ...- Beachten Sie, dass der
StateESTABLISHEDist, was auf eine aktive Verbindung hinweist. - Die
Foreign Addresszeigt die IP-Adresse deslabex.io-Servers und den Port443(der Standard für HTTPS) an. - Die Spalte
PID/Program nameidentifiziert klarcurlals das Programm, das diese Verbindung initiiert hat. - Die
Local Addressverwendet einen zufälligen Port mit hoher Nummer (wie45678im Beispiel). Dies ist ein ephemerer Port, den wir im nächsten Schritt besprechen werden.
- Beachten Sie, dass der
Sobald der
curl-Befehl den Download abgeschlossen hat (was sehr schnell geht), sehen Sie, wie sich der Verbindungsstatus zuTIME_WAIToderFIN_WAITändert, bevor er vollständig aus der Liste verschwindet.Sie können nun den
watch-Befehl stoppen. Gehen Sie zum ersten Terminal-Tab und drücken SieCtrl+C. Sie können auch den zweiten Terminal-Tab schließen.
ESTABLISHED-Sitzung und temporäre Ports identifizieren
In diesem letzten Schritt festigen Sie Ihr Verständnis, indem Sie eine persistente, aktive Verbindung untersuchen. Dies ermöglicht es Ihnen, eine Netzwerk-"Sitzung" klar zu identifizieren und zu sehen, wie Ihr System temporäre oder "ephemere" Ports für die clientseitige Kommunikation verwendet.
Eine ESTABLISHED-Verbindung in der Ausgabe von netstat repräsentiert eine aktive Sitzung (OSI-Schicht 5), bei der zwei Anwendungen bereit sind, Daten auszutauschen. In der vorherigen Schritt war die curl-Sitzung sehr kurzlebig. Um eine Sitzung einfacher zu untersuchen, erstellen wir eine, die offen bleibt, indem wir SSH verwenden.
Zuerst definieren wir ein wichtiges Konzept: ephemere Ports. Wenn Ihr Computer (der Client) eine Verbindung zu einem Server über einen bekannten Port (wie Port 22 für SSH oder 443 für HTTPS) herstellt, muss Ihr Betriebssystem einen Port für seine Seite der Konversation zuweisen. Es wählt einen temporären, ungenutzten Port aus einem Bereich mit hoher Nummerierung (typischerweise über 32768). Dies wird als ephemerer Port bezeichnet. Dieser Mechanismus ermöglicht es Ihrem einzelnen Rechner, viele separate Verbindungen zum selben Server-Port zu haben, zum Beispiel, wenn mehrere Browser-Tabs zur selben Website geöffnet sind.
Um eine stabile, beobachtbare Sitzung zu erstellen, verbinden Sie sich per SSH von Ihrem Laborrechner zurück zu sich selbst. Führen Sie in Ihrem Terminal den folgenden Befehl aus:
ssh localhostWenn Sie dies zum ersten Mal tun, sehen Sie möglicherweise eine Meldung über die Authentizität des Hosts. Das ist normal.
The authenticity of host 'localhost (127.0.0.1)' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])?Geben Sie
yesein und drücken SieEnter, um fortzufahren.Es wird Sie zur Eingabe des Passworts auffordern. Sie müssen das Passwort nicht eingeben, bleiben Sie einfach dort.
Öffnen Sie einen neuen Terminal-Tab, indem Sie auf das "Plus"-Symbol klicken. Wir benötigen dieses neue Terminal, um
netstatauszuführen, ohne unsere aktive SSH-Sitzung zu stören.Führen Sie im neuen Terminal erneut
netstataus, aber diesmal verwenden wir den Befehlgrep, um die Ausgabe zu filtern und nur die Zeilen anzuzeigen, dieESTABLISHEDenthalten. Dies erleichtert das Finden aktiver Sitzungen erheblich.netstat -antp | grep ESTABLISHEDDie Ausgabe zeigt alle aktuell aktiven TCP-Verbindungen an. Möglicherweise sehen Sie eine Warnung, dass nicht alle Prozesse identifiziert werden konnten, was erwartet wird, da wir
sudonicht verwenden. Sie sollten Ihre ursprüngliche SSH-Verbindung zur Lab-Umgebung und die neue, die Sie gerade zulocalhosterstellt haben, sehen.(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 172.16.50.192:22 47.251.66.143:36882 ESTABLISHED - tcp 0 0 127.0.0.1:46280 127.0.0.1:22 ESTABLISHED 5449/ssh tcp 0 0 127.0.0.1:22 127.0.0.1:46280 ESTABLISHED -Analysieren wir die neue
localhost-Verbindung, die durch die Adresse127.0.0.1identifiziert wird:- Die Serverseite der Verbindung ist
127.0.0.1:22, das ist der SSH-Server (sshd), der auf Port 22 lauscht. Er hat eine bestehende Verbindung von127.0.0.1:46280. Die Programminformation ist-, da dersshd-Prozess dem Benutzer root gehört und wirsudonicht verwendet haben. - Die Clientseite ist
127.0.0.1:46280, verbunden mit127.0.0.1:22. Das Programm ist klar als5449/sshidentifiziert. - Der Port
46280ist der ephemere Port. Ihr System hat ihn zufällig für das Client-Ende dieser spezifischen SSH-Sitzung gewählt. Wenn Sie eine weiteressh localhost-Verbindung öffnen würden, würde diese einen anderen ephemeren Port verwenden.
- Die Serverseite der Verbindung ist
Um zu beenden, schließen Sie die Sitzung. Wechseln Sie zurück zum Terminal-Tab, in dem Sie
ssh localhostausgeführt haben, und geben Sieexitein, gefolgt vonEnter.exitDies beendet die Verbindung. Wenn Sie in dem anderen Terminal erneut
netstat -antp | grep ESTABLISHEDausführen, werden Sie sehen, dass dielocalhost-Sitzung verschwunden ist.
Zusammenfassung
In diesem Labor haben Sie gelernt, wie Sie den Befehl netstat zur Analyse der Netzwerkaktivität auf einem Linux-System verwenden. Sie haben zunächst netstat -a verwendet, um alle aktiven und lauschenden Sockets aufzulisten, einschließlich TCP-, UDP- und UNIX-Domain-Sockets. Anschließend haben Sie diese Ausgabe verfeinert, indem Sie Flags wie -t, -u, -l, -n und -p angewendet haben, um gezielt nach lauschenden TCP- und UDP-Ports zu filtern, numerische Adressen anzuzeigen und die Prozess-ID und den Namen zu identifizieren, die jedem Port zugeordnet sind.
Darauf aufbauend haben Sie die Ausgabe des Befehls interpretiert, um lauschende Ports ihren entsprechenden Diensten zuzuordnen. Um eine Verbindung in Aktion zu beobachten, haben Sie eine neue Netzwerksitzung initiiert, indem Sie eine Verbindung zu einer Website hergestellt haben. Dies ermöglichte es Ihnen, eine Verbindung im Zustand ESTABLISHED zu identifizieren und die Rolle von ephemeren Ports zu verstehen, bei denen es sich um temporäre Ports handelt, die der Client-Seite einer Netzwerkkommunikation zugewiesen werden.



