是否有 ICMP 回顯請求服務?

是否有 ICMP 回顯請求服務?

通常,在我開發的應用程式中,我喜歡包含網路上各種裝置的網路狀態指示器。監控這些設備最簡單的方法是對它們執行 ping 操作。但由於原始套接字的安全要求,或由於ping.另外,對於這不是問題的情況,我會針對不同情況編寫相同 ping 程式碼的略有不同的變體。

我監控的大多數設備都是具有最小網路功能的嵌入式設備(但始終包括 ICMP 回顯),因此我必須遵守這個協議,例如迴聲協議(馬克在下面的評論中指出,謝謝!)我通常無法使用。

是否存在可以向非根應用程式提供低開銷 ICMP ping 服務的現有服務?

我正在考慮編寫一個以 root 身份運行的服務,並允許其他非 root 應用程式連接到它,添加要監視的設備,然後從中查詢 ping 時間和網路狀態,但我不想重新發明輪子,我想知道這樣的東西是否已經存在。

答案1

您的問題的答案可能是“不,沒有”。

原因是 ICMP 是低階協議,為了產生 ICMP 流量,應用程式需要對網路介面進行特權存取。您可以在大多數系統上看到這一點,因為產生 ICMP 的二進位檔案是 set-uid root。注意黏性位:

$ ls -l /sbin/ping /usr/sbin/traceroute
-r-sr-xr-x  1 root  wheel  28088 Aug 12 12:19 /sbin/ping
-r-sr-xr-x  1 root  wheel  28608 Aug 12 12:20 /usr/sbin/traceroute

(這是在 FreeBSD 上進行的。在其他作業系統上的結果可能會有所不同。)

對於產生原始網路流量的應用程序,它需要以 root 身分運行。由於/sbin/ping已經以 root 身份運行,因此最好的選擇可能是使用它來產生 ping。

如果您要為大量主機執行此操作,您可能需要查看。另一個選擇是tcping,它可以產生 TCP 封包,提供與 ICMP ping 類似的結果。要求是目標系統上有一個開放連接埠來接收資料包。您也許可以使用此方法或根據來源複製其方法。這兩者可能已經作為適用於您的作業系統的軟體包提供。

對於更大規模的監控解決方案,納吉奧斯札比克斯是流行的免費選項,但還有許多其他選項。

答案2

也許對於您正在尋找的內容來說太臃腫,但大多數成熟的監控解決方案(例如 Nagios、icinga 或 check_mk)都提供 icmp 監控,並且通常提供您可以查詢的 API。

答案3

雖然 ICMP 回顯很好,因為它是肯定答复,但您可以使用否定答复(例如端口無法訪問和協議無法訪問)進行機器活動測試,前提是您的遠端計算機提供了這些測試。嘗試:

  • connect()存取未使用的 TCP 連接埠
  • send()訪問未使用的 UDP 端口

您應該能夠執行以下操作setsockopt(fd, IP_RECVERR, ...)以便乾淨地恢復錯誤,並使用特殊選項來接收錯誤本身。 (在 Linux 上,請參閱手冊頁ip(7)。)

答案4

作為這個舊問題的更新答案,自 2019 年以來,可以在基於 Linux 的平台上創建用戶級應用程序,ping無需 root 權限即可執行請求。

ls -l /bin/ping
-rwxr-xr-x 1 root root 55720 Mar  8  2021 /bin/ping

ping -c1 google.co.uk
PING google.co.uk(lhr48s27-in-x03.1e100.net (2a00:1450:4009:815::2003)) 56 data bytes
64 bytes from lhr35s11-in-x03.1e100.net (2a00:1450:4009:815::2003): icmp_seq=1 ttl=119 time=13.0 ms

--- google.co.uk ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 13.047/13.047/13.047/0.000 ms

如果沒有 setuid 和功能,Ping 在 Fedora 上如何運作?

Linux 核心的net.ipv4.ping_group_rangesysctl 參數定義了允許傳送和接收ping封包而無需額外權限或功能的使用者群組的數字範圍。

相關內容