Введение
При попытке устранить проблемы с сетевым подключением или проблемы, связанные с конкретными приложениями, в первую очередь следует проверить (проверить), какие порты фактически используются в системе и какие приложения прослушивают определенный порт.
В этой статье объясняется, как узнать и контролировать, какие службы прослушивают порты, используя команды netstat, sse и 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.
Вывод будет выглядеть следующим образом:
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 5469/systemd-resolv
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1304/sshd
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 21662/mysqld
tcp6 0 0:::22:::* LISTEN 1304/sshd
udp 0 0 127.0.0.53:53 0.0.0.0:* 5469/systemd-resolv
udp 0 0 0.0.0.0:68 0.0.0.0:* 811/dhclient
Важными столбцами в нашем случае являются:
- Proto — протокол, используемый сокетом.
- Локальный адрес — IP-адрес и номер порта, на котором прослушивается процесс.
- PID/имя программы — PID и имя процесса.
Если вы хотите отфильтровать результаты, используйте команду grep. Например, чтобы узнать, какой процесс прослушивает TCP-порт 22, введите:
sudo netstat -tnlp | grep:22
Вывод показывает, что на этой машине порт 22 используется сервером SSH:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1304/sshd
tcp6 0 0:::22:::* LISTEN 1304/sshd
Если вывод пуст, порт ничего не прослушивает.
Вы также можете отфильтровать список на основе таких критериев, как PID, протокол, статус и т. д.
netstat устарел и заменен на ss и ip, но по-прежнему является одной из наиболее часто используемых команд для проверки сетевых подключений.
Проверьте порты прослушивания с помощью ss
ss — это новый netstat. Ему не хватает некоторых функций netstat, но он предоставляет больше состояний TCP и немного быстрее. Опции команды в основном одинаковые, так что переключиться с netstat на ss не составит труда.
Чтобы получить список всех прослушиваемых портов, введите ss:
sudo ss -tunlp
Вывод аналогичен тому, что сообщает netstat:
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=5469,fd=12))
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=811,fd=6))
tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=5469,fd=13))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1304,fd=3))
tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=21662,fd=28))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1304,fd=4))
Проверьте порты прослушивания с помощью 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 1304 root 3u IPv4 19961 0t0 TCP *:22 (LISTEN)
sshd 1304 root 4u IPv6 19976 0t0 TCP *:22 (LISTEN)
systemd-r 5469 systemd-resolve 13u IPv4 3618073 0t0 TCP 127.0.0.53:53 (LISTEN)
mysqld 21662 mysql 28u IPv4 46021 0t0 TCP 127.0.0.1:3306 (LISTEN)
Большинство имен выходных столбцов говорят сами за себя:
- COMMAND, PID, USER — имя, PID и пользователь, запускающий программу, связанную с портом.
- ИМЯ — номер порта.
Чтобы узнать, какой процесс прослушивает определенный порт, например, порт 3306, используйте следующую команду:
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
Вывод показывает, что порт 3306 используется сервером MySQL:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 21662 mysql 28u IPv4 46021 0t0 TCP 127.0.0.1:3306 (LISTEN)
Для получения дополнительной информации посетите справочную страницу lsof и ознакомьтесь со всеми другими мощными опциями этого инструмента.
Вывод
Мы видели несколько команд, которые вы можете использовать, чтобы проверить, какие порты используются в вашей системе, и как узнать, какой процесс прослушивает определенный порт.