如何在沒有進程 ID 的情況下找出 Ubuntu 伺服器的特定連接埠正在偵聽哪個服務?

如何在沒有進程 ID 的情況下找出 Ubuntu 伺服器的特定連接埠正在偵聽哪個服務?

我決定發布這個問題,儘管有很多類似的問題,但沒有一個回答我的問題。

  1. 我定期檢查我的伺服器偵聽的連接埠。
  2. 我的 ubuntu 作業系統的輸出為lsb_relase -a
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal
  1. 我運行該命令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         
  1. 我使用了許多工具和指南來找出為什麼我的伺服器正在偵聽連接埠51820但沒有找到答案。
  2. 我努力了:
    • 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                                                [::]:*  
  1. 我查看了以下答案,但沒有找到解決方案:

在網路上搜尋有關連接埠的資訊後,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- 跳過名稱後綴與模式匹配的任何命令列目錄。

以及具體的忽略sysproc目錄在我們的具體案例中 是為了避免不必要的輸出。

範例: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模式過濾器,它可以精確定位我們並加快解決速度,畢竟我們正在尋找數字作為模式,這可能會導致許多不必要的結果。
  • 如果您無法透過給定的輸出得出結論,請使用您找到的選定關鍵字在網路上進行搜尋。

相關內容