ВВсе спсеос спобыос проверобы проверить, открыт ли порт в Linuxки открытости порта в Linux

Ваш сервер 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, выполнив следующие команды в терминале.

apt update -y && apt install net-tools -y

Предположим, что у вас запущен веб-сервер NGINX, и вы хотите проверить, открыт ли порт 80. Вы можете сделать это, выполнив следующую команду. Замените 80 на номер порта, который вы хотите проверить.

Флаги -tulpn указывают netstat отображать все прослушивающие порты. Первая команда grep находит и фильтрует строку, содержащую слово LISTEN в результате. Вторая команда grep фильтрует результаты, отображая только те элементы, которые соответствуют :80.

netstat -tulpn | grep LISTEN | grep :80

Чтобы узнать больше о флагах netstat, выполните команду netstat –help.

Если порт открыт, вы увидите следующий вывод. Как видите, вывод показывает, что порт 80 открыт в системе. tcp – это тип протокола, и :::80 указывает, что это порт TCPv6. 0.0.0.0:80 означает, что порт открыт для всех адресов IPv4. 80 – это порт HTTP по умолчанию, обслуживающий доступ к веб-сайту.

Checking If a Port is Open with netstat

Проверка открыт ли порт с помощью ss

ss – это еще одна утилита командной строки для проверки открытых портов. Эта команда отображает статистику сокетов, которую вы можете использовать для подтверждения открыт ли порт или нет. Команда ss отображает больше информации о открытых портах, чем другие инструменты.

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

ss -tulpn | grep LISTEN | grep :80

Если порт открыт, вы увидите следующий вывод. Как видите, вывод содержит имя процесса и PID для каждого прослушиваемого порта. В данном случае порт 80 открыт, и его использует веб-сервер NGINX.

Checking If a Port is Open Using ss

Проверка открытости порта с использованием lsof

Команда lsof – еще один удобный инструмент для проверки открытых портов. Название lsof означает список открытых файлов, который отображает информацию о файлах, открытых в системе. Эта информация включает дескрипторы файлов, идентификаторы процессов, идентификаторы пользователей и т.д.

Как информация о файлах помогает определить открыт ли порт? Вы, возможно, уже слышали фразу “все в Linux – это файл”, – и эта фраза имеет вес своего смысла.

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

Флаг -i указывает lsof отображать все открытые интернет-сокеты. Флаг -P показывает номера портов вместо имен служб. Флаг -n подавляет DNS-запросы и поиск имен служб, поэтому вы увидите IP-адреса вместо имен удаленных хостов.

lsof -i -P -n | grep LISTEN | grep :22

Если порт открыт, вы увидите следующий вывод. Как видите, вывод содержит информацию о:

  • 1027 - это идентификатор процесса службы sshd.
  • root - это идентификатор пользователя, использующего порт.
  • 3u и 4u - это дескрипторы файлов для IPv4 и IPv6 соответственно.
  • 31035 и 31037 - это сетевые порты для IPv4 и IPv6 соответственно.
  • :22 указывает, что порт 22 открыт для всех адресов IPv4 и IPv6.
  • (LISTEN) показывает, что порт прослушивает входящие соединения.
  • 0t0 - это статус сокета, что означает, что сокет находится в состоянии LISTEN.
Checking If a Port is Open Using lsof

Проверка открытости порта с помощью nmap

До сих пор вы видели, как проверить, открыт ли порт в Linux с помощью командной строки. Но что если вы хотите проверить, открыт ли порт на удаленной машине? В этом случае вы можете использовать инструмент nmap.

Но прежде чем запускать nmap, имейте в виду, что этот инструмент может не быть частью стандартных пакетов в вашем дистрибутиве Linux. В этом случае сначала установите nmap, выполнив следующую команду.

apt install nmap -y

Теперь выполните следующую команду, чтобы проверить, открыт ли порт на удаленном компьютере. Эта команда тестирует, открыт ли порт 22 на 159.89.176.25, чтобы ваш пользователь мог подключиться к серверу по SSH. При необходимости замените IP-адрес на свой.

nmap -p 22 159.89.176.25

Как видите, вывод содержит информацию о:

  • Времени начала сканирования портов (2022-06-30 16:58 UTC).
  • IP-адресе удаленного компьютера (159.89.176.25).
  • Состоянии порта (открыт).
  • Сервисе, использующем порт (ssh).
  • Состоянии хоста (включен).
Checking If a Port is Open Using nmap

Результат подтверждает, что пользователи могут подключиться по SSH к компьютеру, используя IP-адрес и порт.

ssh [email protected] -p 22

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

SSHing into your server

Проверка открыт ли порт из сценария оболочки

Автоматизация всегда хорошая идея. Проверка открытых портов с помощью выполнения сценария оболочки – отличный способ проверить несколько портов. Вы можете использовать любые предыдущие методы, чтобы проверить, открыт ли порт. Но, для этого примера, вы напишете простой сценарий оболочки, который запускает команду Netcat nc.

1. Создайте файл с именем check_port.sh в вашем домашнем каталоге с помощью выбранного вами текстового редактора. В этом примере используется nano.

nano check_port.sh

2. Скопируйте приведенный ниже образец кода в свой редактор. Замените 80 номером порта, который вы хотите проверить.

Условие if проверяет, открыт ли порт 80 с помощью команды nc. 2>&1 и >/dev/null перенаправляют сообщения об ошибке и вывод на /dev/null соответственно. /dev/null – это специальный файл, который отбрасывает все, что он получает.

Если порт открыт, сценарий check_port.sh выведет на консоль Online. В противном случае сценарий выведет Offline.

if ( nc -zv localhost 80 2>&1 >/dev/null ); then
    echo 'Online'
else
    echo 'Offline'
fi

Файл сценария должен выглядеть примерно как на скриншоте ниже. Сохраните сценарий и выйдите из редактора.

Creating the Shell script

3. Запустите оболочечный сценарий, чтобы начать проверку открытых портов, указанных внутри сценария.

bash check_port.sh

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

Check if the 80 port is open

Вы можете использовать этот сценарий оболочки, чтобы проверить, открыт ли порт с интервалом или по расписанию. Написание сценариев особенно полезно, когда вам нужно проверить несколько серверов. Вам нужно только скопировать этот сценарий check_port.sh на все серверы, которые вы хотите проверить, и запустить его с использованием инструментов CI/CD, таких как Jenkins или Ansible.

Тестирование открытого порта с использованием PowerShell

В PowerShell есть встроенный cmdlet для тестирования сетевых подключений, называемый Test-NetConnection — но этот cmdlet доступен только на системах Windows. Не волнуйтесь; вы все равно можете использовать PowerShell в Linux для проверки открытых портов и подключений с использованием класса TcpClient.

Если у вашего компьютера Linux еще нет PowerShell, установите его, следуя инструкциям в этой документации Microsoft: Установка PowerShell в Linux.

1. Запустите PowerShell, выполнив нижеприведенную команду.

pwsh
Launching PowerShell

2. Затем создайте файл с именем Test-Port.ps1 с помощью вашего текстового редактора. В этом примере используется nano.

nano Test-Port.ps1

3. Затем скопируйте следующий код в ваш редактор. Сохраните файл и выйдите из редактора после этого.

Примечание: Этот код является отрывком из Инструмента тестирования портов All-in-One PowerShell.

<#
	.SYNOPSIS
		Эта функция тестирует открытые TCP/UDP порты.
	.DESCRIPTION
		Эта функция тестирует любой TCP/UDP порт, чтобы узнать, открыт он или закрыт.
	.NOTES

	.PARAMETER Computername
		Один или несколько удаленных компьютерных имен, разделенных запятыми
	.PARAMETER Port
		Один или несколько номеров портов, разделенных запятыми, которые вы хотели бы протестировать.
	.PARAMETER TcpTimeout
		Количество миллисекунд, которое функция будет ждать, прежде чем объявить
		закрытый TCP порт. По умолчанию 1000.
	.EXAMPLE
		PS> Test-Port -Computername 'LABDC','LABDC2' -Protocol TCP 80,443
		
		В этом примере тестируются TCP сетевые порты 80 и 443 на серверах LABDC
		и LABDC2.
	#>
[CmdletBinding()]
[OutputType([System.Management.Automation.PSCustomObject])]
param (
    [Parameter(Mandatory)]
    [string[]]$ComputerName,
    [Parameter(Mandatory)]
    [int[]]$Port,
    [Parameter()]
    [int]$TcpTimeout = 1000
)
begin {
    $Protocol = 'TCP'
}
process {
    foreach ($Computer in $ComputerName) {
        foreach ($Portx in $Port) {            
            $Output = @{ 'Computername' = $Computer; 'Port' = $Portx; 'Protocol' = $Protocol; 'Result' = '' }
            Write-Verbose "$($MyInvocation.MyCommand.Name) - Beginning port test on '$Computer' on port '$Protocol<code>:$Portx'"

            $TcpClient = New-Object System.Net.Sockets.TcpClient
            $Connect = $TcpClient.BeginConnect($Computer, $Portx, $null, $null)
            $Wait = $Connect.AsyncWaitHandle.WaitOne($TcpTimeout, $false)
            if (!$Wait -or !($TcpClient.Connected)) {
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' failed port test on port '$Protocol</code>:$Portx'"
                $Output.Result = $false
            }
            else {
                $TcpClient.EndConnect($Connect)
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' passed port test on port '$Protocol<code>:$Portx'"
                $Output.Result = $true
                $TcpClient.Close()
                $TcpClient.Dispose()
            }
            [pscustomobject]$Output
        }
    }
}

4. После сохранения скрипта Test-Port.ps1 выполните нижеприведенную команду, чтобы протестировать порты 22, 80, 443 и 53.

Параметр -ComputerName принимает список имен хостов, полных доменных имен или IP-адресов целевой машины(иней).

Параметр -Port принимает массив одного или нескольких номеров портов для тестирования.

./Test-Port.ps1 -ComputerName localhost -Port 22,80,443

Как видно ниже, результат показывает, что порты 22 и 80 открыты (True), в то время как порт 443 не открыт (False).

Checking for open ports using PowerShell scripting

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

./Test-Port.ps1 `
    -ComputerName adamtheautomator.com,localhost,8.8.8.8 `
    -Port 22,80,443,53
Checking for open ports on multiple targets using PowerShell scripting

Заключение

В этой статье вы узнали, как проверить, открыт ли порт или нет в Linux. Вы также научились проверять открыт ли порт с помощью оболочки и PowerShell. Теперь вы можете использовать любой из этих методов, чтобы проверить, открыт ли порт на вашем компьютере или на удаленной машине.

Не останавливайтесь на достигнутом. Ознакомьтесь с другими статьями по устранению неполадок, чтобы продолжить совершенствовать свои навыки системного администратора!

Source:
https://adamtheautomator.com/check-if-a-port-is-open-in-linux/