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

使用 lsof 檢查端口是否打開
lsof
命令是另一個方便的工具,用於檢查打開的端口。 lsof
名稱代表列出打開的文件,它顯示有關系統上打開的文件的信息。此信息包括文件描述符、進程 ID、使用者 ID 等。
列出打開的文件如何幫助您確定端口是否打開?您可能已經聽過“在 Linux 中,一切都是文件”的短語,而這句話的意思就是它所說的。
例如,假設您想要檢查端口 22 是否打開,您的使用者是否可以 SSH 登錄到您的伺服器。運行以下命令以列出在端口 22 上有活動連接的打開文件。
使用-i
標誌指示lsof
顯示所有開啟的Internet插座。 -P
標誌顯示端口號而不是服務名稱。 -n
標誌抑制DNS和服務名稱查找,因此您將看到IP地址而不是遠程主機名稱。
如果端口是開放的,您將看到以下輸出。 正如您所見,輸出包含有關的信息:
1027是sshd服務的進程ID。
root是使用該端口的用戶ID。
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)。
- 主機的狀態(上線)。

結果確認用戶可以使用IP地址和端口通過SSH連接到計算機。
下面的截圖顯示成功通過SSH連接到伺服器,證明端口22是開啟的。

從Shell腳本測試端口是否開啟
自動化始終是一個好主意。運行Shell腳本檢查多個端口是否開啟是測試的一種優秀方式。您可以使用任何以前的方法檢查端口是否開啟。但是,對於此示例,您將編寫一個運行Netcat nc
命令的基本Shell腳本。
1. 使用您喜歡的文本編輯器在您的主目錄中創建一個名為check_port.sh的文件。此示例使用nano。
2. 將下面的示例代碼複製到您的編輯器中。將80替換為您要檢查的端口號。
條件if使用nc命令檢查80端口是否打開。 2>&1和>/dev/null將錯誤和輸出消息分別重定向到/dev/null。 /dev/null是一個特殊文件,它會丟棄收到的所有內容。
如果端口打開,則check_port.sh腳本將在控制台上打印“在線”。否則,腳本將打印“離線”。
腳本文件應該與下面的屏幕截圖類似。保存腳本並退出編輯器。

3. 运行shell脚本以开始检查脚本中指定的打开端口。
根據端口是否打開,您將看到以下輸出之一。在這種情況下,端口已打開,消息在線
確認了這一點。

你可以使用這個 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。

2. 接下來,使用您的文本編輯器創建一個名為 Test-Port.ps1 的文件。 本示例使用 nano。
3. 接下來,將下面的代碼複製到您的編輯器中。 保存文件並在退出編輯器後退出。
注意:此代碼是一個全能 PowerShell 測試端口測試工具的一部分。
4. 保存 Test-Port.ps1 腳本後,執行以下命令來測試端口 22、80、443 和 53。
-ComputerName 參數接受目標機器的主機名、完全限定域名(FQDN)或 IP 地址的列表。
-Port 參數接受一個或多個要測試的端口號的數組。
如下所示,結果顯示端口 22 和 80 是開放的(True),而端口 443 則不是(False)。

要對多個目標端點和端口運行相同的腳本,請編輯下面的代碼,將所有目標計算機添加到 ComputerName 參數中,並將端口號添加到 Port 參數中。

結論
在這篇文章中,您已經學會如何在 Linux 中檢查端口是否開放。您還學會了如何從 shell 腳本和 PowerShell 檢查端口是否開放。現在,您可以使用任何這些方法來檢查您的機器或任何遠程機器上的端口是否開放。
但別停在這裡。不妨查看其他 故障排除 文章,以繼續提升您的系統管理技能!
Source:
https://adamtheautomator.com/check-if-a-port-is-open-in-linux/