
我決定發布這個問題,儘管有很多類似的問題,但沒有一個回答我的問題。
- 我定期檢查我的伺服器偵聽的連接埠。
- 我的 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」正在該連接埠上偵聽,但問題仍然與我嘗試過的任何命令相同,我無法找到答案。
答案1
您正在運行的作業系統將 Wireguard 實作為內核模組。您的核心正在偵聽此端口,並且由於沒有進程擁有該套接字,因此 不會報告 PID netstat
。
答案2
一般:
經過兩天的搜索後,我圍繞這個問題進行了搜索,我發現像 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
模式過濾器,它可以精確定位我們並加快解決速度,畢竟我們正在尋找數字作為模式,這可能會導致許多不必要的結果。 - 如果您無法透過給定的輸出得出結論,請使用您找到的選定關鍵字在網路上進行搜尋。