A menudo, en las aplicaciones que desarrollo, me gusta incluir un indicador de estado de la red para varios dispositivos en la red. La forma más sencilla de monitorear estos dispositivos es haciendo ping. Pero los ecos ICMP suelen ser difíciles de integrar en una aplicación debido a requisitos de seguridad con sockets sin formato o problemas de rendimiento al desembolsar archivos ping
. Además, para situaciones en las que esto no es un problema, estoy escribiendo variaciones ligeramente diferentes del mismo código ping para diversas situaciones.
La mayoría de los dispositivos que superviso son dispositivos integrados con capacidades de red mínimas (pero siempre incluyen eco ICMP), por lo quehacerTengo que seguir este protocolo, cosas comoProtocolo de eco(señalado por Mark en los comentarios a continuación, ¡gracias!) generalmente no están disponibles para mí.
¿Existe ya algún servicio que pueda proporcionar servicios de ping ICMP de bajo costo a una aplicación que no sea raíz?
Estoy considerando escribir un servicio que se ejecute como root y permita que otras aplicaciones no root se conecten a él, agreguen dispositivos para monitorear y luego consulten los tiempos de ping y el estado de la red, pero no quiero reinventar una rueda y Me pregunto si ya existe algo como esto.
Respuesta1
La respuesta a su pregunta probablemente sea "No, no la hay".
La razón de esto es que ICMP es un protocolo de bajo nivel y, para producir tráfico ICMP, una aplicación necesita acceso privilegiado a su interfaz de red. Puede ver evidencia de esto en la mayoría de los sistemas por el hecho de que los binarios que generan ICMP están configurados como raíz. Tenga en cuenta la parte pegajosa:
$ 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
(Esto está en FreeBSD. Sus resultados en otros sistemas operativos pueden ser diferentes).
Para que una aplicación genere tráfico de red sin procesar, debe ejecutarse como root. Dado que /sbin/ping
ya se ejecuta como root, lo mejor es usarlo para generar sus pings.
Si está haciendo esto para una gran cantidad de hosts, es posible que desee consultarfping. Otra opción seríatcping, que puede generar paquetes TCP que proporcionan resultados similares a un ping ICMP. El requisito sería un puerto abierto en el sistema de destino para recibir el paquete. Es posible que pueda utilizar esto o replicar su enfoque según la fuente. Es posible que ambos ya estén disponibles como paquete para su sistema operativo.
Para una solución de monitoreo a mayor escala,NagiosyzabbixSon opciones gratuitas populares, pero hay muchas otras.
Respuesta2
Quizás demasiado inflado para lo que está buscando, pero la mayoría de las soluciones de monitoreo completas, como Nagios, icinga o check_mk, brindan monitoreo icmp y, a menudo, proporcionan API que puede consultar.
Respuesta3
Si bien el eco ICMP es bueno porque es una respuesta positiva, puede realizar pruebas de máquina activa con respuestas negativas, como puerto inalcanzable y protocolo inalcanzable, siempre que su máquina remota las proporcione. Intentar:
connect()
ing a un puerto TCP no utilizadosend()
Conexión a un puerto UDP no utilizado
Debería poder hacer una setsockopt(fd, IP_RECVERR, ...)
opción para recuperar los errores limpiamente y una opción especial para recibir los errores mismos. (En Linux, consulte la página de manual ip(7)
).
Respuesta4
Como respuesta actualizada a esta pregunta anterior, desde 2019 es posible crear una aplicación a nivel de usuario en una plataforma basada en Linux que puede realizar ping
solicitudes sin necesidad de privilegios de 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
¿Cómo funciona el ping en Fedora sin setuid ni capacidades?
El net.ipv4.ping_group_range
parámetro sysctl del kernel de Linux define un rango numérico de grupos de usuarios a los que se les permite enviar y recibir ping
paquetes sin permisos ni capacidades adicionales.