無論是要解決網絡連接問題還是配置防火牆,第一件事是要檢查系統實際打開了哪些端口。
本文介紹了幾種快速查找 Linux
系統上哪些端口向外部開放的方法。
什麼是開放端口
監聽端口是應用程序監聽的網絡端口。你要得到的監聽端口名單通常可以通過如 ss
、netstat
或 lsof
命令查詢系統上網絡堆棧。每個監聽端口都可以使用防火牆打開或關閉(過濾)。
一般而言,開放端口是一個網絡端口,它接受來自遠程位置的傳入數據包。
例如:如果你正在運行的監聽端口 80、443 的 Web
服務器,並把這些端口在防火牆上對任何人開放。使用瀏覽器將能夠訪問託管在 Web 服務器上的網站。在這種情況下,80 和 443 都是開放端口。
開放端口可能會帶來安全風險,因爲攻擊者可以使用每個開放端口來利用漏洞或執行任何其他類型的攻擊。您應該只公開應用程序功能所需的端口,然後關閉所有其他端口。
使用 Nmap 命令檢查開放端口
Nmap 是功能強大的網絡掃描工具,可以掃描單個主機和大型網絡。它主要用於安全審覈和滲透測試。
Nmap 是端口掃描的首選工具。除端口掃描外,Nmap 還可以檢測 Mac 地址、操作系統類型、內核版本等。
從控制檯發出以下命令確定哪些端口正在監聽來自網絡的 TCP 連接:
$ sudo nmap -sT -p- 10.10.8.8
-sT
選項告訴 Nmap 掃描 TCP 端口, -p-
掃描所有端口(65535 個)。如果不使用 -p-
,Nmap
將僅掃描 1000 個端口。
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-09 23:10 CEST
Nmap scan report for 10.10.8.8
Host is up (0.0012s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:05:49:23 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds
以上顯示,只有端口 22、80 以及 8069 在目標系統上打開。
要掃描 UDP 端口,請使用 -sU
代替 -sT
:
$ sudo nmap -sU -p- 10.10.8.8
有關更多信息,請訪問 Nmap 手冊頁,並瞭解此工具的所有其他強大功能。
使用 Netcat 命令檢查開放端口
Netcat(或nc)是一種命令行工具,可以使用 TCP
或 UDP
協議跨網絡連接讀取和寫入數據。
使用 netcat 可以掃描單個端口或端口範圍。
例如,要掃描 IP 地址爲 10.10.8.8 的遠程計算機上端口範圍爲 20-80 之間打開的 TCP
端口,你可以使用以下命令:
$ nc -z -v 10.10.8.8 20-80
-z
選項指示 nc
僅掃描打開的端口,而不發送任何數據,並且 -v
用於獲取更多詳細信息。
輸出將如下所示:
nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused
nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
...
Connection to 10.10.8.8 80 port [tcp/http] succeeded!
如果只希望將以上開放端口的行打印在屏幕上,則可以使用 grep
命令過濾結果。
$ nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
Connection to 10.10.8.8 80 port [tcp/http] succeeded!
要掃描 UDP
端口,請將 -u
選項傳遞給 nc 命令:
$ nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded
使用 Bash 僞設備檢查打開的端口
檢查某個端口是打開還是關閉的另一種方法是使用 Bash Shell
檢查 /dev/tcp/..
或 /dev/udp/..
下的僞設備。
在 /dev/$PROTOCOL/$HOST/$IP
僞設備上執行命令時,Bash
將在指定端口上打開到指定主機的 TCP
或 UDP
連接。
以下 if..else
語句將檢查端口 443 在 kernel.org
是否打開:
if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
echo "Port is open"
else
echo "Port is closed"
fi
輸出將如下所示:
Port is open
上面的代碼如何工作?
使用僞設備連接到端口時的默認超時時間非常長,因此我們使用 timeout
命令在 5
秒後終止測試命令。如果建立了 kernel.org
端口連接,則 443
測試命令將返回 true。你也可以使用 for
循環來檢查指定的端口範圍:
for PORT in {20..80}; do
timeout 1 bash -c "</dev/tcp/10.10.8.8/$PORT &>/dev/null" && echo "port $PORT is open"
done
輸出將如下所示:
port 22 is open
port 80 is open
結論
我們爲你展示了幾種如何使用掃描開放端口的工具,當然你也可以使用其它工具來達到同樣的目的,例如:Python Socket
模塊、Curl
、Telnet
或 Wget
。