檢查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.

使用 netstat 檢查 Linux 中的端口是否開放

在 Linux 中檢查端口是否開放的第一種方法是運行 netstat 命令。該命令顯示網絡連接、路由表和許多網絡接口統計信息。

netstat 命令是 net-tools 套件的一部分,這個套件可能不會預設隨你的 Linux 發行版提供。在 Ubuntu 上,通過在終端中運行以下命令來安裝 netstat

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

假設您正在運行一個 NGINX Web 伺服器並且想要檢查端口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 Web 伺服器正在使用它。

Checking If a Port is Open Using ss

使用 lsof 檢查端口是否打開

lsof 命令是另一個方便的工具,用於檢查打開的端口。 lsof 名稱代表列出打開的文件,它顯示有關系統上打開的文件的信息。此信息包括文件描述符、進程 ID、使用者 ID 等。

列出打開的文件如何幫助您確定端口是否打開?您可能已經聽過“在 Linux 中,一切都是文件”的短語,而這句話的意思就是它所說的。

例如,假設您想要檢查端口 22 是否打開,您的使用者是否可以 SSH 登錄到您的伺服器。運行以下命令以列出在端口 22 上有活動連接的打開文件。

使用-i標誌指示lsof顯示所有開啟的Internet插座。 -P標誌顯示端口號而不是服務名稱。 -n標誌抑制DNS和服務名稱查找,因此您將看到IP地址而不是遠程主機名稱。

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

如果端口是開放的,您將看到以下輸出。 正如您所見,輸出包含有關的信息:

  • 1027是sshd服務的進程ID。
  • root是使用該端口的用戶ID。
  • 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

現在,運行以下命令檢查遠程機器上的端口是否開啟。此命令測試端口22159.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

結果確認用戶可以使用IP地址和端口通過SSH連接到計算機。

ssh [email protected] -p 22

下面的截圖顯示成功通過SSH連接到伺服器,證明端口22是開啟的。

SSHing into your server

從Shell腳本測試端口是否開啟

自動化始終是一個好主意。運行Shell腳本檢查多個端口是否開啟是測試的一種優秀方式。您可以使用任何以前的方法檢查端口是否開啟。但是,對於此示例,您將編寫一個運行Netcat nc命令的基本Shell腳本。

1. 使用您喜歡的文本編輯器在您的主目錄中創建一個名為check_port.sh的文件。此示例使用nano。

nano check_port.sh

2. 將下面的示例代碼複製到您的編輯器中。將80替換為您要檢查的端口號。

條件if使用nc命令檢查80端口是否打開。 2>&1和>/dev/null將錯誤和輸出消息分別重定向到/dev/null。 /dev/null是一個特殊文件,它會丟棄收到的所有內容。

如果端口打開,則check_port.sh腳本將在控制台上打印“在線”。否則,腳本將打印“離線”。

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

腳本文件應該與下面的屏幕截圖類似。保存腳本並退出編輯器。

Creating the Shell script

3. 运行shell脚本以开始检查脚本中指定的打开端口。

bash check_port.sh

根據端口是否打開,您將看到以下輸出之一。在這種情況下,端口已打開,消息在線確認了這一點。

Check if the 80 port is open

你可以使用這個 shell 腳本來檢查端口是否在一個間隔或定期工作中打開。 當你需要檢查多台伺服器時,腳本編寫尤其有幫助。 您只需將這個check_port.sh腳本複製到您想要檢查的所有伺服器上,並使用 CI/CD 工具,如 Jenkins 或 Ansible 來執行它。

使用 PowerShell 測試端口是否打開

PowerShell 內建了一個用於測試網路連接的 cmdlet,稱為Test-NetConnection,但該 cmdlet 僅在 Windows 系統上可用。 別擔心; 您仍然可以在 Linux 中使用 PowerShell 來檢查打開的端口和連接,使用TcpClient類。

如果您的 Linux 電腦尚未安裝 PowerShell,請按照此 Microsoft 文件中的說明安裝:在 Linux 上安裝 PowerShell

1. 通過執行下面的命令啟動 PowerShell。

pwsh
Launching PowerShell

2. 接下來,使用您的文本編輯器創建一個名為 Test-Port.ps1 的文件。 本示例使用 nano。

nano Test-Port.ps1

3. 接下來,將下面的代碼複製到您的編輯器中。 保存文件並在退出編輯器後退出。

注意:此代碼是一個全能 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
		
		此示例在 LABDC 和 LABDC2 伺服器上測試 TCP 網路端口 80 和 443。
	#>
[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 參數接受目標機器的主機名、完全限定域名(FQDN)或 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 中檢查端口是否開放。您還學會了如何從 shell 腳本和 PowerShell 檢查端口是否開放。現在,您可以使用任何這些方法來檢查您的機器或任何遠程機器上的端口是否開放。

但別停在這裡。不妨查看其他 故障排除 文章,以繼續提升您的系統管理技能!

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