是否有 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数据包而无需额外权限或功能的用户组的数字范围。

相关内容