
При устранении неполадок сетевого подключения или проблем, связанных с конкретными приложениями, первым делом следует проверить, какие порты фактически используются в вашей системе и какое приложение прослушивает определенный порт.
В этой статье объясняется, как использовать команды netstat , ss и lsof для определения того, какие службы прослушивают те или иные порты. Инструкции применимы ко всем операционным системам Linux и Unix, например, macOS.
Что такое номер порта прослушивания
Сетевой порт идентифицируется по его номеру, связанному с ним IP-адресу и типу протокола связи, например TCP или UDP.
Прослушивающий порт — это сетевой порт, который прослушивает приложение или процесс, выступая в качестве конечной точки связи.
Каждый прослушиваемый порт может быть открыт или закрыт (фильтрован) с помощью межсетевого экрана. В общем случае, открытый порт — это сетевой порт, принимающий входящие пакеты из удалённых мест.
Невозможно, чтобы две службы прослушивали один и тот же порт на одном и том же IP-адресе.
Например, если вы используете веб-сервер Apache, который прослушивает порты 80 и 443 , и вы пытаетесь установить Nginx , последний не запустится, поскольку порты HTTP и HTTPS уже используются.
Проверьте прослушиваемые порты с помощью netstat
netstat — это инструмент командной строки, который может предоставить информацию о сетевых подключениях.
Чтобы составить список всех прослушиваемых портов TCP или UDP, включая службы, использующие порты, и состояние сокета, используйте следующую команду:
sudo netstat -tunlp
Параметры, используемые в этой команде, имеют следующее значение:
-
-t— Показать TCP-порты. -
-u— Показать UDP-порты. -
-n— Показывать числовые адреса вместо разрешения хостов. -
-l— Показывать только прослушиваемые порты. -
-p— показать PID и имя процесса-слушателя. Эта информация отображается только при запуске команды от имени пользователя root или sudo .
Вывод будет выглядеть примерно так:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 445/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 929/master tcp6 0 0 :::3306 :::* LISTEN 534/mysqld tcp6 0 0 :::80 :::* LISTEN 515/apache2 tcp6 0 0 :::22 :::* LISTEN 445/sshd tcp6 0 0 :::25 :::* LISTEN 929/master tcp6 0 0 :::33060 :::* LISTEN 534/mysqld udp 0 0 0.0.0.0:68 0.0.0.0:* 966/dhclient
Важными столбцами в нашем случае являются:
-
Proto— протокол, используемый сокетом. -
Local Address— IP-адрес и номер порта, который прослушивает процесс. -
PID/Program name— PID и имя процесса.
Если вы хотите отфильтровать результаты, используйте команду grep . Например, чтобы узнать, какой процесс прослушивает TCP-порт 22, введите:
sudo netstat -tnlp | grep :22
Вывод показывает, что на этой машине порт 22 используется сервером SSH:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 445/sshd tcp6 0 0 :::22 :::* LISTEN 445/sshd
Если вывод пустой, это означает, что порт никто не прослушивает.
Вы также можете фильтровать список по определенным критериям, например, PID, протоколу, состоянию и т. д.
netstat устарела и заменена на ss и ip , но она по-прежнему остается одной из наиболее используемых команд для проверки сетевых подключений.
Проверьте порты прослушивания с помощью ss
ss — это новый netstat . В нём отсутствуют некоторые функции netstat , но он отображает больше состояний TCP и работает немного быстрее. Параметры команды в основном те же, поэтому переход с netstat на ss не составит труда.
Чтобы получить список всех прослушиваемых портов с помощью ss , введите:
sudo ss -tunlp
Вывод почти такой же, как тот, который выдает netstat :
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=445,fd=3)) LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=929,fd=13)) LISTEN 0 128 *:3306 *:* users:(("mysqld",pid=534,fd=30)) LISTEN 0 128 *:80 *:* users:(("apache2",pid=765,fd=4),("apache2",pid=764,fd=4),("apache2",pid=515,fd=4)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=445,fd=4)) LISTEN 0 100 [::]:25 [::]:* users:(("master",pid=929,fd=14)) LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=534,fd=33))
Проверьте порты прослушивания с помощью lsof
lsof — мощная утилита командной строки, которая предоставляет информацию о файлах, открытых процессами.
В Linux всё является файлом. Можно представить себе сокет как файл, который записывает данные в сеть.
Чтобы получить список всех прослушиваемых TCP-портов с помощью команды lsof , введите:
sudo lsof -nP -iTCP -sTCP:LISTEN
Используются следующие варианты:
-
-n— Не преобразовывать номера портов в имена портов. -
-p— Не разрешать имена хостов, показывать числовые адреса. -
-iTCP -sTCP:LISTEN— показывать только сетевые файлы с состоянием TCP LISTEN.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 445 root 3u IPv4 16434 0t0 TCP *:22 (LISTEN) sshd 445 root 4u IPv6 16445 0t0 TCP *:22 (LISTEN) apache2 515 root 4u IPv6 16590 0t0 TCP *:80 (LISTEN) mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN) mysqld 534 mysql 33u IPv6 19973 0t0 TCP *:33060 (LISTEN) apache2 764 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN) apache2 765 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN) master 929 root 13u IPv4 19637 0t0 TCP *:25 (LISTEN) master 929 root 14u IPv6 19638 0t0 TCP *:25 (LISTEN)
Названия большинства выходных столбцов говорят сами за себя:
-
COMMAND,PID,USER— имя, pid и пользователь, запустивший программу, связанную с портом. -
NAME— Номер порта.
Чтобы узнать, какой процесс прослушивает определенный порт, например, порт 3306 можно использовать:
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
Вывод показывает, что сервер MySQL использует порт 3306 :
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN)
Для получения более подробной информации посетите страницу руководства lsof и прочитайте обо всех других мощных возможностях этого инструмента.
Заключение
Мы показали вам несколько команд, которые можно использовать для проверки того, какие порты используются в вашей системе, а также как узнать, какой процесс прослушивает определенный порт.
Если у вас есть вопросы или замечания, пожалуйста, оставьте комментарий ниже.
Связанные руководства