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.