Existe um serviço de solicitação de eco ICMP?

Existe um serviço de solicitação de eco ICMP?

Muitas vezes, em aplicações que desenvolvo, gosto de incluir um indicador de status de rede para vários dispositivos na rede. A maneira mais fácil de monitorar esses dispositivos é fazendo ping neles. Mas os ecos ICMP costumam ser difíceis de integrar em um aplicativo devido a requisitos de segurança com soquetes brutos ou a problemas de desempenho com gastos com ping. Além disso, para situações em que isso não é um problema, estou escrevendo variações ligeiramente diferentes do mesmo código de ping para várias situações.

A maioria dos dispositivos que monitoro são dispositivos incorporados com recursos mínimos de rede (mas sempre incluem eco ICMP), entãofazertem que seguir este protocolo, coisas comoProtocolo de eco(apontado por Mark nos comentários abaixo, obrigado!) geralmente não estão disponíveis para mim.

Já existe um serviço que pode fornecer serviços de ping ICMP de baixa sobrecarga para um aplicativo não raiz?

Estou pensando em escrever um serviço que seja executado como root e permita que outros aplicativos não-root se conectem a ele, adicionem dispositivos para monitorar e consultem os tempos de ping e o status da rede a partir dele, mas não quero reinventar uma roda e eu estou me perguntando se algo assim já existe.

Responder1

A resposta à sua pergunta é provavelmente “Não, não existe”.

A razão para isso é que o ICMP é um protocolo de baixo nível e, para produzir tráfego ICMP, um aplicativo precisa de acesso privilegiado à sua interface de rede. Você pode ver evidências disso na maioria dos sistemas pelo fato de que os binários que geram ICMP são set-uid root. Observe a 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

(Isso ocorre no FreeBSD. Seus resultados em outros sistemas operacionais podem ser diferentes.)

Para que um aplicativo gere tráfego de rede bruto, ele precisa ser executado como root. Como /sbin/pingjá roda como root, sua melhor aposta é usá-lo para gerar seus pings.

Se você estiver fazendo isso para um grande número de hosts, talvez queira dar uma olhada emfping. Outra opção seriatcping, que pode gerar pacotes TCP que fornecem resultados semelhantes a um ping ICMP. O requisito seria uma porta aberta no sistema de destino para receber o pacote. Você pode usar isso ou replicar sua abordagem com base na fonte. Ambos já podem estar disponíveis como um pacote para o seu sistema operacional.

Para uma solução de monitoramento em maior escala,NagioseZabbixsão opções gratuitas populares, mas existem muitas outras.

Responder2

Talvez muito inchado para o que você está procurando, mas a maioria das soluções de monitoramento completas, como Nagios, icinga ou check_mk, fornecem monitoramento icmp e geralmente fornecem APIs que você pode consultar.

Responder3

Embora o eco ICMP seja bom por ser uma resposta positiva, você pode fazer testes de máquina ativa com respostas negativas, como porta inacessível e protocolo inacessível, desde que sua máquina remota os forneça. Tentar:

  • connect()indo para uma porta TCP não utilizada
  • send()indo para uma porta UDP não utilizada

Você deve ser capaz de fazer um setsockopt(fd, IP_RECVERR, ...)para recuperar os erros de forma limpa e uma opção especial para receber os próprios erros. (No Linux, consulte a página de manual ip(7).)

Responder4

Como resposta atualizada a esta pergunta antiga, desde 2019 é possível criar uma aplicação de nível de usuário em uma plataforma baseada em Linux que pode realizar pingsolicitações sem a necessidade de privilégios 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

Como o ping funciona no Fedora sem setuid e recursos?

O parâmetro sysctl do kernel Linux net.ipv4.ping_group_rangedefine um intervalo numérico de grupos de usuários que têm permissão para enviar e receber pingpacotes sem permissões ou recursos adicionais.

informação relacionada