В статье разбирается утилита 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 )’ — совмещение разных опций.