Ваш сервер Linux работает, и вы хотите проверить, открыт ли определенный порт, чтобы получить к нему удаленный доступ. Проверка открытых портов – довольно распространенная задача для системных администраторов, и есть несколько способов сделать это в Linux.
В этой статье вы узнаете несколько способов проверить, открыт ли порт в Linux, чтобы выбрать те, которые лучше всего подходят для вас. Готовы? Продолжаем чтение!
Предпосылки
Этот учебник будет наглядным демонстрационным материалом. Если вы хотите следовать за нами, убедитесь, что у вас есть следующее.
- A Linux computer. This guide uses Ubuntu 20.04, but any recent Linux distribution should work.
- Доступ к терминалу. Если вы используете графическую среду рабочего стола, найдите программу эмулятора терминала в меню приложений. Или, если вы вошли на удаленный сервер через SSH,
- A user account with
sudo
privileges. For simplicity, this tutorial uses the root user.
Проверка открыт ли порт в Linux с использованием netstat
Первый способ проверить, открыт ли порт в Linux, заключается в выполнении команды netstat
. Эта команда отображает сетевые подключения, таблицы маршрутизации и множество статистических данных сетевых интерфейсов.
Команда netstat
является частью пакета net-tools
, и этот пакет может не поставляться по умолчанию с вашим дистрибутивом Linux. На Ubuntu установите netstat
, выполнив следующие команды в терминале.
Предположим, что у вас запущен веб-сервер NGINX, и вы хотите проверить, открыт ли порт 80
. Вы можете сделать это, выполнив следующую команду. Замените 80
на номер порта, который вы хотите проверить.
Флаги -tulpn
указывают netstat
отображать все прослушивающие порты. Первая команда grep
находит и фильтрует строку, содержащую слово LISTEN
в результате. Вторая команда grep
фильтрует результаты, отображая только те элементы, которые соответствуют :80
.
Чтобы узнать больше о флагах netstat, выполните команду netstat –help.
Если порт открыт, вы увидите следующий вывод. Как видите, вывод показывает, что порт 80 открыт в системе. tcp – это тип протокола, и :::80
указывает, что это порт TCPv6. 0.0.0.0:80
означает, что порт открыт для всех адресов IPv4. 80
– это порт HTTP по умолчанию, обслуживающий доступ к веб-сайту.

Проверка открыт ли порт с помощью ss
ss
– это еще одна утилита командной строки для проверки открытых портов. Эта команда отображает статистику сокетов, которую вы можете использовать для подтверждения открыт ли порт или нет. Команда ss
отображает больше информации о открытых портах, чем другие инструменты.
Как и команда netstat
, флаг -t
указывает ss
отображать только TCP-сокеты, -u
для отображения только UDP-сокетов, а -l
для отображения только прослушиваемых сокетов. Флаг -p
указывает имя процесса или PID, использующего порт.
Если порт открыт, вы увидите следующий вывод. Как видите, вывод содержит имя процесса и PID для каждого прослушиваемого порта. В данном случае порт 80 открыт, и его использует веб-сервер NGINX.

Проверка открытости порта с использованием lsof
Команда lsof
– еще один удобный инструмент для проверки открытых портов. Название lsof
означает список открытых файлов, который отображает информацию о файлах, открытых в системе. Эта информация включает дескрипторы файлов, идентификаторы процессов, идентификаторы пользователей и т.д.
Как информация о файлах помогает определить открыт ли порт? Вы, возможно, уже слышали фразу “все в Linux – это файл”, – и эта фраза имеет вес своего смысла.
Например, предположим, вы хотите проверить, открыт ли порт 22, и ваши пользователи могут подключаться к вашему серверу по SSH. Выполните следующую команду для отображения открытых файлов с активными соединениями на порту 22.
Флаг -i
указывает lsof
отображать все открытые интернет-сокеты. Флаг -P
показывает номера портов вместо имен служб. Флаг -n
подавляет DNS-запросы и поиск имен служб, поэтому вы увидите IP-адреса вместо имен удаленных хостов.
Если порт открыт, вы увидите следующий вывод. Как видите, вывод содержит информацию о:
1027 - это идентификатор процесса службы sshd.
root - это идентификатор пользователя, использующего порт.
3u и 4u - это дескрипторы файлов для IPv4 и IPv6 соответственно.
31035 и 31037 - это сетевые порты для IPv4 и IPv6 соответственно.
:22 указывает, что порт 22 открыт для всех адресов IPv4 и IPv6.
- (LISTEN) показывает, что порт прослушивает входящие соединения.
0t0 - это статус сокета, что означает, что сокет находится в состоянии LISTEN.

Проверка открытости порта с помощью nmap
До сих пор вы видели, как проверить, открыт ли порт в Linux с помощью командной строки. Но что если вы хотите проверить, открыт ли порт на удаленной машине? В этом случае вы можете использовать инструмент nmap
.
Но прежде чем запускать nmap
, имейте в виду, что этот инструмент может не быть частью стандартных пакетов в вашем дистрибутиве Linux. В этом случае сначала установите nmap
, выполнив следующую команду.
Теперь выполните следующую команду, чтобы проверить, открыт ли порт на удаленном компьютере. Эта команда тестирует, открыт ли порт 22
на 159.89.176.25
, чтобы ваш пользователь мог подключиться к серверу по SSH. При необходимости замените IP-адрес на свой.
Как видите, вывод содержит информацию о:
- Времени начала сканирования портов (2022-06-30 16:58 UTC).
- IP-адресе удаленного компьютера (159.89.176.25).
- Состоянии порта (открыт).
- Сервисе, использующем порт (ssh).
- Состоянии хоста (включен).

Результат подтверждает, что пользователи могут подключиться по SSH к компьютеру, используя IP-адрес и порт.
На скриншоте ниже показан успешный SSH-соединение с сервером, доказывающее, что порт 22 открыт.

Проверка открыт ли порт из сценария оболочки
Автоматизация всегда хорошая идея. Проверка открытых портов с помощью выполнения сценария оболочки – отличный способ проверить несколько портов. Вы можете использовать любые предыдущие методы, чтобы проверить, открыт ли порт. Но, для этого примера, вы напишете простой сценарий оболочки, который запускает команду Netcat nc
.
1. Создайте файл с именем check_port.sh в вашем домашнем каталоге с помощью выбранного вами текстового редактора. В этом примере используется nano.
2. Скопируйте приведенный ниже образец кода в свой редактор. Замените 80 номером порта, который вы хотите проверить.
Условие if проверяет, открыт ли порт 80 с помощью команды nc. 2>&1 и >/dev/null перенаправляют сообщения об ошибке и вывод на /dev/null соответственно. /dev/null – это специальный файл, который отбрасывает все, что он получает.
Если порт открыт, сценарий check_port.sh выведет на консоль Online. В противном случае сценарий выведет Offline.
Файл сценария должен выглядеть примерно как на скриншоте ниже. Сохраните сценарий и выйдите из редактора.

3. Запустите оболочечный сценарий, чтобы начать проверку открытых портов, указанных внутри сценария.
Вы увидите один из следующих выводов, в зависимости от того, открыт ли порт. В этом случае порт открыт, что подтверждает сообщение Онлайн.

Вы можете использовать этот сценарий оболочки, чтобы проверить, открыт ли порт с интервалом или по расписанию. Написание сценариев особенно полезно, когда вам нужно проверить несколько серверов. Вам нужно только скопировать этот сценарий check_port.sh на все серверы, которые вы хотите проверить, и запустить его с использованием инструментов CI/CD, таких как Jenkins или Ansible.
Тестирование открытого порта с использованием PowerShell
В PowerShell есть встроенный cmdlet для тестирования сетевых подключений, называемый Test-NetConnection
— но этот cmdlet доступен только на системах Windows. Не волнуйтесь; вы все равно можете использовать PowerShell в Linux для проверки открытых портов и подключений с использованием класса TcpClient.
Если у вашего компьютера Linux еще нет PowerShell, установите его, следуя инструкциям в этой документации Microsoft: Установка PowerShell в Linux.
1. Запустите PowerShell, выполнив нижеприведенную команду.

2. Затем создайте файл с именем Test-Port.ps1 с помощью вашего текстового редактора. В этом примере используется nano.
3. Затем скопируйте следующий код в ваш редактор. Сохраните файл и выйдите из редактора после этого.
Примечание: Этот код является отрывком из Инструмента тестирования портов All-in-One PowerShell.
4. После сохранения скрипта Test-Port.ps1 выполните нижеприведенную команду, чтобы протестировать порты 22, 80, 443 и 53.
Параметр -ComputerName принимает список имен хостов, полных доменных имен или IP-адресов целевой машины(иней).
Параметр -Port принимает массив одного или нескольких номеров портов для тестирования.
Как видно ниже, результат показывает, что порты 22 и 80 открыты (True), в то время как порт 443 не открыт (False).

Чтобы запустить тот же скрипт против нескольких конечных точек и портов, отредактируйте приведенный ниже код, чтобы добавить все целевые компьютеры в параметр ComputerName и номера портов в параметр Port.

Заключение
В этой статье вы узнали, как проверить, открыт ли порт или нет в Linux. Вы также научились проверять открыт ли порт с помощью оболочки и PowerShell. Теперь вы можете использовать любой из этих методов, чтобы проверить, открыт ли порт на вашем компьютере или на удаленной машине.
Не останавливайтесь на достигнутом. Ознакомьтесь с другими статьями по устранению неполадок, чтобы продолжить совершенствовать свои навыки системного администратора!
Source:
https://adamtheautomator.com/check-if-a-port-is-open-in-linux/