Проверка занятости порта сервисом в Linux

Oct 4, 2018 06:09 · 637 words · 3 minute read lsof netstat fuser tips

Однажды вам обязательно понадобится проверить используемый порт определенного сервиса (или наоборот, найти сервисы, слушающие конкретный порт) - в Linux существует несколько утилит командной строки, которые могут с этим помочь. Давайте разберемся!

Первым делом на ум приходит утилита netstat, с помощью которой можно проверить сетевые соединения, статистику сетевых интерфейсов, таблицу маршрутизации и т. д.

Устанавливается данная утилита в разных дистрибутивах по-разному, например, для RedHat и CentOS:

sudo yum install net-tools

Fedora 22+:

dnf install net-tools

Debian/Ubuntu:

sudo apt-get install net-tools

Для вывода детальной информации о всех TCP и UDP ендпоинтах можно воспользоваться следующей командой:

netstat -pnltu

Вывод будет примерно следующим:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1323/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1661/sshd
tcp        0      0 127.0.0.1:17123         0.0.0.0:*               LISTEN      1753/python
tcp6       0      0 :::31341                :::*                    LISTEN      30068/java
tcp6       0      0 :::22222                :::*                    LISTEN      30068/java
tcp6       0      0 :::80                   :::*                    LISTEN      30068/java
tcp6       0      0 :::10769                :::*                    LISTEN      126755/docker-proxy
tcp6       0      0 :::10770                :::*                    LISTEN      129459/docker-proxy
tcp6       0      0 :::10771                :::*                    LISTEN      129540/docker-proxy
tcp6       0      0 :::10772                :::*                    LISTEN      130172/docker-proxy
tcp6       0      0 :::10773                :::*                    LISTEN      130187/docker-proxy
tcp6       0      0 :::10774                :::*                    LISTEN      130545/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      1661/sshd
tcp6       0      0 :::10775                :::*                    LISTEN      7406/docker-proxy

Здесь:

  • -p - вывод ID процесса и его имени;
  • -n - вывод адресов;
  • -l - вывод сокетов;
  • -t - вывод TCP соединений;
  • -u - вывод UDP соединений.

Найти сервис, запущенный на определенном порту можно так:

netstat -pnltu | grep -i "22"

Аналогично можно найти на каком порту запущен определенный сервис:

netstat -pnltu | grep -i "sshd"

Также для наших целей подойдет утилита командной строки fuser. По умолчанию она не установлена в большинстве операционных систем, чтобы установить ее в Centos/RedHat делаем так:

yum install psmisc

Fedora 22+

dnf install psmisc

Debian/Ubuntu

apt-get install psmisc

Например, чтобы найти идентификаторы процессов (PIDs), запущенных на 80-м порту, выполняем команду:

fuser 22/tcp

Результат выполнения будет примерно следующим:

22/tcp:               1661 105268 105302

Далее можем найти имя процесса по его идентификатору (PID):

ps -p 1661 -o comm=

Результат:

sshd

Еще один способ - использование утилиты lsof. Установка ее в RedHat/CentOS выглядит так:

yum install lsof

Fedora 22+

dnf install lsof

Debian/Ubuntu:

apt-get install lsof

Вывод всех активных TCP и UPD соединений:

lsof -i

Результатом будет примерно следующее:

COMMAND      PID            USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
systemd-r   1323 systemd-resolve   12u  IPv4     20197      0t0  UDP 127.0.0.53:domain
systemd-r   1323 systemd-resolve   13u  IPv4     20198      0t0  TCP 127.0.0.53:domain (LISTEN)
sshd        1661            root    3u  IPv4     29741      0t0  TCP *:ssh (LISTEN)
sshd        1661            root    4u  IPv6     29743      0t0  TCP *:ssh (LISTEN)
python      1754        dd-agent    4u  IPv6     39499      0t0  UDP localhost.localdomain:8125
docker-pr   7406            root    4u  IPv6 287933991      0t0  TCP *:10775 (LISTEN)
docker-pr   7459            root    4u  IPv6 287906596      0t0  TCP *:10776 (LISTEN)
docker-pr   7792            root    4u  IPv6 287937795      0t0  TCP *:10777 (LISTEN)
docker-pr   8435            root    4u  IPv6 287955267      0t0  TCP *:10778 (LISTEN)
docker-pr   8447            root    4u  IPv6 287915222      0t0  TCP *:10779 (LISTEN)
docker-pr   9060            root    4u  IPv6 287891442      0t0  TCP *:10780 (LISTEN)
docker-pr   9429            root    4u  IPv6 287957044      0t0  TCP *:10781 (LISTEN)
docker-pr   9463            root    4u  IPv6 287921075      0t0  TCP *:10782 (LISTEN)
ntpd       10594             ntp   16u  IPv6  35365570      0t0  UDP *:ntp

Проверить использование конкретного порта можно так:

lsof -i :22

Результат:

COMMAND    PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
sshd      1661   root    3u  IPv4     29741      0t0  TCP *:ssh (LISTEN)
sshd      1661   root    4u  IPv6     29743      0t0  TCP *:ssh (LISTEN)

Напоследок можно также воспользоваться утилитой whatportis. Ее установка в RedHat/Centos требует чуть больше действий:

yum install epel-release
yum install python34-setuptools
easy_install-3.4 pip
pip install whatportis

В Debian/Ubuntu все гораздо проще:

apt install python-pip
pip install whatportis

В общем виде использование утилиты выглядит так:

whatportis [номер_порта | имя_сервиса]

Если вам неизвестно точное имя сервиса, можно воспользоваться опцией --like, например:

whatportis ssh --like

Также доступен вывод информации в json-формате:

whatportis 22 --json
tweet Share