介紹如何在 Linux 中使用 netstat
、lsof
、ss
或 nmap
指令檢查系統連接埠(port)是否有被使用。
netstat
指令
netstat
指令可以用來查詢目前系統上處於傾聽(listen)狀態的連接埠:
# 查詢所有開啟的 TCP 與 UDP 連接埠 sudo netstat -tulpn | grep LISTEN
這裡所使用的參數意義如下:
-t
:列出 TCP 傳輸協定的連線。-u
:列出 UDP 傳輸協定的連線。-l
:列出傾聽(listen)狀態的埠口。-p
:列出使用連接埠的應用程式與 PID。-n
:顯示 IP 位址,不進行 DNS 查詢。
執行之後的輸出大致會像這樣:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1068/nginx: master tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 797/systemd-resolve tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1066/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 8870/cupsd tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 1012/postgres tcp6 0 0 :::80 :::* LISTEN 1068/nginx: master tcp6 0 0 :::22 :::* LISTEN 1066/sshd
在這個輸出中會包含傳輸協定(例如 tcp
)、傾聽位址與埠號(例如 0.0.0.0:22
),以及使用連接埠的應用程式與 PID(例如 1066/sshd
)。
lsof
指令
若要以 lsof
指令查詢目前系統上處於傾聽狀態的連接埠,可以執行:
# 查詢所有開啟的 TCP 與 UDP 連接埠 sudo lsof -i -P -n | grep LISTEN
這裡所使用的參數意義如下:
-i
:列出網路連線。-P
:以數值顯示連接埠號,不轉換為連接埠名稱。-n
:顯示 IP 位址,不進行 DNS 查詢。
執行之後的輸出大致會像這樣:
systemd-r 797 systemd-resolve 13u IPv4 18302 0t0 TCP 127.0.0.53:53 (LISTEN) postgres 1012 postgres 7u IPv4 23403 0t0 TCP 127.0.0.1:5432 (LISTEN) sshd 1066 root 3u IPv4 25805 0t0 TCP *:22 (LISTEN) sshd 1066 root 4u IPv6 25807 0t0 TCP *:22 (LISTEN) nginx 1068 root 6u IPv4 25810 0t0 TCP *:80 (LISTEN) nginx 1068 root 7u IPv6 25811 0t0 TCP *:80 (LISTEN) nginx 1069 www-data 6u IPv4 25810 0t0 TCP *:80 (LISTEN) nginx 1069 www-data 7u IPv6 25811 0t0 TCP *:80 (LISTEN) nginx 1070 www-data 6u IPv4 25810 0t0 TCP *:80 (LISTEN) nginx 1070 www-data 7u IPv6 25811 0t0 TCP *:80 (LISTEN) cupsd 8870 root 7u IPv4 501711 0t0 TCP 127.0.0.1:631 (LISTEN)
ss
指令
ss
指令的作用與參數用法都類似 netstat
指令,但是可以提供更多的細部資訊:
# 查詢所有開啟的 TCP 與 UDP 連接埠 sudo ss -tulpn | grep LISTEN
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1070,fd=6),("nginx",pid=1069,fd=6),("nginx",pid=1068,fd=6)) tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=797,fd=13)) tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1066,fd=3)) tcp LISTEN 0 5 127.0.0.1:631 0.0.0.0:* users:(("cupsd",pid=8870,fd=7)) tcp LISTEN 0 224 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=1012,fd=7)) tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=1070,fd=7),("nginx",pid=1069,fd=7),("nginx",pid=1068,fd=7)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1066,fd=4))
nmap
指令
nmap
指令是一個網路探測工具,可用於掃描本機所開啟的網路連接埠:
# 掃描 localhost 所有開啟的 TCP 與 UDP 連接埠 sudo nmap -sT -sU localhost
這裡的 -sT
與 -sU
參數分別代表針對 TCP 與 UDP 連線進行掃描,輸出會類似這樣:
Starting Nmap 7.60 ( https://nmap.org ) at 2021-04-27 08:58 CST Nmap scan report for localhost (127.0.0.1) Host is up (0.000055s latency). Not shown: 1994 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 631/tcp open ipp 5432/tcp open postgresql 631/udp open|filtered ipp 5353/udp open|filtered zeroconf Nmap done: 1 IP address (1 host up) scanned in 2.75 seconds
nmap
也可以用來從外部掃描特定主機所開啟的網路連接埠:
# 掃描 192.168.1.2 所有開啟的 TCP 與 UDP 連接埠 sudo nmap -sT -sU 192.168.1.2