Утилита ss

В статье разбирается утилита ss, которая предназначена для получения информации о сетевых подключениях к серверу или от него.

Об утилите

Эта утилита используется для вывода информации о сетевых подключениях. Она может отображать информацию, аналогичную netstat, которую мы рассмотрели в  прошлой статье . Но ss может показать больше информации чем другие инструменты.

Ещё одним преимуществом этой утилиты, является то, что она уже предустановлена и в Debian и в Ubuntu. И вам не нужно ставить пакет с устаревшими инструментами (это я про net-tools).

Если мы выполним ss без дополнительных опций, то увидим только активные соединения (TCP и сокеты).

$ ss
Netid   State   Recv-Q   Send-Q                        Local Address:Port            Peer Address:Port     Process
u_dgr   ESTAB   0        0                       /run/systemd/notify 18859                      * 0
u_dgr   ESTAB   0        0              /run/systemd/journal/dev-log 18885                      * 0
u_str   ESTAB   0        0                                         * 18325                      * 19647
u_str   ESTAB   0        0               /run/systemd/journal/stdout 18038                      * 18033
u_dgr   ESTAB   0        0                                         * 20631                      * 18885
u_str   ESTAB   0        0               /run/dbus/system_bus_socket 19650                      * 18344
u_str   ESTAB   0        0               /run/dbus/system_bus_socket 20934                      * 21645
icmp6   UNCONN  0        0                                   *%ens18:ipv6-icmp                  *:*
tcp     ESTAB   0        52                               192.168.0.34:ssh           192.168.0.14:62063

В выводе мы видим следующие поля:

  • Netid — тип подключения:
    • u_dgr — тип сокета, который работает без установки соединения;
    • u_str — тип сокета, который работает с предварительной установкой соединения;
    • tcp — tcp соединение;
    • udp — udp соединение.
  • State — состояние соединения:
    • UNCONN — это состояние обычно устанавливается для UDP соединений, так как UDP работает без установки соединения;
    • LISTEN — ожидает запрос на подключение (слушает);
    • ESTAB — соединение установлено;
    • Остальные состояния сеанса TCP я описывал  здесь .
  • Recv-Q — количество байтов, помещённых в буфер приёма TCP/IP, но не переданных приложению. Если это число высокое, то нужно проверить работоспособность приложения, которое работает с данным портом.
  • Send-Q — количество байтов, помещённых в буфер отправки TCP/IP, но не отправленных, или отправленных, но не подтверждённых. Высокое значение может быть связано с перегрузкой сети сервера.
  • Local Address:Port — локальный адрес и порт нашего сервера. Либо файл сокета. В LISTEN соединениях — это диапазон адресов и портов.
  • Peer Address:Port — адрес и порт второй стороны. В LISTEN соединениях — это диапазон адресов и портов.
  • Process — информация о процессе, которая появляется только, когда мы используем опцию -p.

Примеры работы и дополнительные опции

Активные подключения и прослушиваемые порты

Здесь нужно использовать все те же опции что и для утилиты netstat. Так опция -a помимо активных соединений покажет прослушиваемые порты. А с помощью опций -t-u-x вы можете ограничить вывод по tcpudp или сокетами.

Дополнительно с опцией -o вы можете посмотреть время работы соединения (timer). А с опцией -p вы увидите имя процесса, но в этом случае нужно использовать sudo. И в качестве ещё одной дополнительной опции вы можете использовать -n, чтобы не переводить номера портов в имена протоколов. При этом, по умолчанию, утилита ss не пытается переводить ip-адреса в доменные имена, как это делала утилита netstat.

Вот пример получения всех соединений и прослушиваемых портов (-a), но только для TCP соединений (-t). И дополнительно я смотрю время соединения (-o) и информацию о процессе (-p):

$ sudo ss -atop
State  Recv-Q Send-Q Local Address:Port   Peer Address:Port  Process
LISTEN 0      511          0.0.0.0:http        0.0.0.0:*     users:(("nginx",pid=536,fd=6),("nginx",pid=535,fd=6),("nginx",pid=534,fd=6))
LISTEN 0      4096   127.0.0.53%lo:domain      0.0.0.0:*     users:(("systemd-resolve",pid=445,fd=14))
LISTEN 0      128          0.0.0.0:ssh         0.0.0.0:*     users:(("sshd",pid=608,fd=3))
ESTAB  0      52      192.168.0.34:ssh    192.168.0.14:62063 users:(("sshd",pid=771,fd=4),("sshd",pid=672,fd=4)) timer:(on,224ms,0)
LISTEN 0      511             [::]:http           [::]:*     users:(("nginx",pid=536,fd=7),("nginx",pid=535,fd=7),("nginx",pid=534,fd=7))
LISTEN 0      128             [::]:ssh            [::]:*     users:(("sshd",pid=608,fd=4))
  • Время работы процесса пишется только для ESTABLISHED соединений в информации о процессе, в поле timer.

Только прослушиваемые порты

И в этом случае используем опции, как для утилиты netstat. Опция -l покажет нам только прослушиваемые порты, а опциями -t-u-x мы можем ограничить вывод.

Например, следующая команда, выведет прослушиваемые tcp и udp порты (-ltu), и информацию по процессу (-p).

$ sudo ss -ltup
Netid State  Recv-Q Send-Q    Local Address:Port    Peer Address:Port Process
udp   UNCONN 0      0         127.0.0.53%lo:domain       0.0.0.0:*     users:(("systemd-resolve",pid=445,fd=13))
udp   UNCONN 0      0    192.168.0.34%ens18:bootpc       0.0.0.0:*     users:(("systemd-network",pid=424,fd=15))
tcp   LISTEN 0      511             0.0.0.0:http         0.0.0.0:*     users:(("nginx",pid=536,fd=6),("nginx",pid=535,fd=6)
tcp   LISTEN 0      4096      127.0.0.53%lo:domain       0.0.0.0:*     users:(("systemd-resolve",pid=445,fd=14))
tcp   LISTEN 0      128             0.0.0.0:ssh          0.0.0.0:*     users:(("sshd",pid=608,fd=3))
tcp   LISTEN 0      511                [::]:http            [::]:*     users:(("nginx",pid=536,fd=7),("nginx",pid=535,fd=7)
tcp   LISTEN 0      128                [::]:ssh             [::]:*     users:(("sshd",pid=608,fd=4))

Поиск определённых соединений

Так же мы можем искать более конкретные вещи. Например, найдём кто слушает 22 порт на нашем сервере:

$ sudo ss -ltpn | grep 22
LISTEN 0      128       0.0.0.0:22      0.0.0.0:*    users:(("sshd",pid=608,fd=3))
LISTEN 0      128          [::]:22         [::]:*    users:(("sshd",pid=608,fd=4))

Можем искать соединения по статусу соединения или порту отправителя и порту получателя. Например, здесь, мы ищем все established соединения для локального порта ssh и удалённого порта ssh:

$ ss state established '( dport = :ssh or sport = :ssh )'
Netid  Recv-Q   Send-Q   Local Address:Port    Peer Address:Port    Process
tcp    0        52        192.168.0.34:ssh     192.168.0.14:62063

Можем найти все подключения с определённого ip адреса:

$ ss dst 192.168.0.14
Netid State  Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
tcp   ESTAB  0       52       192.168.0.34:ssh   192.168.0.14:62063

Найдем все подключения к нашему веб-серверу по порту 80:

$ ss src :80
Netid  State Recv-Q Send-Q  Local Address:Port   Peer Address:Port  Process
tcp    ESTAB 0      0        192.168.0.34:http   192.168.0.14:57171
tcp    ESTAB 0      0        192.168.0.34:http   192.168.0.14:57172

Получение статистики

Для получения статистики используется опция -s, например:

$ ss -s

Total: 162
TCP:   6 (estab 1, closed 0, orphaned 0, timewait 0)

Transport Total     IP        IPv6
RAW       1         0         1
UDP       2         2         0
TCP       6         4         2
INET      9         6         3
FRAG      0         0         0

Здесь видно, что всего 162 соединения. Из них 6 tcp соединений.

Итог

Мы познакомились с утилитой ss, которая заменяет утилиту netstat. Она позволяет смотреть информацию о сетевых подключениях к серверу или от него. Рассмотрели следующие опции:

  • -a — посмотреть все соединения;
  • -l — посмотреть только прослушиваемые порты;
  • -t — только tcp;
  • -u — только udp;
  • -x — только unix socket;
  • -o — добавить к выводу информацию о таймерах соединения;
  • -p — добавить к выводу информацию о процессе;
  • -n — не переводить номера процессов в имена протоколов;
  • state established — показать соединения только для определённого состояния;
  • src 192.168.0.14 — показать соединения только на определённый ip-адрес сервера;
  • dst 192.168.0.14 — показать соединения только с определённым ip-адресом второй стороны;
  • src :22 — соединения только с локальным 22 портом, можете выбрать любой другой порт;
  • '( dport = :ssh or sport = :ssh )' — совмещение разных опций.

Если понравилась статья, подпишись на мой канал в  VK  или  Telegram .