Cum să utilizați comanda ss pe Linux

Comanda ss reprezintă o alternativă modernă la clasicul netstat. Ea oferă utilizatorilor de Linux posibilitatea de a analiza statisticile referitoare la conexiunile de rețea. În acest material, vei descoperi cum să utilizezi eficient acest instrument valoros.

Comparație: ss vs. netstat

Înlocuind comanda netstat, care este considerată învechită, ss furnizează informații amănunțite despre interacțiunea computerului tău cu alte sisteme, rețele și servicii.

ss expune statistici pentru diverse protocoale, precum Protocolul de Control al Transmisiei (TCP), Protocolul Datagramelor Utilizator (UDP), socket-uri Unix (interproces) și socket-uri brute. Socket-urile brute funcționează la nivelul rețelei OSI, implicând gestionarea antetelor TCP și UDP de către software-ul aplicației, nu de stratul de transport. Protocolul de Mesaje de Control Internet (ICMP) și utilitarul ping folosesc socket-uri brute.

Utilizarea comenzii ss

Comanda ss este inclusă implicit în orice distribuție Linux actualizată, nefiind necesară instalarea separată. Totuși, este important de menționat că rezultatul acestei comenzi poate fi destul de extins, uneori depășind 600 de linii, iar informațiile afișate sunt detaliate.

Din acest motiv, vom include exemple textuale ale rezultatelor obținute, deoarece capturile de ecran nu ar putea reda în totalitate cantitatea de informații. Am adaptat aceste rezultate pentru a le face mai ușor de parcurs.

Vizualizarea conexiunilor de rețea

Comanda ss, folosită fără opțiuni suplimentare, afișează socket-urile care nu se află în starea de ascultare. Cu alte cuvinte, sunt listate acele socket-uri care nu așteaptă conexiuni noi.

Pentru a vizualiza aceste informații, introdu comanda:

ss

Netid State Recv-Q Send-Q          Local Address:Port Peer Address:Port   Process
u_str ESTAB 0      0                           * 41826           * 41827
u_str ESTAB 0      0 /run/systemd/journal/stdout 35689           * 35688
u_str ESTAB 0      0                           * 35550           * 35551
...
u_str ESTAB 0      0                           * 38127           * 38128
u_str ESTAB 0      0 /run/dbus/system_bus_socket 21243           * 21242
u_str ESTAB 0      0                           * 19039           * 19040
u_str ESTAB 0      0 /run/systemd/journal/stdout 18887           * 18885 
u_str ESTAB 0      0 /run/dbus/system_bus_socket 19273           * 17306
icmp6 UNCONN 0     0                           *:ipv6-icmp       *:*
udp   ESTAB 0      0         192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps

Semnificația coloanelor este următoarea:

Netid: specifică tipul de socket. În exemplul dat, apar „u_str” (un flux Unix), „udp” și „icmp6” (un socket IP versiunea 6 ICMP). Pentru mai multe informații despre diferitele tipuri de socket-uri Linux, consultă manualul.

State: indică starea în care se află socket-ul.

Recv-Q: arată numărul pachetelor primite.

Send-Q: arată numărul pachetelor trimise.

Adresă locală: Port: afișează adresa locală și portul (sau valori echivalente în cazul socket-urilor Unix).

Peer Address:Port: prezintă adresa și portul de la distanță (sau valori echivalente pentru socket-urile Unix).

În general, pentru socket-urile UDP, coloana „State” rămâne goală. Pentru socket-urile TCP, această coloană poate avea una dintre următoarele valori:

LISTEN: specifică faptul că, în partea serverului, socket-ul așteaptă o cerere de conectare.

SYN-SENT: indică faptul că, în partea clientului, socket-ul a inițiat o cerere de conectare și așteaptă confirmarea.

SYN-RECEIVED: specifică faptul că, în partea serverului, socket-ul a acceptat o cerere de conectare și așteaptă confirmarea.

ESTABLISHED: arată că o conexiune activă este stabilită între server și client, permițând transferul de date.

FIN-WAIT-1: indică că socket-ul așteaptă fie o cerere de închidere a conexiunii de la distanță, fie o confirmare a unei cereri trimise anterior.

FIN-WAIT-2: specifică faptul că socket-ul așteaptă o cerere de închidere a conexiunii de la distanță.

CLOSE-WAIT: arată că socket-ul așteaptă o cerere de închidere a conexiunii de la utilizatorul local.

CLOSING: indică faptul că socket-ul așteaptă o confirmare a cererii de închidere a conexiunii de la distanță.

LAST-ACK: arată că socket-ul așteaptă o confirmare a cererii de închidere trimise către socket-ul de la distanță.

TIME-WAIT: indică faptul că socket-ul a trimis o confirmare pentru cererea de închidere de la distanță și așteaptă să se asigure că aceasta a fost primită.

CLOSED: specifică faptul că nu există nicio conexiune activă și socket-ul a fost închis.

Vizualizarea socket-urilor de ascultare

Pentru a vedea socket-urile care ascultă conexiuni noi, utilizăm opțiunea -l (listen), astfel:

ss -l

Netid State  Recv-Q Send-Q               Local Address:Port                  Peer Address:Port Process 
nl    UNCONN 0      0                             rtnl:NetworkManager/535                * 
nl    UNCONN 0      0                             rtnl:evolution-addre/2987              * 
...
u_str LISTEN 0      4096          /run/systemd/private 13349                            * 0 
u_seq LISTEN 0      4096             /run/udev/control 13376                            * 0 
u_str LISTEN 0      4096             /tmp/.X11-unix/X0 33071                            * 0 
u_dgr UNCONN 0      0      /run/systemd/journal/syslog 13360                            * 0 
u_str LISTEN 0      4096    /run/systemd/fsck.progress 13362                            * 0 
u_dgr UNCONN 0      0    /run/user/1000/systemd/notify 32303                            * 0

Toate aceste socket-uri sunt neconectate și ascultă. „rtnl” semnifică rutarea netlink, folosită pentru transferul informațiilor între nucleul sistemului de operare și aplicațiile utilizator.

Vizualizarea tuturor socket-urilor

Pentru a lista toate socket-urile, indiferent de starea lor, se utilizează opțiunea -a (all):

ss -a

Netid State  Recv-Q Send-Q    Local Address:Port                 Peer Address:Port    Process 
nl    UNCONN 0      0                  rtnl:NetworkManager/535               * 
nl    UNCONN 0      0                  rtnl:evolution-addre/2987 * 
...
u_str LISTEN 0      100       public/showq 23222                            * 0 
u_str LISTEN 0      100      private/error 23225                            * 0 
u_str LISTEN 0      100      private/retry 23228                            * 0 
...
udp   UNCONN 0      0             0.0.0.0:631                         0.0.0.0:* 
udp   UNCONN 0      0             0.0.0.0:mdns                        0.0.0.0:* 
...
tcp   LISTEN 0      128              [::]:ssh                            [::]:* 
tcp   LISTEN 0      5               [::1]:ipp                            [::]:* 
tcp   LISTEN 0      100             [::1]:smtp                           [::]:*

Rezultatul conține toate socket-urile, indiferent de starea lor actuală.

Vizualizarea socket-urilor TCP

Pentru a filtra și afișa doar socket-urile care utilizează protocolul TCP, se folosește opțiunea -t (TCP):

ss -a -t

Vizualizarea socket-urilor UDP

Similar, opțiunea -u (UDP) filtrează rezultatele pentru a afișa doar socket-urile care utilizează protocolul UDP:

ss -a -u

State  Recv-Q Send-Q    Local Address:Port Peer   Address:Port Process 
UNCONN 0      0               0.0.0.0:631         0.0.0.0:* 
UNCONN 0      0               0.0.0.0:mdns        0.0.0.0:* 
UNCONN 0      0               0.0.0.0:60734       0.0.0.0:* 
UNCONN 0      0         127.0.0.53%lo:domain      0.0.0.0:* 
ESTAB 0       0    192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps 
UNCONN 0      0                   [::]:mdns          [::]:* 
UNCONN 0      0                   [::]:51193         [::]:*

Vizualizarea socket-urilor Unix

Pentru a afișa doar socket-urile Unix, se include opțiunea -x (Unix), după cum urmează:

ss -a -x

Netid State Recv-Q Send-Q               Local Address:Port  Peer Address:Port    Process 
u_str ESTAB 0      0                                * 41826            * 41827 
u_str ESTAB 0      0                                * 23183            * 23184 
u_str ESTAB 28     0               @/tmp/.X11-unix/X0 52640            * 52639 
...
u_str ESTAB 0      0      /run/systemd/journal/stdout 18887            * 18885 
u_str ESTAB 0      0      /run/dbus/system_bus_socket 19273            * 17306

Vizualizarea socket-urilor brute

Filtrul pentru socket-urile brute este activat prin opțiunea -w (raw):

ss -a -w

Vizualizarea socket-urilor IPv4

Socket-urile care utilizează protocolul TCP/IP versiunea 4 pot fi listate prin folosirea opțiunii -4 (IPV4):

ss -a -4

Vizualizarea socket-urilor IPv6

Pentru a activa filtrul pentru socket-urile care folosesc protocolul IP versiunea 6, se utilizează opțiunea -6 (IPV6), după cum urmează:

ss -a -6

Vizualizarea socket-urilor după starea lor

Socket-urile pot fi listate în funcție de starea în care se află, cu ajutorul opțiunii state. Această opțiune funcționează pentru stări ca established (stabilite), listening (ascultare) sau closed (închise). Vom folosi și opțiunea de rezolvare (-r), care încearcă să asocieze adresele de rețea cu nume și porturile cu protocoale.

Comanda următoare va căuta conexiunile TCP stabilite, iar ss va încerca să rezolve numele asociate:

ss -t -r state established

Sunt afișate patru conexiuni aflate în starea „established”. Numele de gazdă, „ubuntu20-04”, a fost rezolvat, iar „ssh” este afișat în locul lui „22” pentru conexiunea SSH de pe a doua linie.

Putem repeta acest lucru pentru a căuta socket-uri în starea de ascultare:

ss -t -r state listening

Recv-Q Send-Q Local Address:Port   Peer Address:Port Process 
0      128        localhost:5939        0.0.0.0:* 
0      4096    localhost%lo:domain      0.0.0.0:* 
0      128          0.0.0.0:ssh         0.0.0.0:* 
0      5          localhost:ipp         0.0.0.0:* 
0      100        localhost:smtp        0.0.0.0:* 
0      128             [::]:ssh         [::]:* 
0      5      ip6-localhost:ipp         [::]:* 
0      100    ip6-localhost:smtp        [::]:*

Vizualizarea socket-urilor după protocol

Socket-urile pot fi listate în funcție de protocolul utilizat cu opțiunile dport și sport, care se referă la porturile de destinație și, respectiv, sursă.

Introducem următoarea comandă pentru a lista socket-urile care folosesc protocolul HTTPS pe o conexiune stabilită (reține spațiul dintre paranteze):

ss -a state established ‘( dport = :https or sport = :https )’

Se poate folosi numele protocolului sau portul asociat în mod obișnuit cu acesta. Portul standard pentru Shell Securizat (SSH) este portul 22.

Vom utiliza numele protocolului într-o singură comandă și apoi vom repeta folosind numărul portului:

ss -a ‘( dport = :ssh or sport = :ssh )’
ss -a ‘( dport = :22 or sport = :22 )’

După cum era de așteptat, obținem aceleași rezultate în ambele cazuri.

Vizualizarea conexiunilor către o anumită adresă IP

Cu opțiunea dst (destinație), putem lista conexiunile către o anumită adresă IP de destinație.

Introducem următoarea comandă:

ss -a dst 192.168.4.25

Identificarea proceselor

Pentru a vizualiza ce procese folosesc anumite socket-uri, se utilizează opțiunea de procese (-p), după cum urmează (reține că ai nevoie de drepturi sudo):

sudo ss -t -p

State Recv-Q Send-Q  Local Address:Port   Peer Address:Port  Process 
ESTAB 0      0       192.168.4.28:57650  54.218.19.119:https users:(("firefox",pid=3378,fd=151)) 
ESTAB 0      0       192.168.4.28:ssh     192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))

Acest lucru ne arată că cele două conexiuni stabilite pe socket-urile TCP sunt utilizate de demonul SSH și de browserul Firefox.

Un înlocuitor valoros

Comanda ss pune la dispoziție aceleași informații ca și netstat, dar într-un mod mai eficient și mai accesibil. Poți consulta pagina de manual pentru mai multe informații și opțiuni.