Thank you for reading this post, don't forget to subscribe!
При устранении неполадок сетевого подключения или проблем, связанных с конкретным приложением, в первую очередь следует проверить, какие порты фактически используются в вашей системе, а какое приложение прослушивает определенный порт.
В этой статье объясняется, как узнать, какие услуги прослушивает порты с помощью команд netstat, ss и lsof. Инструкции применимы для всех операционных систем на основе Linux и Unix, таких как macOS.
Что такое порт прослушивания
Сетевой порт идентифицируется его номером, соответствующим IP-адресом и типом протокола связи, таким как TCP или UDP.
Порт прослушивания – это сетевой порт, который прослушивает приложение или процесс, выступая в качестве конечной точки связи.
Каждый порт прослушивания может быть открыт или закрыт (отфильтрован) с помощью брандмауэра. В общих чертах, открытый порт – это сетевой порт, который принимает входящие пакеты из удаленных мест.
Вы не можете иметь две службы, прослушивающие один и тот же порт на одном и том же IP-адресе.
Например, если вы используете веб-сервер Apache, который прослушивает порты 80 и 443 и вы пытаетесь установить Nginx, позднее не удастся запустить, потому что порты HTTP и HTTPS уже используются.
Проверьте порты прослушивания с netstat
netstat это инструмент командной строки, который может предоставить информацию о сетевых подключениях
Чтобы получить список всех прослушиваемых портов TCP или UDP, включая службы, использующие порты и состояние сокета, используйте следующую команду:
1 |
sudo netstat -tunlp |
Параметры, используемые в этой команде, имеют следующее значение:
- -t – Показать порты TCP.
- -u – Показать порты UDP.
- -n – Показать числовые адреса вместо разрешения хостов.
- -l – Показывать только порты прослушивания.
- -p – Показать PID и имя процесса слушателя. Эта информация отображается, только если вы запускаете команду от имени пользователя root или sudo.
Вывод будет выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 |
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1214/nginx.conf tcp6 0 0 :::21 :::* LISTEN 1222/proftpd: (acce tcp6 0 0 :::53 :::* LISTEN 1089/named tcp6 0 0 ::1:953 :::* LISTEN 1089/named tcp6 0 0 :::28355 :::* LISTEN 1142/sshd udp6 0 0 :::53 :::* 1089/named udp6 0 0 ::1:123 :::* 1766/ntpd udp6 0 0 :::123 :::* 1766/ntpd |
Важными столбцами в нашем случае являются:
- Proto – Протокол, используемый сокетом.
- Local Address – IP-адрес и номер порта, на котором слушает процесс.
- PID/Program name – PID и название процесса.
Если вы хотите отфильтровать результаты, используйте команду grep . Например, чтобы узнать, какой процесс прослушивает TCP-порт 22, вы должны набрать:
1 |
sudo netstat -tnlp | grep :22 |
Выходные данные показывают, что на этой машине порт 22 используется сервером SSH:
1 2 |
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, просто наберите:
1 |
sudo ss -tunlp |
Вывод почти такой же, как тот, о котором сообщили netstat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:123 *:* users:(("ntpd",pid=1766,fd=17)) udp UNCONN 0 0 :::53 :::* users:(("named",pid=1089,fd=513),("named",pid=1089,fd=512)) udp UNCONN 0 0 ::1:123 :::* users:(("ntpd",pid=1766,fd=21)) udp UNCONN 0 0 :::123 :::* users:(("ntpd",pid=1766,fd=16)) tcp LISTEN 0 128 *:23455 *:* users:(("sshd",pid=1142,fd=3)) tcp LISTEN 0 32 :::21 :::* users:(("proftpd",pid=1222,fd=0)) tcp LISTEN 0 10 :::53 :::* users:(("named",pid=1089,fd=21)) tcp LISTEN 0 128 ::1:953 :::* users:(("named",pid=1089,fd=25)) tcp LISTEN 0 128 :::23455 :::* users:(("sshd",pid=1142,fd=4)) |
Проверьте порты прослушивания с lsof
lsof это мощная утилита командной строки, которая предоставляет информацию о файлах, открытых процессами.
В Linux все является файлом. Вы можете думать о сокете как о файле, который пишет в сеть.
Чтобы получить список всех прослушивающих TCP-портов, вызовите lsof:
1 |
sudo lsof -nP -iTCP -sTCP:LISTEN |
Используются следующие параметры:
- -n – Не конвертируйте номера портов в имена портов.
- -p – Не разрешайте имена хостов, показывайте числовые адреса.
- -iTCP -s TCP:LISTEN – Показывать только сетевые файлы с состоянием TCP LISTEN.
123456789101112131415COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnamed 1089 bind 21u IPv6 14401 0t0 TCP *:53 (LISTEN)named 1089 bind 22u IPv4 14405 0t0 TCP 127.0.0.1:53 (LISTEN)named 1089 bind 23u IPv4 14407 0t0 TCP 213.159.210.167:53 (LISTEN)named 1089 bind 24u IPv4 14447 0t0 TCP 127.0.0.1:953 (LISTEN)named 1089 bind 25u IPv6 14448 0t0 TCP [::1]:953 (LISTEN)named 1089 bind 26u IPv4 14120 0t0 TCP 172.17.0.1:53 (LISTEN)ihttpd 1187 root 6u IPv4 13799 0t0 TCP 213.159.210.167:2525 (LISTEN)nginx 1224 www-data 83u IPv4 14549 0t0 TCP *:80 (LISTEN)nginx 1224 www-data 84u IPv4 14550 0t0 TCP 213.159.210.167:443 (LISTEN)apache2 1242 root 3u IPv4 13929 0t0 TCP 127.0.0.1:8080 (LISTEN)apache2 6710 www-data 3u IPv4 13929 0t0 TCP 127.0.0.1:8080 (LISTEN)apache2 6714 www-data 3u IPv4 13929 0t0 TCP 127.0.0.1:8080 (LISTEN)shellinab 19516 root 4u IPv4 824033 0t0 TCP 127.0.0.1:52073 (LISTEN)...
Большинство имен выходных столбцов говорят сами за себя:
- COMMAND, PID, USER – имя, pid и пользователь , запустив программу, связанную с портом.
- NAME – номер порта.
Чтобы узнать, какой процесс прослушивает определенный порт, например, порт 3306, который вы используете:
1 |
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN |
Выходные данные показывают, что порт 3306 используется сервером MySQL:
1 2 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN) |
Для получения дополнительной информации посетите страницу руководства lsof и прочитайте обо всех других мощных опциях этого инструмента.