Jak používat příkaz ss v systému Linux

Photo of author

By etechblogcz

Příkaz ss představuje moderní alternativu k tradičnímu nástroji netstat. V operačním systému Linux ho lze využít ke sledování statistik o síťových spojeních. Následující text vám ukáže, jak tento užitečný nástroj používat.

Příkaz ss: Nová generace oproti netstatu

ss přichází jako vylepšená náhrada za zastaralý příkaz netstat. Poskytuje detailní pohled na komunikaci vašeho počítače s ostatními zařízeními, sítěmi a službami. Umožňuje monitorovat statistiky pro Transmission Control Protocol (TCP), User Datagram Protocol (UDP), Unixové sokety (pro meziprocesovou komunikaci) a také tzv. „raw sockets“ (nezpracované sokety). Raw sockets pracují na síťové vrstvě OSI modelu, což znamená, že hlavičky TCP a UDP musí zpracovávat samotné aplikace, nikoli transportní vrstva. Zprávy Internet Control Message Protocol (ICMP) a nástroj ping využívají právě raw sokety.

Používání příkazu ss

ss je standardní součástí většiny současných distribucí Linuxu, takže není potřeba ho instalovat. Výstup příkazu však může být velmi obsáhlý, někdy i přes 600 řádků, a také poměrně široký.

Z tohoto důvodu jsme pro lepší čitelnost zahrnuli textové ukázky výstupu, jelikož by se celý výpis nevešel na jeden snímek obrazovky. Pro názornost jsme je upravili a zkrátili.

Zobrazení síťových spojení

Spuštění příkazu ss bez dalších parametrů vypíše sokety, které nejsou v režimu naslouchání. Jinými slovy, zobrazí se sokety, které nečekají na nové připojení.

Zadejte do terminálu:

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

Význam jednotlivých sloupců:

Netid: Typ soketu. V tomto příkladu se objevují „u_str“ (unixový stream), „udp“ a „icmp6“ (ICMP soket IP verze 6). Další informace o typech soketů v Linuxu lze nalézt v manuálových stránkách, například zde: Typy Linuxových soketů.
Stav: Aktuální stav soketu.
Recv-Q: Počet přijatých paketů.
Send-Q: Počet odeslaných paketů.
Local Address:Port: Lokální adresa a port (nebo odpovídající hodnoty pro Unixové sokety).
Peer Address:Port: Vzdálená adresa a port (nebo odpovídající hodnoty pro Unixové sokety).

U UDP soketů bývá sloupec „Stav“ obvykle prázdný. U TCP soketů se může objevit jeden z následujících stavů:

  • LISTEN: Pouze na straně serveru. Soket čeká na příchozí požadavek na připojení.
  • SYN-SENT: Pouze na straně klienta. Klient odeslal požadavek na připojení a čeká na jeho potvrzení.
  • SYN-RECEIVED: Pouze na straně serveru. Server obdržel požadavek na připojení a nyní čeká na potvrzení.
  • ESTABLISHED: Stav na serveru i klientu. Navázané funkční spojení, data mohou být přenášena oběma směry.
  • FIN-WAIT-1: Server i klient. Soket čeká na požadavek na ukončení spojení z druhé strany, nebo na potvrzení ukončení, které odeslal sám.
  • FIN-WAIT-2: Server i klient. Soket čeká na požadavek na ukončení spojení z druhé strany.
  • CLOSE-WAIT: Server i klient. Soket čeká na požadavek na ukončení spojení od lokálního uživatele.
  • CLOSING: Server i klient. Soket čeká na potvrzení požadavku na ukončení spojení z protější strany.
  • LAST-ACK: Server i klient. Soket čeká na potvrzení ukončení spojení, které odeslal protější straně.
  • TIME-WAIT: Server i klient. Soket odeslal potvrzení o přijetí ukončení spojení a čeká, aby se ujistil, že i druhá strana potvrzení obdržela.
  • CLOSED: Spojení neexistuje, soket je ukončený.

Zobrazení naslouchajících soketů

Pro zobrazení naslouchajících soketů použijeme volbu -l (listen):

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

Všechny tyto sokety jsou neaktivní a naslouchají na příchozí spojení. „rtnl“ značí routing netlink, který se používá pro přenos informací mezi jádrem a uživatelskými procesy.

Zobrazení všech soketů

Pro zobrazení všech soketů (bez ohledu na stav) použijte volbu -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                           [::]:*

Tento výpis obsahuje všechny sokety, bez ohledu na jejich stav.

Zobrazení TCP soketů

Pro filtrování a zobrazení pouze TCP soketů použijeme volbu -t (TCP):

ss -a -t

Zobrazení UDP soketů

Volba -u (UDP) funguje obdobně, ale zobrazí pouze UDP sokety:

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         [::]:*

Zobrazení Unixových soketů

Pro zobrazení pouze Unixových soketů použijeme volbu -x (Unix):

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

Zobrazení „Raw“ soketů

Filtr pro nezpracované sokety je volba -w (raw):

ss -a -w

Zobrazení soketů IP verze 4

Sokety využívající protokol IPv4 lze zobrazit pomocí volby -4 (IPV4):

ss -a -4

Zobrazení soketů IP verze 6

Pro filtrování IPv6 soketů použijeme volbu -6 (IPV6):

ss -a -6

Filtrování soketů podle stavu

Pomocí volby `state` můžeme zobrazit sokety s konkrétním stavem (např. `established`, `listening`, `closed`). K tomu přidáme volbu `resolve (-r)`, která se pokusí překládat IP adresy na jména a porty na protokoly.

Následující příkaz vyhledá navázaná spojení (TCP) a pokusí se přeložit názvy:

ss -t -r state established

Výstup ukazuje čtyři spojení s navázaným stavem. Název hostitele „ubuntu20-04“ byl úspěšně přeložen a port 22 se zobrazuje jako „ssh“.

Stejný postup lze použít pro vyhledání soketů ve stavu naslouchání:

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        [::]:*

Filtrování soketů podle protokolu

Sokety lze filtrovat podle protokolu pomocí voleb `dport` (cílový port) a `sport` (zdrojový port).

Následující příkaz vypíše sokety používající HTTPS na navázaném spojení (všimněte si mezery za úvodní závorkou a před uzavírací závorkou):

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

Můžeme použít jak název protokolu, tak i číselný port. Výchozí port pro Secure Shell (SSH) je 22.

Následující příklad ukazuje použití názvu protokolu a poté i čísla portu:

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

Jak se očekávalo, výsledky jsou stejné.

Zobrazení spojení s konkrétní IP adresou

Volba `dst` (destination) umožňuje zobrazit spojení s určitou cílovou IP adresou.

Příklad:

ss -a dst 192.168.4.25

Zobrazení procesů

Pro zobrazení procesů, které používají jednotlivé sokety, je nutné použít volbu `processes (-p)` a příkaz `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))

Tento výpis ukazuje, že navázané TCP spojení jsou využívána procesy „sshd“ (démon SSH) a „firefox“ (webový prohlížeč).

Závěr

Příkaz `ss` je moderní a efektivní náhrada za zastaralý `netstat`. Poskytuje stejné informace, ale s lepší čitelností a přístupností. Další možnosti a tipy naleznete v manuálové stránce příkazu `ss`.