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

Об утилите

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

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

Получить справку об этой утилите можно здесь, или выполнив команду man ss.

Работа утилиты

Если мы выполним 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 вы можете ограничить вывод по tcp, udp или сокетами.

Дополнительно с опцией -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.

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

И в этом случае используем опции, как для утилиты 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),("nginx",pid=534,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),("nginx",pid=534,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 )’ — совмещение разных опций.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *