如何在沒有程序 ID 的情況下找出正在偵聽 Ubuntu 伺服器的特定埠的服務?
即使有很多類似的問題,我還是決定發布這個問題,但沒有一個回答我的問題。
- 我會定期檢查我的伺服器監聽的埠。
- 我的 ubuntu 作業系統通過以下輸出
lsb_relase -a
:Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal
- 我執行命令
netstat -tulpn4
,輸出顯示未知埠:tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 580/systemd-resolve tcp 0 0 0.0.0.0:62176 0.0.0.0:* LISTEN 900/sshd: /usr/sbin tcp 0 0 0.0.0.0:1122 0.0.0.0:* LISTEN 1158/sshd: username tcp 0 0 0.0.0.0:3333 0.0.0.0:* LISTEN 1158/sshd: username udp 0 0 0.0.0.0:51820 0.0.0.0:* - udp 0 0 127.0.0.53:53 0.0.0.0:* 580/systemd-resolve udp 0 0 X.X.X.X:1194 0.0.0.0:* 870/openvpn
- 我使用了許多工具和指南來找出為什麼我的伺服器正在偵聽埠
51820
而沒有找到答案。- 我試過了:
sudo lsof -i :51820
- 並得到一個空輸出。sudo netstat -ltnp | grep -w ':51820'
- 並得到一個空輸出。sudo fuser 51820/udp
- 並得到一個空輸出。sudo netstat -peanut | grep ":51820"
- 輸出是:udp 0 0 0.0.0.0:51820 0.0.0.0:* 0 26262 - udp6 0 0 :::51820 :::* 0 26263 -
sudo ss -nlp | grep 51820
輸出是:udp UNCONN 0 0 0.0.0.0:51820 0.0.0.0:* udp UNCONN 0 0 [::]:51820 [::]:*
- 我查看了以下答案並沒有找到解決方案:
在網上搜尋有關埠的資訊後,
51820
我發現它是我安裝的“wireguard”,它正在偵聽該埠,但問題與我嘗試過的任何命令一樣,我都找不到。
一般:
在圍繞這個問題進行了兩天的搜尋後,我發現像 Michael Hampton 和 Peter Zhabin 一樣,沒有通過偵聽埠顯示核心程序 ID 的現有解決方案。
此外,這兩天我還搜尋了一些
commands
可以帶來想要的答案的組合,但沒有找到簡單或方便的方法來做到這一點。我創建的解決方案是初步的,我相信社區成員可以改進它。
查找流程的折扣
- 該程序在核心級別或任何其他級別上執行,從而避免該程序具有 id (PID)。
- 給定命令的輸出未找到程序 ID 或程序程序:
lsof
,netstat
,ss
,fuser
。- 我們確實從上述命令的輸出中找到了一個監聽埠 - 但是我們無法配置導致監聽的程序或 pid。
關於
grep
:我們將使用它
grep
來查找有關開放埠的更多資訊。
grep
- 列印匹配模式的行。通過命令從
grep
手冊頁。man grep
DESCRIPTION grep searches for PATTERNS in each FILE. PATTERNS is one or more patterns separated by newline characters, and grep prints each line that matches a pattern. Typically PATTERNS should be quoted when grep is used in a shell command.
- 這是關於如何正確有效地使用命令的一個很好的主題。
如何通過以下方式定位 PID 或使用給定埠的程序
grep
:在我的情況下,執行
sudo grep --exclude-dir={sys,proc} -rnw / -e 51820 | grep -i port
解決了問題並顯示了有關使用埠的程序的分配資訊。給定的輸出:
iptables.service:6:ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT /home/username/wireguard-install.sh:238: read -p "Port [51820]: " port /home/username/wireguard-install.sh:241: read -p "Port [51820]: " port /home/username/wireguard-install.sh:243: [[ -z "$port" ]] && port="51820" /usr/share/doc/netplan/examples/wireguard.yaml:9: port: 51820 /etc/wireguard/wg0.conf:8:ListenPort = 51820 /etc/systemd/system/wg-iptables.service:6:ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT /etc/systemd/system/wg-iptables.service:10:ExecStop=/usr/sbin/iptables -D INPUT -p udp --dport 51820 -j ACCEPT
許多標誌的原因是我嘗試過的其他組合有大量不需要的輸出。
grep
命令參數代表什麼:
--exclude-dir
- 跳過名稱後綴與模式匹配的任何命令行目錄。在我們的特定情況下,特定的忽略
sys
和proc
目錄 是為了避免不需要的輸出。範例:
grep --exclude-dir={dir1,dir2}
將在搜尋過程中避開 dir1 和 dir2。
-r
或者-R
是遞歸的。-n
是行號。-w
代表匹配整個單詞。/
代表從上到下開始搜尋的“最高”目錄。-e
- 是搜尋過程中使用的模式。51820
在我們的特定情況下,是上面的網路監控命令之一找到的埠號。|
- 是將第一個命令部分的輸出重定向到第二個命令部分的管道。在我們的例子中:將
sudo grep --exclude-dir={sys,proc} -rnw / -e 51820
輸出重定向到下一個命令grep -i port
-i
- 忽略模式和輸入數據中的大小寫區別,使僅大小寫不同的字元相互匹配。port
- 發現是為了將結果縮小到我們執行搜尋的目的,查找有關在-e
標誌之後定義的特定埠的更多資訊。尖端:
- 通過從目錄開始並使用最小標誌來過濾輸出,在第一步中使掃描盡可能大
/
,以確保您不會錯過我們可以實現的任何細節。- 在找到想要的輸出或由於分配不需要的輸出而無法找到想要的輸出後,開始一一添加標誌。
- 指定埠號作為模式,畢竟這是我們的起點和終點。
- 使用雙重
grep
命令將第一次掃描重定向到port
模式過濾器,它可以查明我們並加快解決方案,畢竟我們正在尋找一個數字作為模式,這可能會導致許多不需要的結果。- 如果您無法通過給定的輸出得出結論,請使用您找到的選定關鍵字在網路上進行搜尋。
您正在執行將 Wireguard 實現為核心模組的作業系統。您的核心正在偵聽此埠,並且由於沒有程序擁有該套接字,因此沒有 PID 報告
netstat
。