Как узнать, какая служба прослушивает определенный порт
В этом руководстве объясняется несколько различных способов определить, какая служба прослушивает определенный порт в Linux. Большинству из вас известен порт по умолчанию для популярных служб или процессов. Например, порт по умолчанию для Apache — 80, порт по умолчанию для FTP — 21, а порт по умолчанию для SSH — 22. Имена и номера портов в Linux можно найти, как описано в этом руководстве. Номера портов по умолчанию также можно изменить на любые пользовательские порты для защиты сервера Linux. Например, в следующих руководствах описывается, как изменить порт Apache, FTP и SSH по умолчанию на другой порт.
- Как изменить порт Apache по умолчанию на собственный порт
- Как изменить порт FTP по умолчанию на собственный порт
- Как изменить порт SSH по умолчанию на собственный порт
Если номер порта по умолчанию будет изменен, как вы определите, какая служба какой порт прослушивает? Именно это мы сейчас и узнаем!
Найдите, какая служба прослушивает определенный порт в Linux
Ниже я перечислил четыре метода, позволяющие проверить, какая служба работает на определенном номере порта. Я буду продолжать обновлять этот список, если в будущем столкнусь с какими-либо новыми методами. Так что добавьте его в закладки и проверяйте время от времени.
Способ 1 — использование netstat
Это наиболее часто используемый способ узнать, какая служба какой порт прослушивает. Netstat — это утилита командной строки, используемая для печати сетевых подключений, таблиц маршрутизации, статистики интерфейса, маскарадных подключений и членства в многоадресной рассылке.
Netstat доступен в репозиториях по умолчанию большинства дистрибутивов Linux.
Чтобы установить его в Arch Linux и его вариантах, выполните:
sudo pacman -S net-tools
В Fedora, RHEL, CentOS, AlmaLinux и Rocky Linux:
sudo dnf install net-tools
В старых версиях RHEL и его клонах используйте yum
вместо dnf
.
sudo yum install net-tools
В Дебиане, Убунту:
sudo apt install net-tools
После установки netstat выполните следующую команду, чтобы узнать, какие службы какие порты прослушивают:
sudo netstat -tulpn
Пример вывода:
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 665/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1026/sshd
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 2068/python3
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1072/mysqld
tcp6 0 0 :::22 :::* LISTEN 1026/sshd
tcp6 0 0 :::80 :::* LISTEN 1062/apache2
udp 0 0 127.0.0.53:53 0.0.0.0:* 665/systemd-resolve
udp 0 0 192.168.225.22:68 0.0.0.0:* 647/systemd-network
udp 0 0 192.168.225.53:68 0.0.0.0:* 647/systemd-network
udp6 0 0 fe80::a00:27ff:feff:546 :::* 647/systemd-network
udp6 0 0 fe80::a00:27ff:fe7e:546 :::* 647/systemd-network
Узнайте, какие службы какие порты прослушивают, используя netstat в Linux
Как вы можете видеть, служба Python (в данном случае simpleHTTPserver) прослушивает порт номер 8000, служба mysqld прослушивает порт 3306, служба ssh работает на порту номер 22, apache2 работает на порту. 80 и так далее.
Здесь,
- Флаг
-t
показывает TCP-соединения. - Флаг
-u
показывает соединения udp. - Флаг
-l
отображает прослушиваемые сокеты. - Флаг
-p
отображает идентификатор процесса (PID) и имя процесса, использующего этот порт. - Флаг
-n
отображает числовые адреса.
Приведенная выше команда перечисляет все службы и номера портов, которые они прослушивают. Что делать, если вы хотите узнать, какая служба прослушивает определенный порт? Вот тут-то и пригодится команда grep! Мы можем объединить команды netstat
и grep
для фильтрации вывода для конкретной службы, например mysqld, как показано ниже.
$ sudo netstat -tulpn | grep mysqld
[sudo] password for sk:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1076/mysqld
Видеть? Служба mysqld прослушивает порт номер 3306.
Если вы уже знаете номер порта, но не знаете, какая служба в данный момент его использует, просто замените имя службы номером порта, как показано ниже.
sudo netstat -tulpn | grep -w 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1076/mysqld
Здесь флаг -w
отображает только те строки, которые содержат совпадения, образующие целые слова. Другими словами, опция -w
показывает точное совпадение заданной строки.
Вы также можете использовать -i
, чтобы игнорировать различия в регистре, чтобы символы, отличающиеся только регистром, соответствовали друг другу.
sudo netstat -tulpn | grep -i 3306
Это так просто.
Более подробную информацию можно найти на страницах руководства.
man netstat
Netstat по большей части устарел. Альтернативой netstat является «ss».
Способ 2 — использование команды «ss»
Команда netstat устарела в последних версиях Linux, поэтому я рекомендую вам использовать "ss" вместо netstart.
ss — утилита командной строки для исследования сокетов. Это альтернатива netstat, и использование «ss» почти такое же, как и «netstat». Он предустановлен в Ubuntu и ее вариантах.
Чтобы узнать, какие службы какие порты прослушивают, выполните:
sudo ss -tulpn
Пример вывода:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=671,fd=12))
udp UNCONN 0 0 192.168.225.22%enp0s3:68 0.0.0.0:* users:(("systemd-network",pid=653,fd=17))
udp UNCONN 0 0 192.168.225.53%enp0s8:68 0.0.0.0:* users:(("systemd-network",pid=653,fd=25))
udp UNCONN 0 0 [fe80::a00:27ff:fe7e:8a9c]%enp0s8:546 [::]:* users:(("systemd-network",pid=653,fd=24))
udp UNCONN 0 0 [fe80::a00:27ff:feff:d2e0]%enp0s3:546 [::]:* users:(("systemd-network",pid=653,fd=22))
tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1076,fd=32))
tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=671,fd=13))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1015,fd=3))
tcp LISTEN 0 128 *:80 *:* users:(("apache2",pid=1094,fd=4),("apache2",pid=1090,fd=4),("apache2",pid=1089,fd=4),("apache2",pid=1088,fd=4),("apache2",pid=1087,fd=4),("apache2",pid=1062,fd=4))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1015,fd=4))
Узнайте, какие службы какие порты прослушивают, с помощью команды ss в Linux
Чтобы отфильтровать вывод для определенной службы (например, mysqld), используйте:
sudo ss -tulpn | grep -w mysqld
tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1076,fd=32))
Более подробную информацию можно найти на страницах руководства.
man ss
Метод 3 — Использование lsof
Как следует из названия, lsof — это утилита командной строки, которая выводит список всех открытых файлов, принадлежащих всем активным процессам.
Чтобы установить его в Linux, используйте следующие команды в зависимости от типа используемого вами дистрибутива.
В Арч Линукс:
sudo pacman -S lsof
В Дебиане, Убунту:
sudo apt install lsof
В CentOS RHEL:
sudo yum install lsof
В Федоре:
sudo dnf install lsof
Чтобы узнать, какие процессы на каких портах выполняются, просто укажите номер порта, как показано в следующей команде:
sudo lsof -i :80
Пример вывода:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 1062 root 4u IPv6 20452 0t0 TCP *:http (LISTEN)
apache2 1087 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN)
apache2 1088 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN)
apache2 1089 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN)
apache2 1090 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN)
apache2 1094 www-data 4u IPv6 20452 0t0 TCP *:http (LISTEN)
Найдите, какая служба прослушивает определенный порт, с помощью команды lsof
Более подробную информацию можно найти на страницах руководства.
man lsof
Способ 4. Использование команды фьюзера
fuser — еще одна утилита командной строки для идентификации процессов, использующих файлы или сокеты. Он отображает PID процессов, использующих указанные файлы или файловые системы.
Он также доступен в репозиториях по умолчанию большинства дистрибутивов Linux.
Чтобы установить его в Arch Linux, запустите:
sudo pacman -S psmisc
В Дебиане, Убунту:
sudo apt install psmisc
В CentOS RHEL:
sudo yum install psmisc
В Федоре:
sudo dnf install psmisc
Сначала нам нужно найти PID службы или процесса, прослушивающего определенный порт. Например, я собираюсь найти PID процесса, прослушивающего порт 3306, с помощью команды:
sudo fuser 3306/tcp
Вы увидите результат, как показано ниже.
3306/tcp: 1076
Здесь 1076 — это PID.
А затем узнайте фактический процесс, используя PID, используя команду:
ps -p 1076 -o comm=
mysqld
Альтернативно вы можете использовать флаг -v
для просмотра полной информации с помощью одной команды.
$ sudo fuser -v 3306/tcp
USER PID ACCESS COMMAND
3306/tcp: mysql 1076 F.... mysqld
Определите, какая служба прослушивает определенный порт, используя команду Fuser.
Для получения более подробной информации просмотрите справочные страницы.
man fuser
Заключение
Теперь вы знаете четыре различных инструмента, позволяющих определить, какие процессы какие порты прослушивают в Linux. Все четыре из них просты в использовании и доступны в большинстве дистрибутивов Linux. Если вам известны какие-либо другие инструменты, сообщите нам об этом в разделе комментариев ниже. Я проверю и обновлю этот список соответствующим образом.