ss - Socket-Statistiken
In einem früheren Tutorial haben wir gesehen, wie man den Befehl netstat verwendet, um Details über die Netzwerk-/Socket-Verbindungen zu erhalten. Der Befehl netstat ist jedoch seit langem veraltet und wurde durch den Befehl ss aus der iproute-Suite von Tools ersetzt.
Der Befehl ss kann Details zu Netzwerkverbindungen mit mehr Informationen anzeigen als der Befehl netstat und ist schneller. Der Befehl netstat liest verschiedene /proc-Dateien, um Informationen zu sammeln. Dieser Ansatz ist jedoch langsamer, wenn viele Verbindungen anzuzeigen sind.
Der Befehl ss bezieht seine Informationen direkt aus dem Kernel-Space. Die mit den ss-Befehlen verwendeten Optionen sind denen von netstat sehr ähnlich, was es zu einem einfachen Ersatz macht.
Daher werden wir in diesem Tutorial einige Beispiele dafür sehen, wie man den Befehl ss verwendet, um die Netzwerkverbindungen und Socket-Statistiken zu überprüfen.
1. Alle Verbindungen auflisten
Der einfachste Befehl ist, alle Verbindungen aufzulisten.
$ ss | less Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 * 15545 * 15544 u_str ESTAB 0 0 * 12240 * 12241 u_str ESTAB 0 0 @/tmp/dbus-2hQdRvvg49 12726 * 12159 u_str ESTAB 0 0 * 11808 * 11256 u_str ESTAB 0 0 * 15204 * 15205 .....
Wir leiten die Ausgabe an less weiter, damit die Ausgabe scrollbar ist. Die Ausgabe enthält alle TCP-, UDP- und Unix-Socket-Verbindungsdetails.
2. TCP-, UDP- oder Unix-Verbindungen herausfiltern
Um nur TCP-, UDP- oder Unix-Verbindungen anzuzeigen, verwenden Sie die Option t, u oder x.
$ ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:http ESTAB 0 0 192.168.1.2:43622 199.59.149.201:https ESTAB 0 0 192.168.1.2:33141 83.170.73.249:ircd ESTAB 0 0 192.168.1.2:54028 74.125.135.125:xmpp-client
$ ss -t OR $ ss -A tcp
Standardmäßig meldet die Option "t" allein nur die Verbindungen, die "hergestellt" oder VERBUNDEN sind. Sie meldet nicht die TCP-Sockets, die "LISTENING" sind. Verwenden Sie die Option "-a" zusammen mit t, um zu melden sie alle auf einmal.
Alle UDP-Verbindungen auflisten
$ ss -ua State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 192.168.1.2:48268 *:* UNCONN 0 0 192.168.1.2:56575 *:* UNCONN 0 0 *:40309 *:* UNCONN 0 0 192.168.1.2:56879 *:* UNCONN 0 0 *:49014 *:* UNCONN 0 0 192.168.1.2:53124 *:* UNCONN 0 0 127.0.1.1:domain *:*
$ ss -a -A udp
The a option tells ss to report both "CONNECTED" and "LISTENING" sockets. Since UDP is a connection-less protocol, just "ss -u" will not report anything in most cases. Therefore we use the "a" option report all UDP connections (connected and listening).
Verwenden Sie in ähnlicher Weise die Option x, um alle Unix-Socket-Verbindungen aufzulisten.
3. Hostnamen nicht auflösen
Um die Ausgabe schneller zu erhalten, verwenden Sie die Option "n", um zu verhindern, dass ss IP-Adressen in Hostnamen auflöst. Dies verhindert jedoch auch die Auflösung von Portnummern.
$ ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80 ESTAB 0 0 192.168.1.2:51350 74.125.200.84:443 ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667 ESTAB 0 0 192.168.1.2:54028 74.125.135.125:5222 ESTAB 0 0 192.168.1.2:48156 66.196.120.44:5050
4. Nur Listening Sockets anzeigen
Dadurch werden alle Listening-Sockets aufgelistet. Beispielsweise öffnet der Apache-Webserver eine Socket-Verbindung auf Port 80, um auf eingehende Verbindungen zu warten.
$ ss -ltn State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 5 127.0.1.1:53 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 128 ::1:631 :::*
Der obige Befehl listet alle „lauschenden“ „tcp“-Verbindungen auf. Die Option n deaktiviert die Hostnamenauflösung der IP-Adressen, wodurch die Ausgabe schneller wird.
Um alle lauschenden UDP-Verbindungen aufzulisten, ersetzen Sie t durch u
$ ss -lun State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.1.1:53 *:* UNCONN 0 0 *:68 *:* UNCONN 0 0 192.168.1.2:123 *:* UNCONN 0 0 127.0.0.1:123 *:* UNCONN 0 0 *:123 *:* UNCONN 0 0 *:5353 *:* UNCONN 0 0 *:47799 *:* UNCONN 0 0 *:25322 *:* UNCONN 0 0 :::54310 :::* .....
5. Prozessnamen und PID ausgeben
Um den Prozessnamen/PID auszugeben, dem die Verbindung gehört, verwenden Sie die p-Option
$ ss -ltp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 127.0.0.1:9050 *:* LISTEN 0 128 *:90 *:* LISTEN 0 128 *:db-lsp *:* users:(("dropbox",3566,32)) LISTEN 0 5 127.0.0.1:6600 *:* LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0))
In der obigen Ausgabe enthält die letzte Spalte den Prozessnamen und die PID. In diesem Beispiel ist dnsmasq der Prozessname und 1299 die PID.
$ sudo ss -ltp [sudo] password for enlightened: State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",2051,12)) LISTEN 0 128 *:90 *:* users:(("nginx",1701,6),("nginx",1700,6),("nginx",1699,6),("nginx",1697,6),("nginx",1696,6)) LISTEN 0 5 127.0.0.1:6600 *:* users:(("mpd",2392,5)) LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0),("php5-fpm",1616,7)) LISTEN 0 16 *:2633 *:* users:(("oned",1853,16)) LISTEN 0 50 127.0.0.1:mysql *:* users:(("mysqld",1095,10)) LISTEN 0 5 127.0.1.1:domain *:* users:(("dnsmasq",1347,5)) LISTEN 0 32 *:ftp *:* users:(("vsftpd",1051,3)) LISTEN 0 128 *:ssh *:* users:(("sshd",1015,3)) LISTEN 0 128 127.0.0.1:ipp *:* users:(("cupsd",688,11)) LISTEN 0 128 :::http :::* users:(("apache2",5322,4),("apache2",5321,4),("apache2",5317,4),("apache2",5316,4),("apache2",5313,4),("apache2",2505,4)) LISTEN 0 128 :::ssh :::* users:(("sshd",1015,4)) LISTEN 0 128 ::1:ipp :::* users:(("cupsd",688,10))
6. Zusammenfassende Statistiken drucken
Die Option s druckt die Statistik.
$ ss -s Total: 526 (kernel 0) TCP: 10 (estab 7, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 0 - - RAW 0 0 0 UDP 15 9 6 TCP 10 9 1 INET 25 18 7 FRAG 0 0 0
7. Timer-Informationen anzeigen
Mit der Option '-o' würden die Zeitinformationen jeder Verbindung angezeigt. Die Timer-Informationen sagen, wie lange mit
$ ss -tn -o State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80 ESTAB 0 0 192.168.1.2:36335 204.144.140.26:80 timer:(keepalive,26sec,0) ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667 ESTAB 0 0 192.168.1.2:58857 74.121.141.84:80 timer:(keepalive,23sec,0) ESTAB 0 0 192.168.1.2:42794 173.194.40.239:80 timer:(keepalive,32sec,0)
8. Nur IPv4- oder IPv6-Socket-Verbindungen anzeigen
Um nur IPv4-Socket-Verbindungen anzuzeigen, verwenden Sie die Option „-finet“ oder „-4“.
$ ss -tl -f inet State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 127.0.0.1:9050 *:* LISTEN 0 128 *:90 *:* LISTEN 0 128 *:db-lsp *:* LISTEN 0 5 127.0.0.1:6600 *:*
Um nur IPv6-Verbindungen anzuzeigen, verwenden Sie die Option „-finet6“ oder „-6“.
$ ss -tl6 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 ::1:smtp :::* LISTEN 0 128 :::12865 :::* LISTEN 0 128 :::http :::* LISTEN 0 128 :::ssh :::* LISTEN 0 128 ::1:ipp :::*
9. Verbindungen nach TCP-Status filtern
Der Befehl ss unterstützt Filter, die verwendet werden können, um nur bestimmte Verbindungen anzuzeigen. Der Filterausdruck sollte nach allen Optionen angehängt werden. Der Befehl ss akzeptiert Filter im folgenden Format.
$ ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]
Hier sind nun einige Beispiele, wie Socket-Verbindungen nach Socket-Status gefiltert werden können.
Um alle Ipv4-TCP-Sockets anzuzeigen, die sich im Status "verbunden" befinden.
$ ss -t4 state established Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.2:54436 165.193.246.23:https 0 0 192.168.1.2:43386 173.194.72.125:xmpp-client 0 0 192.168.1.2:38355 199.59.150.46:https 0 0 192.168.1.2:56198 108.160.162.37:http
Anzeige von Sockets mit Status time-wait
$ ss -t4 state time-wait Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.2:42261 199.59.150.39:https 0 0 127.0.0.1:43541 127.0.0.1:2633
Der Status kann einer der folgenden sein
1. established 2. syn-sent 3. syn-recv 4. fin-wait-1 5. fin-wait-2 6. time-wait 7. closed 8. close-wait 9. last-ack 10. closing 11. all - All of the above states 12. connected - All the states except for listen and closed 13. synchronized - All the connected states except for syn-sent 14. bucket - Show states, which are maintained as minisockets, i.e. time-wait and syn-recv. 15. big - Opposite to bucket state.
Beachten Sie, dass viele Zustände wie syn-sent, syn-recv die meiste Zeit keine Sockets anzeigen würden, da Sockets für eine sehr kurze Zeit in solchen Zuständen bleiben. Es wäre ideal, den Watch-Befehl zu verwenden, um solche Socket-Zustände in Echtzeit zu erkennen.
Hier ist ein Beispiel
$ watch -n 1 "ss -t4 state syn-sent"
Nachdem Sie den obigen Befehl ausgeführt haben, versuchen Sie, eine Website in einem Browser zu öffnen oder etwas von einer URL herunterzuladen. Sie sollten sofort Socket-Verbindungen in der Ausgabe sehen, aber nur für eine sehr kurze Zeit.
Every 1.0s: ss -t4 state syn-sent Tue Apr 1 10:07:33 2014 Recv-Q Send-Q Local Address:Port Peer Address:Port 0 1 192.168.1.2:55089 202.79.210.121:https 0 1 192.168.1.2:33733 203.84.220.80:https 0 1 192.168.1.2:36240 106.10.198.33:https
10. Verbindungen nach Adresse und Portnummer filtern
Abgesehen von den TCP-Socket-Zuständen unterstützt der Befehl ss auch das Filtern basierend auf Adresse und Portnummer des Sockets. Die folgenden Beispiele demonstrieren dies.
Alle Socket-Verbindungen mit Quell- oder Zielport von ssh anzeigen.
$ ss -at '( dport = :ssh or sport = :ssh )' State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:ssh *:* LISTEN 0 128 :::ssh :::*
Sockets mit Zielport 443 oder 80
$ ss -nt '( dst :443 or dst :80 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:58844 199.59.148.82:443 ESTAB 0 0 192.168.1.2:55320 165.193.246.23:443 ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80 ESTAB 0 0 192.168.1.2:54889 192.241.177.148:443 ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80 ESTAB 0 0 192.168.1.2:33440 38.127.167.38:443
Die folgende Syntax würde auch funktionieren
$ ss -nt dst :443 or dst :80
Weitere Beispiele
# Filter by address $ ss -nt dst 74.125.236.178 # CIDR notation is also supported $ ss -nt dst 74.125.236.178/16 # Address and Port combined $ ss -nt dst 74.125.236.178:80
Ports können auch mit dport/sport-Optionen gefiltert werden. Portnummern muss ein ":" vorangestellt werden.
$ ss -nt dport = :80 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80 ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80 ESTAB 0 0 192.168.1.2:55043 74.125.236.178:80
Das obige ist dasselbe wie> ss -nt dst :80
Einige weitere Filterbeispiele
# source address is 127.0.0.1 and source port is greater than 5000 $ ss -nt src 127.0.0.1 sport gt :5000 # local smtp (port 25) sockets $ sudo ss -ntlp sport eq :smtp # port numbers greater than 25 $ sudo ss -nt sport gt :1024 # sockets with remote ports less than 100 $ sudo ss -nt dport \< :100 # connections to remote port 80 $ sudo ss -nt state connected dport = :80
Die folgenden Operatoren werden beim Vergleich von Portnummern unterstützt
<= or le : Less than or equal to port >= or ge : Greater than or equal to port == or eq : Equal to port != or ne : Not equal to port < or gt : Less than to port > or lt : Greater than to port
Zusammenfassung
Die obigen Beispiele decken das meiste ab, was der Befehl ss unterstützt. Weitere Informationen finden Sie auf den Manpages.
Die Dokumentation der Filtersyntax befindet sich im Paket iproute2-doc, das auf Debian/Ubuntu-Systemen installiert werden kann
$ sudo apt-get install iproute2-doc
Die Datei /usr/share/doc/iproute2-doc/ss.html enthält Details über die ss-Befehlsfiltersyntax.