Проверка занятости порта сервисом в Linux
Oct 4, 2018 06:09 · 637 words · 3 minute read
Однажды вам обязательно понадобится проверить используемый порт определенного сервиса (или наоборот, найти сервисы, слушающие конкретный порт) - в 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