Сучасна команда `ss` є чудовою альтернативою класичній утиліті `netstat`. В операційній системі Linux вона дозволяє отримувати детальну статистику про мережеві з’єднання. Розглянемо, як ефективно використовувати цей зручний інструмент.
Команда `ss` у порівнянні з `netstat`
Замінюючи застарілу команду `netstat`, `ss` надає більш детальну інформацію про взаємодію вашого комп’ютера з іншими пристроями, мережами та різними службами.
`ss` відображає статистичні дані для Протоколу керування передачею (TCP), Протоколу дейтаграм користувача (UDP), Unix (міжпроцесних), та необроблених сокетів. Необроблені сокети функціонують на мережевому рівні моделі OSI, що передбачає обробку заголовків TCP та UDP програмним забезпеченням, а не транспортним рівнем. Протокол керування повідомленнями Інтернету (ICMP) і утиліта ping використовують необроблені сокети.
Застосування `ss`
Вам не потрібно встановлювати `ss`, оскільки вона вже інтегрована в сучасні дистрибутиви Linux. Однак вихідні дані можуть бути доволі об’ємними – у наших тестах ми отримували понад 630 рядків. Дані також можуть займати багато місця по ширині.
З цієї причини, ми представляємо результати у текстовому вигляді, оскільки вони не вміщаються на звичайному знімку екрана. Ми їх також скоротили для зручності сприйняття.
Список мережевих підключень
Команда `ss` без додаткових параметрів відображає сокети, які не перебувають у стані прослуховування. Іншими словами, це ті сокети, які не очікують на нові з’єднання.
Для перегляду, введіть наступну команду:
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
Опис колонок:
`Netid`: Тип сокету. У нашому випадку ми бачимо ‘u_str’ для потоку Unix, ‘udp’ для UDP, та ‘icmp6’ для ICMP-сокета IP версії 6. Детальніші описи можна знайти в керівництві Linux.
`Стан`: Статус сокету.
`Recv-Q`: Кількість отриманих пакетів.
`Send-Q`: Кількість відправлених пакетів.
`Локальна адреса:Порт`: Локальна адреса та порт (або відповідні значення для сокетів Unix).
`Peer Address:Port`: Віддалена адреса та порт (або відповідні значення для сокетів Unix).
Для UDP-сокетів колонка `Стан` зазвичай залишається порожньою. Для TCP-сокетів вона може мати одне з наступних значень:
`СЛУХАТИ`: Лише на боці сервера. Сокет очікує запиту на з’єднання.
`SYN-SENT`: Лише на боці клієнта. Сокет надіслав запит на з’єднання і чекає на його підтвердження.
`SYN-RECEIVED`: Лише на боці сервера. Сокет очікує підтвердження з’єднання після прийняття запиту.
`ВСТАНОВЛЕНО`: Сокет на обох сторонах з’єднання. Між сервером та клієнтом встановлено робоче з’єднання для передачі даних.
`FIN-WAIT-1`: Сокет на обох сторонах з’єднання. Очікує запиту на припинення з’єднання або підтвердження свого запиту.
`FIN-WAIT-2`: Сокет на обох сторонах з’єднання. Очікує запиту на припинення з’єднання.
`CLOSE-WAIT`: Сокет на обох сторонах з’єднання. Очікує запиту на припинення з’єднання від локального користувача.
`ЗАКРИТТЯ`: Сокет на обох сторонах з’єднання. Очікує підтвердження запиту на припинення з’єднання.
`LAST-ACK`: Сокет на обох сторонах з’єднання. Очікує підтвердження запиту на припинення з’єднання, який він відправив.
`TIME-WAIT`: Сокет на обох сторонах з’єднання. Відправив підтвердження про отримання запиту на припинення з’єднання і очікує, щоб впевнитися, що воно дійшло.
`ЗАКРИТО`: З’єднання немає, сокет припинив роботу.
Список сокетів для прослуховування
Щоб побачити сокети, що знаходяться в стані прослуховування, використовуйте параметр `-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
Всі ці сокети не підключені, але знаходяться в режимі прослуховування. `rtnl` означає мережеве посилання маршрутизації, що використовується для обміну інформацією між ядром і простором користувача.
Список всіх сокетів
Щоб перерахувати всі сокети, використовуйте параметр `-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 [::]:*
Вивід включає всі сокети незалежно від їхнього стану.
Список TCP-сокетів
Ви можете застосувати фільтр, щоб відображалися лише сокети певного типу. Використовуйте параметр `-t` (TCP), щоб показати лише TCP-сокети:
ss -a -t
Список UDP-сокетів
Параметр `-u` (UDP) виконує аналогічну функцію фільтрації. У цьому випадку ви побачите лише 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 [::]:*
Список сокетів Unix
Щоб переглянути тільки сокети Unix, скористайтеся параметром `-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
Список необроблених сокетів
Для перегляду необроблених сокетів використовуйте параметр `-w` (raw):
ss -a -w
Список сокетів IP версії 4
Сокети, що використовують протокол TCP/IP версії 4, можна перерахувати за допомогою параметра `-4` (IPV4):
ss -a -4
Список сокетів IP версії 6
Для перегляду сокетів IP версії 6 використовуйте параметр `-6` (IPV6):
ss -a -6
Список сокетів за станом
Ви можете фільтрувати сокети за їхнім станом, використовуючи параметр `state`. Це працює зі станами `established`, `listening`, або `closed`. Також використаємо параметр `-r` (resolve), який намагається перетворити мережеві адреси в імена, а порти в протоколи.
Наступна команда знайде всі встановлені TCP-з’єднання, і `ss` спробує розв’язати імена:
ss -t -r state established
В результаті ми бачимо чотири з’єднання, що знаходяться у встановленому стані. Ім’я хоста, ubuntu20-04, було розпізнано, а `ssh` відображається замість порту 22 для з’єднання SSH.
Аналогічно можна знайти сокети в стані прослуховування:
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 [::]:*
Список сокетів за протоколом
Ви можете перерахувати сокети з певним протоколом, використовуючи параметри `dport` і `sport`, що позначають порти призначення і відправлення відповідно.
Щоб перерахувати сокети, що використовують протокол HTTPS для встановленого з’єднання, введіть наступну команду (зверніть увагу на пробіл після відкриваючої і перед закриваючою дужкою):
ss -a state established ‘( dport = :https or sport = :https )’
Можна використовувати як назву протоколу, так і відповідний йому номер порту. Наприклад, безпечна оболонка (SSH) за замовчуванням використовує порт 22.
Спробуємо використати спочатку назву протоколу, а потім повторимо команду, вказавши номер порту:
ss -a ‘( dport = :ssh or sport = :ssh )’
ss -a ‘( dport = :22 or sport = :22 )’
Як і очікувалося, результати виявилися ідентичними.
Список з’єднань до певної IP-адреси
За допомогою параметра `dst` (destination) можна перерахувати з’єднання до конкретної IP-адреси призначення.
Введіть наступне:
ss -a dst 192.168.4.25
Ідентифікація процесів
Для того, щоб побачити, які саме процеси використовують сокети, застосуйте параметр `process` (`-p`), як показано нижче (зверніть увагу, що потрібно використати 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))
Це показує, що два встановлені з’єднання на TCP-сокетах використовуються демоном SSH та браузером Firefox.
Гідний наступник
Команда `ss` надає ту саму інформацію, що й `netstat`, але більш ефективно та зрозуміло. Для отримання додаткових опцій та порад, зверніться до сторінки керівництва.