Linux

如何關閉沒有附加程序的埠?

  • April 23, 2018

這個問題類似於網路埠打開,但沒有附加程序?netstat 顯示一個沒有 pid 但 lsof 沒有的監聽

我盡我所能(作為 root:netstat、lsof、ls -al /proc/*/fd 等),但我找不到 pid。

無論如何,我必須在沒有 pid 的情況下關閉或釋放埠,因為我的程序想要監聽它。無論如何都要這樣做嗎?

我不想重新啟動伺服器。因為我的系統中有一個程序,它會更新我所有伺服器中的 bin 文件,然後自動部署所有伺服器。當監聽 7123 或其他一些埠時,部署將失敗。

謝謝。

更多細節

在這種情況下有三台伺服器,它們都是 Rackspace 的伺服器,所有的“壞埠”都是 udp 埠​​ 7123。

重啟可以解決這個問題,我已經在這三台伺服器中的一台上試過了。但我不想重新啟動伺服器。

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp   213120      0 134.213.205.214:7123        0.0.0.0:*                           -

nmap 的結果顯示此埠未關閉。(@Enzo)

root@auto:~# nmap 134.213.205.214 -p 7123 -sU

Starting Nmap 6.40 ( http://nmap.org ) at 2018-04-16 12:01 UTC
Nmap scan report for auto (134.213.205.214)
Host is up.
PORT     STATE         SERVICE
7123/udp open|filtered unknown

Nmap done: 1 IP address (1 host up) scanned in 2.12 seconds

更新

目前,重新啟動是關閉/釋放此埠的唯一方法。但是重新啟動是一個壞主意,它會使服務停止。

您的系統可能在不一致的狀態下執行。我會先做一些基本的診斷。

檢查 UDP 套接字及其程序。

執行sudo netstat -lunpsudo ss -lunp查看該 UDP 套接字(在埠 7123 上)是否繁忙。普通sudo使用者需要提升權限並查看在該埠上“*偵聽”的 PID 和程序名稱。*沒有就會有一個代替PID和程序名。記下 PID。如果沒有列出,那麼您可以開始認為您的系統已被破壞,因為該程序能夠通過操縱程序的內部核心結構來隱藏其自身!如果您看不到具有高權限的 PID,則最好隔離該伺服器,因為它可能已被入侵和黑客攻擊。sudo``-

檢查監聽過程是否也在“說話

我建議使用nmap或更通用的netcat工具。你可以試試這個nmap命令:

sudo nmap -sV -v -Pn -sU -p U:7123 134.213.205.214

它試圖理解埠 UDP:7123 所使用的協議。sudo對於特定的掃描類型(UDP 服務掃描)是必需的。如果您看到的數據與您的預期不符,則很可能該過程已經失控或處於不一致的狀態。或者它被其他一些(惡意的?)程式碼所取代。

netcat您需要一些手動干預來生成到伺服器的流量:

netcat -u 134.213.205.214 7123

無論您輸入什麼,都將通過埠 UDP:7123 發送到您的應用程序。您還可以通過以下方式管道一些隨機數據(但不要期望任何有意義的結果):

cat /dev/urandom | netcat -u 134.213.205.214 7123

檢查系統和應用程序日誌(如果有)

前者通常儲存在/var/log/目錄中。應用程序日誌可以在其他任何地方。lsof如果您檢查其第 2 列的 PID,該工具可能會有所幫助。在後續操作中,我會密切關注這些日誌。

檢查該 PID 的程序表

該命令ps可以提供有關程序的許多詳細資訊。我個人最喜歡的是:

PS_FORMAT="ruser,pid,ppid,s,%cpu,rss,cmd" ps ax --sort=pid

您可以在第二列中看到您要查找的 PID,以及真實使用者 ID(ruser,第 1 列)、父 PID(ppid,第 3 列)、狀態(s,第 4 列)、% CPU 使用率( %cpu, 5th)、駐留集大小(rss, 6th) 和帶參數的命令行(cmd, 7th)。在我看來,對於這種情況,程序狀態(它是一個字母)和使用 CPU 的百分比是關鍵值,以及命令行。

檢查手冊頁以獲取所有詳細資訊ps並微調輸出。

檢查二進製文件

如果您有另一台具有相同架構和作業系統的機器以及以預期方式執行的相同程序,您可以檢查二進製文件是否逐字節匹配。如果他們不這樣做,您最好從已知的安全源重新安裝這些二進製文件。

假設程序是/usr/local/bin/myserver.
計算並記下它的校驗和。像這樣的東西:

sha512sum /usr/local/bin/myserver

如果程序已編譯為使用動態庫,那麼您還要檢查它們。使用的動態庫列表通過以下方式獲得:

ldd /usr/local/bin/myserver

請注意:輸出可能會很長,但是對於每一行,您都會計算並記下校驗和以進行比較。

如果發現與參考可信系統有任何差異,我建議重新安裝整個系統和應用程序。這是一種激進的方法,但我認為目標系統不再值得信任。

殺死並重新啟動程序

我會嘗試殺死流氓程序(前提是您知道它的 PID)並重新啟動它以檢查流氓行為是否存在。為了殺死一個給定 PID 的程序,你可以執行:

sudo kill -s SIGKILL <PID>

我需要警告您,在許多情況下,程序不會死或死的時間比預期的晚。它主要取決於ps之前執行的命令顯示的程序狀態。引用的手冊頁在“PROCESS STATE CODES”段落中報告了有關程序狀態列的一些資訊。

使用該命令ps再次檢查程序狀態。它通常應該在幾秒鐘內被踢出並從程序列表中消失。

一旦程序被殺死,您可以嘗試重新啟動它並查看流氓行為是否重複。

**作為一般經驗法則,如果您不對系統進行任何更改,則行為也幾乎不會改變。**也就是說,僅僅重新啟動應用程序或系統並不能解決問題:它只會被及時推進。

引用自:https://serverfault.com/questions/907781