GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden des SS-Tools für die Netzwerkfehlerbehebung

Einleitung:

Der folgende Artikel wurde komplett 1 zu 1 (Vollplagiat!!) von der folgenden Seite kopiert, um hier darauf verweisen zu können, falls der Artikel aus dem Internet verschwindet oder seinen Standort wechselt.
http:// www.linux-magazine.com/Issues/2015/181/Querying-Sockets-with-ss

Linux-Magazin. Artikel aus Heft 181/2015
Autor(en):Chris Binnie

Die bescheidene ss Das Dienstprogramm ist leicht zu verstehen und einfach einzugeben, aber es fügt Ihrem Admin-Toolkit einige leistungsstarke Optionen hinzu.

Die Namen einiger Linux-Dienstprogramme sind so klein, dass Sie sie unerwartet starten, indem Sie einen Tippfehler in die Befehlszeile eingeben. Warum lange Wörter eintippen, wenn eine perfekt passende Abkürzung genügt? Ein winziger Befehl (sowohl im Namen als auch im Taschenformat auf Ihrer Festplatte) ist ein kleines Dienstprogramm namens ss .

Ss schlägt mehrere Stufen über seiner Fliegengewichtsklasse. Wenn Sie mit einem der beliebten Tools vertraut sind, die von Systemadministratoren zum Überprüfen von Netzwerkverbindungen verwendet werden, werden Sie sicher froh sein zu hören, dass seine Funktionalität nicht zu schwierig ist, um sich zurechtzufinden.

Für die Neugierigen unter uns, die „ss ” Abkürzung steht anscheinend für die Worte “Socket Statistics.”Ss ist mit dem iproute2-Paket gebündelt. Wenn Sie aus einem höchst ungewöhnlichen Grund ss nicht finden Auf Ihrem Debian-ähnlichen System können Sie es jederzeit installieren, indem Sie Folgendes ausführen:

sudo apt-get install iproute2

Ein Socket ist ein Port und eine IP-Adresse. Sie können sich einen Socket so vorstellen, dass er einen Dienst identifiziert, der an einer bestimmten Portnummer eines bestimmten Computers lauscht. Ein Socket-Paar besteht in diesem Fall aus einer Client-IP-Adresse, einer Client-Portnummer, einer Server-IP-Adresse und einer Server-Portnummer. Durch das Abfragen von Informationen per Socket können Sie daher schnell einen bestimmten Dienst ermitteln, der an einer bestimmten IP-Adresse ausgeführt wird.

Ich wäre nachlässig, Unix-Domain-Sockets nicht zu erwähnen. Unix-Domain-Sockets, die die Kommunikation zwischen Prozessen erleichtern, die auf einem lokalen Rechner ausgeführt werden, dienen einer Reihe nützlicher Zwecke, wie z. B. dem Ermöglichen der Berechtigungen, die für den Zugriff auf Ressourcen zwischen Prozessen erforderlich sind, die andernfalls nicht privilegiert wären.
Erste Schritte mit ss

In den meisten Szenarien wird ss von einem normalen Benutzerkonto ausgeführt. Auf meinem System befindet sich ss im Verzeichnis /usr/sbin/ss Verzeichnis. Ich beginne mit einigen grundlegenden Anwendungen für ss. Der folgende Befehl zeigt die Ausgabe für IPv4-Netzwerke:
# ss -4
Die verkürzte Ausgabe (Listing 1) zeigt die Kommunikation zwischen Client und Server. Beachten Sie, dass ein Client auch ein Server sein kann und umgekehrt, je nach Richtung des Informationsflusses.

Auflistung 1
Basic ss Output
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:37564 192.168.0.100:www
ESTAB 0 0 192.168.0.2:47592 192.168.0.156:smtp
ESTAB 0 0 192.168.0.2:ssh 192.168.0.49:64009

Ersetzen Sie die Option -4 durch -6, um Informationen zu IPv6-Verbindungen auszugeben.

Wie Sie in Listing 1 sehen können, ist 192.168.0.2 die IP-Adresse des lokalen Rechners, und das nützliche Dienstprogramm /etc/services hat einige Portnummern in Namen umgewandelt (wie etwa ssh, www und smtp).

Das ausgezeichnete ss bietet auch Informationen über TCP, UDP, lokale Unix-Domain-Sockets und Remote-Sockets. Wie ich später beschreiben werde, ist das, was ss außergewöhnlich leistungsfähig macht, seine Fähigkeit, mit dem Status von Verbindungen umzugehen.

Ich verwende ss oft, um abzufragen, welche Ports von auf dem Computer installierten Daemons geöffnet werden. Verwenden Sie die Option l, um nach lauschenden Ports zu suchen (Listing 2):

Auflistung 2

Listening Ports anzeigen
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:ssh *:*
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 *:sunrpc *:*
LISTEN 0 128 127.0.0.1:http *:*

# ss -l
Möglicherweise möchten Sie während Ihrer täglichen Systemverwaltungsroutine nach den Listening-Ports suchen, um sicherzustellen, dass unerwartete und potenziell unsichere Dienste nicht aktiviert bleiben. Oder Sie suchen nach weniger ausgefeilten Rootkits, die ihre offenen Ports möglicherweise nicht effektiv verbergen.

Einer der Befehle
lsof -i
netstat -tulpn

wird Ihnen helfen, herauszufinden, welche Prozesse (PIDs) Ihre Ports öffnen, sodass Sie sie bei Bedarf abschalten können.
Wenn Sie einfach den Befehl ss ohne Optionen ausführen, erhalten Sie eine Liste der aktuellen „Verbindungen“ ( Beachten Sie, dass dies eigentlich „Sockets“ sind), wie in Listing 3 gezeigt.

Auflistung 3
ss Schmucklos

# ss
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:37564 192.168.0.49:tcpmux
ESTAB 0 64 192.168.0.2:ssh 192.168.0.143:64009
ESTAB 0 0 192.168.0.2:47609 192.168.0.88:gopher

PIDs

Wenn Sie keinen Zugriff auf lsof haben und netstat nicht mögen (ich bin kein großer Fan), kann das Dienstprogramm super-duper ss auch über PIDs berichten, die für Ihre offenen Ports relevant sind. Um zu sehen, welche Prozesse Sockets direkt verwenden, fügen Sie einfach ein -p hinzu:
# ss -p
Eine Einschränkung ist, dass ich mich als root anmelden muss, um die erweiterten Informationen zu erhalten. Listing 4 zeigt ein Beispiel dafür, was zu erwarten ist.

Auflistung 4
ss -p
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.10.10.20:ssh 10.10.10.10:52918 users:(("sshd",31195,3),("sshd",31204,3))

Wenn Sie vom Anwendungsnamen, der in diesem Fall sshd ist, rückwärts arbeiten, können Sie die PIDs 31195 und 31204 sehen; 31204 gehört einem nicht privilegierten Benutzer (meinem Login-Benutzer), und 31195 scheint das Ergebnis der cleveren Rechtetrennung zu sein, die von sshd verwendet wird.

SSH wurde entwickelt, um die Wahrscheinlichkeit von Programmierfehlern zu minimieren, die sehr schwerwiegende systemische Probleme verursachen, indem der Zugriff eingeschränkt und der Dienst auf ein chrooted Jail für den netzwerkseitigen SSH-Prozess beschränkt wird. Um dieses Ziel zu erreichen, verwendet SSH zwei Prozesse. Der Root-eigene Prozess überwacht den Fortschritt des nicht privilegierten Prozesses, der eine zuvor ungenutzte UID und GID hat.
Looking Deeper

Sie können ss -s verwenden, um Statistiken darüber abzurufen, wie viele Sockets geöffnet sind und welche Protokolle sie verwenden (Listing 5).

Auflistung 5

ss -s
Total: 201 (kernel 218)
TCP: 6 (estab 2, closed 0,
orphaned 0, synrecv 0,
timewait 0/0), ports 5
Transport Total IP IPv6
* 218 - -
RAW 0 0 0
UDP 5 5 0
TCP 6 6 0
INET 11 1 0
FRAG 0 0 0

Es ist nicht der beste Vergleich, aber Sie könnten mit dem folgenden netstat-Befehl ein vage ähnliches Ergebnis erzielen:
# netstat -tan | grep -v "Proto" | grep -v "Active" | awk '{print $6}' | uniq -c
Es ist auf jeden Fall erwähnenswert, dass das Dienstprogramm super ss die Angewohnheit hat, andere Netzwerk-Tools in Benchmark-Tests zu übertreffen. Verglichen beispielsweise mit dem weit verbreiteten netstat liefert ss seine Ergebnisse sehr schnell. Denken Sie jedoch daran, dass ss nicht darauf ausgelegt ist, alle möglichen Fragen zu beantworten, sondern vielmehr die Unix-Philosophie widerspiegelt, dass jede Systemkomponente „eine Sache gut machen“ sollte. Erfahrene Benutzer kombinieren ss oft mit Tools wie netstat und beschneiden dann die Ausgabe mit Tools wie grep, awk und sed.

Wenn Sie beispielsweise sehen möchten, welche Anwendung einen bestimmten Port belegt, können Sie ss mit grep wie folgt verwenden:
# ss | grep 58620

Konkret werden

Sie können nur TCP-Sockets anzeigen mit:
# ss -t
Alternativ könnten Sie die Option –tcp ausschreiben. Erhöhen Sie die Detailebene mit dem Schalter -a (für „alle“):
# ss -t -a
Eine geringfügige Änderung dieses Befehls erzeugt eine Ausgabe, die UDP-, Raw- und Unix-Sockets enthält. Geben Sie für eine ausführliche Ansicht aller UDP-Sockets
# ss -u -a ein
und um alle Raw-Sockets anzuzeigen, geben Sie Folgendes ein:
# ss -w -a
Wenn Sie sich wirklich mehrere Bildschirme voller verblüffendem Text gönnen müssen, können Sie alle Unix-Domain-Sockets anzeigen lassen mit:
# ss -x -a

Ebenfalls in der scheinbar bodenlosen Werkzeugkiste des Dienstprogramms ss enthalten ist die Fähigkeit, nach DCCP-Sockets Ausschau zu halten; DCCP ist ein weniger gebräuchliches Netzwerkprotokoll, das die verbindungsorientierten, fehlerüberprüfenden Eigenschaften von TCP mit den rundsendeartigen Merkmalen von UDP hat. Das DCCP-Protokoll wird häufig für Medienstreaming verwendet. Suchen Sie mit diesem raffinierten kleinen Befehl nach DCCP-Verkehr:
# ss -d -a
Sie können auch den Status der Verbindungen zu Ihrem Computer überwachen, indem Sie die Detailebene mit der Option -e erweitern (Listing 6).

Auflistung 6
# ss -e
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:ssh 192.168.0.88:58302 timer:(keepalive,40min,0) ino:2184870 sk:ffff880138d26700
ESTAB 0 0 192.168.0.2:48246 192.1680.56:ntp timer:(keepalive,105min,0) ino:2187726 sk:ffff880138d2748

Listing 6 zeigt Timer-Optionen, die einen Einblick in den aktuellen Status aller Keepalives einer Verbindung bieten. Diese Funktion kann für Dienste wie HTTP oder SSH nützlich sein, die dazu neigen, Keepalives zu verwenden (siehe Kasten mit dem Titel „Keepalive Notes“). Listing 7 zeigt eine ähnliche Ausgabe mit dem Befehl netstat -to.

Keepalive-Notizen

Ein Keepalive-Paket hat im Allgemeinen ein TCP ACK, das mit einer Sequenznummer konfiguriert ist, die um eins kleiner ist als die aktuelle Nummer, die für die Verbindung verwendet wird. Jede Maschine, die einen Schubs von einem solchen Paket erhält, antwortet einfach mit der richtigen Sequenznummer und, Frankenstein-Scherz beiseite, verkündet, dass sie tatsächlich lebt.

Diese Pakettypen sind manchmal leer und haben im Allgemeinen drei zugeordnete Parameter. Der Wiederholungsparameter gibt an, wie oft ein Paket gesendet werden soll, bevor zu dem Schluss kommt, dass das andere Ende der Verbindung den Geist aufgegeben hat. Die Zeiteinstellung wird als Häufigkeit der Überprüfungen konfiguriert, und schließlich bestimmt das Intervall die Zeitdauer zwischen zwei gesendeten Paketen, wenn keine Antwort empfangen wird.

Innerhalb des Kernels können Sie diese Einstellungen ändern, indem Sie diese Werte in dem atemberaubenden Pseudo-Dateisystem bearbeiten, das als /proc bekannt und beliebt ist . Eine Datei ist in diesem Fall /proc/sys/net/ipv4/tcp_keepalive_time , und Sie können es wie folgt bearbeiten:
# echo 75 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 9 > /proc/sys/net/ipv4/tcp_keepalive_probes

Auflistung 7
# netstat -to
Proto Recv-Q Send-Q Local Address Foreign Address State Timer
tcp 0 0 host-one:48340 host-four:45358 ESTABLISHED keepalive (6830.00/0/0)
tcp 0 64 host-two:ssh host-three:58302 ESTABLISHED on (0.45/0/0)

Mit Netstat können Sie auch den vielseitigen Watch-Befehl voranstellen und Echtzeit-Updates sehen:
# watch netstat -to
Es ist knapp, aber ich muss zugeben, dass netstat in diesem Fall seine Ausgabe nett und prägnant hält und genauso gut aussieht wie die Ausgabe des Dienstprogramms ss.
Quelle und Ziel
Die Mit dem folgenden Befehl können Sie Informationen zu allen Sockets mit einem Ziel (dst) finden, das auf eine bestimmte IP-Adresse ausgerichtet ist:
# ss dst 192.168.0.1
Umgekehrt ist es kein großer Sprung zu bedenken, dass die Verwendung der src-Option Informationen auf der Quellseite des Sockets preisgibt:
# ss src 192.168.0.2
Praktisch, oder? Diese Syntax ist leicht zu merken, wenn Sie in Eile sind, und rettet den Tag, wenn Ihnen während eines Ausfalls ein gereizter Chef im Nacken sitzt.
Sie können sogar CIDR-Netzwerknotationen im Adress-Callout verwenden:
# ss dst 192.168.0.1/24
Fügen Sie am Ende einen Doppelpunkt hinzu, und Sie können gleichzeitig nach einem sehr spezifischen Port und einem sehr breiten IP-Adressbereich suchen:
# 192.168.0.1/24:53
Ich schätze diese Funktionalität sehr in Situationen mit viel Verkehr und zahlreichen offenen Ports. Mit dieser Option können Sie beispielsweise alle DNS-bezogenen Aktivitäten in einem gesamten /24-Subnetz mit einem einfachen ss-Befehl überwachen.
Reguläre Ausdrücke
Zusätzlich zu DNS-Namen und IP-Adressen können Sie auch reguläre Ausdrücke verwenden (regex) Operatoren in Ihrer ss-Syntax. Sehen Sie sich dieses kleine Nugget an:
# ss dport != :53
Dieser Befehl schließt den Ziel-dport auf dem DNS-Port 53 aus.
Wenn Sie ein gewisses Maß an Verstand bewahren und vermeiden möchten, nur auf Zahlen zu schauen, können Sie Ports auch in das Format /etc/services übersetzen:
# ss 192.168.0.1:http
Wenn Sie bereit sind, beeindruckt zu sein, können Sie auch größer als, kleiner als, kleiner als oder gleich usw. einfügen:
# ss dport > :53
Andere Sonderzeichen sind ebenfalls möglich, obwohl manchmal Sonderzeichen maskiert werden müssen. Alphabetische Äquivalente wie eq (gleich), ne (ungleich), gt (größer als) und le (kleiner als) funktionieren ebenfalls. Ihr Kilometerstand kann je nach Version des Dienstprogramms ss variieren.

Verbindungsstatus

Sie können die –Abfrage verwenden oder -A Abfragezusatz zum Sichern einer Sockets-Tabelle. Das Zauberwort Autobound sucht nach flüchtigen Ports, an die sich Sockets angeschlossen haben. Bereiten Sie sich selbst auf einem leisen System auf enorme Leistung vor. Eine gekürzte Version der Ausgabe ist in Listing 8 zu sehen.

Auflistung 8

# ss -a -A all autobound
01 u_str ESTAB 0 0 * 11984 * 0
02 u_str ESTAB 0 0 * 11996 * 0
03 u_str ESTAB 0 0 * 12003 * 0
04 u_str ESTAB 0 0 * 12005 * 0
05 u_str ESTAB 0 0 * 12010 * 0

Sie können auch nach TCP-Status filtern; Beispielsweise filtert der folgende Befehl nach sFTP-Datenverkehr:
# ss state connected dport = :sftp
Alles, was in Bezug auf den sFTP-Port als „aktuell“ behandelt wird, wird sofort angezeigt.
Sie können den Befehl mit einem booleschen Operator etwas komplizierter machen:
# ss ( sport = :ftp or dport = :http )
Sie können sogar ss verwenden, um Verbindungen zu finden, die sich in einem bestimmten TCP-Zustand befinden, einschließlich den Verbindungen „Established“, „Syn-Sent“, „Syn-Recv“, „Fin-Wait-1“, „Fin-Wait-2“, „Time-Wait“, „Closed“, close-wait, last-ack, listen und close.

Mit den TCP-Statusparametern können Sie einige sehr leistungsfähige Abfragen durchführen. Wenn Sie beispielsweise nach FIN-WAIT-1-Zuständen suchen, können Sie feststellen, ob Ihre Anwendung ihre Seite einer Verbindung geschlossen hat, aber ein Remote-Host seine Seite nicht geschlossen hat, wodurch die wertvollen Ports Ihrer Maschine belegt werden:

ss -o state fin-wait-1 '( sport = \
:ftp or sport = :http )' \
dst 10.10.3.3/24:22

So endet es auch

Die ss Utility ist ein leistungsstarkes Tool, mit dem Sie Ihr Netzwerk detailliert abfragen können. Ss ist sowohl für manuelle als auch für automatisierte Abfragen extrem leistungsstark und erfordert nur sehr wenige Tastenanschläge, um allgemeine Befehle auszuführen.

Dieses winzige, aber heldenhafte Tool lässt die Muskeln jedes Systemadministrators spielen. Wenn Sie die Leistung Ihres Admin-Toolkits steigern möchten, versuchen Sie, einige der komplexeren Befehle in Ihrer täglichen Arbeit zu üben.


Linux
  1. Beginnen Sie mit der Verwendung von systemd als Tool zur Fehlerbehebung

  2. Entwickeln Sie Netzwerkanwendungen für ESP8266 mit Mongoose unter Linux

  3. 10 Linux-Befehle für die Netzwerkdiagnose

  4. 6 Fähigkeiten zur Fehlerbehebung für Ansible-Playbooks

  5. Teamviewer-ähnliches Tool für ssh?

Ein Leitfaden für Anfänger zur Netzwerkfehlerbehebung unter Linux

Verwenden von ifstat für Linux-Netzwerkstatistiken

Tipps zur Verwendung von tmux

Tipps zur Verwendung des Bildschirms

Verwenden von Xdg-open für den Zugriff auf das Netzwerk mit dem normalen Explorer?

Top 10 der besten Penetrationstest-Tools für Linux