Gibt es einen ICMP-Echoanforderungsdienst?

Gibt es einen ICMP-Echoanforderungsdienst?

In den von mir entwickelten Anwendungen integriere ich häufig gerne einen Netzwerkstatusindikator für verschiedene Geräte im Netzwerk. Die einfachste Möglichkeit, diese Geräte zu überwachen, besteht darin, sie anzupingen. ICMP-Echos sind jedoch aufgrund von Sicherheitsanforderungen bei Raw Sockets oder Leistungsproblemen beim Ausgeben an häufig schwierig in eine Anwendung zu integrieren ping. Außerdem schreibe ich für Situationen, in denen dies kein Problem darstellt, leicht unterschiedliche Varianten desselben Ping-Codes für verschiedene Situationen.

Die meisten Geräte, die ich überwache, sind eingebettete Geräte mit minimalen Netzwerkfunktionen (die aber immer ICMP-Echo beinhalten), alsoTunmüssen sich an dieses Protokoll halten, Dinge wieEcho-Protokoll(Mark hat in den Kommentaren unten darauf hingewiesen, danke!) stehen mir normalerweise nicht zur Verfügung.

Gibt es bereits einen Dienst, der einer Nicht-Root-Anwendung ICMP-Ping-Dienste mit geringem Overhead bereitstellen kann?

Ich denke darüber nach, einen Dienst zu schreiben, der als Root ausgeführt wird und es anderen Nicht-Root-Anwendungen ermöglicht, sich damit zu verbinden, zu überwachende Geräte hinzuzufügen und dann Ping-Zeiten und den Netzwerkstatus abzufragen. Allerdings möchte ich das Rad nicht neu erfinden und frage mich, ob es so etwas schon gibt.

Antwort1

Die Antwort auf Ihre Frage ist wahrscheinlich „Nein, das gibt es nicht.“

Der Grund dafür ist, dass ICMP ein Low-Level-Protokoll ist und eine Anwendung privilegierten Zugriff auf Ihre Netzwerkschnittstelle benötigt, um ICMP-Verkehr zu erzeugen. Dies ist auf den meisten Systemen daran zu erkennen, dass die Binärdateien, die ICMP generieren, auf set-uid root gesetzt sind. Beachten Sie den Sticky-Bit:

$ 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

(Dies gilt für FreeBSD. Auf anderen Betriebssystemen können die Ergebnisse anders ausfallen.)

Damit eine Anwendung Netzwerkdatenverkehr generieren kann, muss sie als Root ausgeführt werden. Da /sbin/pingsie bereits als Root ausgeführt wird, ist es wahrscheinlich am besten, sie zum Generieren Ihrer Pings zu verwenden.

Wenn Sie dies für eine große Anzahl von Hosts tun, sollten Sie sich Folgendes ansehen:fpingEine andere Möglichkeit wäreTCP/IP, das TCP-Pakete generieren kann, die ähnliche Ergebnisse wie ein ICMP-Ping liefern. Voraussetzung dafür wäre ein offener Port auf dem Zielsystem, um das Paket zu empfangen. Möglicherweise können Sie dies verwenden oder den Ansatz basierend auf der Quelle replizieren. Beide sind möglicherweise bereits als Paket für Ihr Betriebssystem verfügbar.

Für eine Überwachungslösung größeren Ausmaßes,NagiosUndZabbixsind beliebte kostenlose Optionen, aber es gibt noch viele andere.

Antwort2

Vielleicht zu aufgebläht für das, was Sie suchen, aber die meisten vollwertigen Überwachungslösungen wie Nagios, Icinga oder Check_Mk ermöglichen ICMP-Überwachung und stellen oft APIs bereit, die Sie abfragen können.

Antwort3

Obwohl ICMP-Echo insofern gut ist, als es eine positive Antwort ist, können Sie Machine-Alive-Tests mit negativen Antworten wie „Port nicht erreichbar“ und „Protokoll nicht erreichbar“ durchführen, vorausgesetzt, Ihr Remote-Computer stellt diese bereit. Versuchen Sie:

  • connect()ing an einen ungenutzten TCP-Port
  • send()ing an einen unbenutzten UDP-Port

Sie sollten in der Lage sein, Folgendes auszuführen setsockopt(fd, IP_RECVERR, ...), um die Fehler sauber zurückzuerhalten, sowie eine spezielle Option, um die Fehler selbst zu empfangen. (Unter Linux finden Sie weitere Informationen unter manpage ip(7).)

Antwort4

Als aktualisierte Antwort auf diese ältere Frage ist es seit 2019 möglich, auf einer Linux-basierten Plattform eine Anwendung auf Benutzerebene zu erstellen, die pingAnfragen ausführen kann, ohne dass Root-Rechte erforderlich sind.

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

Wie funktioniert Ping unter Fedora ohne Setuid und Fähigkeiten?

Der Sysctl-Parameter des Linux-Kernels net.ipv4.ping_group_rangedefiniert einen numerischen Bereich von Benutzergruppen, die pingohne zusätzliche Berechtigungen oder Fähigkeiten Pakete senden und empfangen dürfen.

verwandte Informationen