Команда ss используется для получения информации о текущих сетевых взаимодействиях. Стоит отметить, что эта команда в целом является альтернативой коменде netstat, которая раньше и даже до сих пор широко используется, но во многие современные дистрибутивы уже не включается по умолчанию.
Команда ss может принимать ряд опций, которые определяют поведение команды. Отмечу некоторые из них:
-a, --all
: выводит все сокеты
-r, --resolve
: преобразовывать ip-адреса в имена хостов (домены)
-l, --listening
: выводит сокеты, прослушивающие подключения
-e, --extended
: выводит подробную информацию о сокетах
-m, --memory
: выводит информацию об использовании памяти сокетами
-p, --processes
: выводит процесс, который использует сокеты
-T, --threads
: выводит поток, который использует сокеты
-i, --info
: выводит внутреннюю информацию TCP
-s, --summary
: выводит сводку об использовании сокетов
-E, --events
: постоянно отображает сокеты по мере их уничтожения
-4, --ipv4
: выводит только сокеты IP версии 4
-6, --ipv6
: выводит только сокеты IP версии 6
-t, --tcp
: выводит только TCP-сокеты
-u, --udp
: выводит только UDP-сокеты
Например, используем команду ss -a для получения всей информации о сетевых соединениях:
eugene@Eugene:~$ ss -a Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:kernel * nl UNCONN 0 0 rtnl:code/4486 * nl UNCONN 0 0 rtnl:chrome/3688 * nl UNCONN 0 0 rtnl:goa-daemon/3300 * nl UNCONN 0 0 rtnl:evolution-addre/3353 * nl UNCONN 0 0 rtnl:avahi-daemon/1461 * nl UNCONN 0 0 rtnl:NetworkManager/1531 * nl UNCONN 0 0 rtnl:xdg-desktop-por/3452 * ..................................................................................................................................................... tcp ESTAB 0 0 192.168.0.108:55950 5.255.255.70:https tcp ESTAB 0 0 192.168.0.108:54012 142.250.185.206:https tcp ESTAB 0 0 192.168.0.108:37494 185.125.190.20:https tcp ESTAB 0 0 192.168.0.108:48670 142.250.185.206:https tcp LISTEN 0 511 *:http *:* tcp LISTEN 0 4096 [::1]:ipp [::]:* eugene@Eugene:~$
Выводимая командой ss таблица отображает следующую информацию:
Netid: отображает тип сокетов. В Linux есть множество различных типов сокетов. Например, в выводе выше отображается nl
(netlink), который применяется для обмена информацией между ядром Linux и пользовательскими
процессами. Другие распространенные типы - tcp, udp, us_str
State: состояние сокеты. Наиболее распространенные значения: ESTAB (established - установлено), UNCONN (unconnected - не подключено), LISTEN (listening - прослушивает подключения).
Recv-Q: количество пакетов, ожидающих в очереди для приема
Send-Q: количество пакетов, ожидающих в очереди для отправки
Local address:port: адрес локальной машины и порт
Peer address:port: адрес удаленной машины и порт, на который отправляются данные
Обратите внимание, что столбцы адресов отображают по умолчанию IP-адреса. Чтобы проще идентифицировать адреса, можно использовать опцию -r:
eugene@Eugene:~$ ss -ar Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:kernel * nl UNCONN 0 0 rtnl:code/4486 * nl UNCONN 0 0 rtnl:chrome/3688 * nl UNCONN 0 0 rtnl:goa-daemon/3300 * nl UNCONN 0 0 rtnl:evolution-addre/3353 * nl UNCONN 0 0 rtnl:avahi-daemon/1461 * nl UNCONN 0 0 rtnl:NetworkManager/1531 * nl UNCONN 0 0 rtnl:xdg-desktop-por/3452 * ..................................................................................................................................................... tcp ESTAB 0 0 Eugene:55950 yandex.ru:https tcp ESTAB 0 0 Eugene:54012 google.com:https tcp ESTAB 0 0 Eugene:37494 ubuntu.com:https tcp ESTAB 0 0 Eugene:48670 google.com:https tcp LISTEN 0 511 *:http *:* tcp LISTEN 0 4096 [::1]:ipp [::]:* eugene@Eugene:~$
Рассмотрим еще несколько полезных опций. Например, просмотр только прослушивающих соединения сокетов:
ss -l
Просмотр только TCP-сокетов:
ss -t
С помощью опции -p можно получить процессы, которые используют данный сокет:
eugene@Eugene:~$ ss -p Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process u_str ESTAB 272 0 * 84831 * 91637 users:(("evince",pid=7247,fd=9)) u_str ESTAB 0 0 @/tmp/.X11-unix/X0 36353 * 54291 users:(("Xwayland",pid=3724,fd=20)) u_str ESTAB 0 0 * 38469 * 25566 users:(("gsd-wacom",pid=3148,fd=11)) u_str ESTAB 0 0 /run/user/1000/pipewire-0 101623 * 100859 users:(("pipewire",pid=2650,fd=58)) u_str ESTAB 0 0 * 99603 * 99602 users:(("code",pid=6887,fd=96)) ..........................
Аналогично можно получить все процессы, которые используют только сокеты TCP:
ene:~$ ss -pt State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.168.0.108:58832 5.255.255.70:https users:(("chrome",pid=3851,fd=32)) ESTAB 0 0 192.168.0.108:38568 5.255.255.77:https users:(("chrome",pid=3851,fd=98)) ESTAB 0 0 192.168.0.108:55854 213.180.204.90:https users:(("chrome",pid=3851,fd=106)) ESTAB 0 0 192.168.0.108:32880 5.255.255.77:https users:(("chrome",pid=3851,fd=69)) ESTAB 0 0 192.168.0.108:58716 185.125.190.29:https users:(("chrome",pid=3851,fd=58)) ESTAB 0 0 192.168.0.108:51456 185.125.190.29:https users:(("chrome",pid=3851,fd=55)) .............................................
Аналогично можно получить процессы, но с доменными именами вместо IP-адресов:
ss -ptr
Команда ss позволяет фильтровать вывод по определенным критериям. Некоторые фильтры:
dst
: фильтрует по определенному адресу назначения
src
: фильтрует по определенному исходящему адресу
state
: фильтрация по состоянию
Например, найдем все подключения, которые обращаются к адресу "64.233.165.113" (google.com):
eugene@Eugene:~$ ss dst 64.233.165.113 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.0.108:46334 64.233.165.113:https eugene@Eugene:~$
Аналогично найдем все подключения, в которые исходящий адрес на локальной машине - 192.168.0.108:55854
eugene@Eugene:~$ ss src 192.168.0.108:55854 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp ESTAB 0 0 192.168.0.108:55854 185.125.190.29:https eugene@Eugene:~$
В данном случае применялася порт. Но также можно было бы вывести и по определенному адресу:
ss src 192.168.0.108
Также можно отфильтровать только по порту:
eugene@Eugene:~$ ss src :55854 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.0.108:55854 185.125.190.29:https
Если надо получить имена хостов, а не IP-адреса, то, как и в общем случае, можно использовать флаг -r:
ss -r src 192.168.0.108
Можно использовать сразу оба фильтра:
ss -a src :55854 or dst :https
В данном случае получаем все соединения, где локальная машина использует порт 55854, либо где удаленный хост использует https
Или отфильтруем по состоянию "listening" tcp-сокеты:
eugene@Eugene:~$ ss -t state listening Recv-Q Send-Q Local Address:Port Peer Address:Port Process 0 4096 127.0.0.53%lo:domain 0.0.0.0:* 0 4096 127.0.0.54:domain 0.0.0.0:* 0 4096 127.0.0.1:ipp 0.0.0.0:* 0 511 *:http *:* 0 4096 [::1]:ipp [::]:*
Также, как и с другими командами, можно получить текстовый вывод команды и в нем уже искать определенный текст, например, с помощью команды grep:
eugene@Eugene:~$ ss -r | grep "1e100.net" udp ESTAB 0 0 Eugene:33724 lq-in-f94.1e100.net:https udp ESTAB 0 0 Eugene:33813 lb-in-f94.1e100.net:https udp ESTAB 0 0 Eugene:49685 lu-in-f103.1e100.net:https tcp ESTAB 0 0 Eugene:36868 lg-in-f101.1e100.net:https tcp FIN-WAIT-1 0 605 Eugene:58502 lq-in-f154.1e100.net:https tcp ESTAB 0 0 Eugene:53820 lr-in-f94.1e100.net:https tcp ESTAB 0 540 Eugene:60092 lq-in-f154.1e100.net:https tcp ESTAB 0 0 Eugene:46016 lg-in-f95.1e100.net:https tcp ESTAB 0 0 Eugene:39640 os-in-f94.1e100.net:https eugene@Eugene:~$
В данном случае выполняется поиск подключений, которые идут к доменам на "1e100.net".