저는 종종 제가 개발하는 애플리케이션에 네트워크의 다양한 장치에 대한 네트워크 상태 표시기를 포함시키는 것을 좋아합니다. 이러한 장치를 모니터링하는 가장 쉬운 방법은 핑을 보내는 것입니다. 그러나 ICMP 에코는 원시 소켓에 대한 보안 요구 사항이나 ping
. 또한 이것이 문제가 되지 않는 상황에서는 다양한 상황에 대해 동일한 핑 코드를 약간 다르게 변형하여 작성하는 편입니다.
제가 모니터링하는 대부분의 장치는 최소한의 네트워크 기능을 갖춘 내장형 장치입니다(그러나 항상 ICMP 에코를 포함함).하다이 프로토콜을 고수해야 합니다.에코 프로토콜(아래 댓글에서 Mark가 지적한 내용입니다. 감사합니다!) 일반적으로 사용할 수 없습니다.
루트가 아닌 애플리케이션에 오버헤드가 낮은 ICMP ping 서비스를 제공할 수 있는 서비스가 이미 존재합니까?
루트로 실행되고 루트가 아닌 다른 응용 프로그램이 연결되도록 허용하고 모니터링할 장치를 추가한 다음 핑 시간과 네트워크 상태를 쿼리하는 서비스 작성을 고려하고 있지만 바퀴를 다시 만들고 싶지는 않습니다. 이런 것이 이미 존재하는지 궁금합니다.
답변1
귀하의 질문에 대한 대답은 아마도 "아니요, 없습니다"일 것입니다.
그 이유는 ICMP가 낮은 수준의 프로토콜이고 ICMP 트래픽을 생성하려면 애플리케이션이 네트워크 인터페이스에 대한 권한 있는 액세스가 필요하기 때문입니다. ICMP를 생성하는 바이너리가 set-uid 루트라는 사실을 통해 대부분의 시스템에서 이에 대한 증거를 볼 수 있습니다. 끈적 끈적한 부분에 유의하십시오.
$ 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에 있습니다. 다른 운영 체제에서는 결과가 다를 수 있습니다.)
애플리케이션이 원시 네트워크 트래픽을 생성하려면 루트로 실행되어야 합니다. 이미 루트로 실행 되기 때문에 /sbin/ping
가장 좋은 방법은 이를 사용하여 핑을 생성하는 것입니다.
많은 수의 호스트에 대해 이 작업을 수행하는 경우 다음을 살펴보는 것이 좋습니다.fping. 또 다른 옵션은TCPing, 이는 ICMP ping과 유사한 결과를 제공하는 TCP 패킷을 생성할 수 있습니다. 요구 사항은 패킷을 수신하기 위해 대상 시스템의 열린 포트입니다. 이를 사용하거나 소스에 따라 접근 방식을 복제할 수 있습니다. 이 두 가지 모두 이미 운영 체제용 패키지로 제공될 수 있습니다.
더 큰 규모의 모니터링 솔루션을 위해서는나기오스그리고자빅스인기 있는 무료 옵션이지만 그 외에도 많은 옵션이 있습니다.
답변2
원하는 내용에 비해 너무 비대해 보일 수도 있지만 Nagios, icinga 또는 check_mk와 같은 대부분의 본격적인 모니터링 솔루션은 icmp 모니터링을 제공하고 종종 쿼리할 수 있는 API를 제공합니다.
답변3
ICMP 에코는 긍정적인 응답이라는 점에서 훌륭하지만 원격 시스템에서 제공하는 경우 포트 연결 불가 및 프로토콜 연결 불가와 같은 부정적인 응답으로 머신 활성 테스트를 수행할 수 있습니다. 노력하다:
connect()
사용하지 않는 TCP 포트에 연결 중send()
사용하지 않는 UDP 포트로 연결 중
setsockopt(fd, IP_RECVERR, ...)
오류를 깨끗하게 되돌리려면 a를 수행할 수 있어야 하고 오류 자체를 수신하려면 특수 옵션을 수행할 수 있어야 합니다 . (리눅스에서는 매뉴얼 페이지를 참조하세요 ip(7)
.)
답변4
ping
이 오래된 질문에 대한 업데이트된 답변으로, 2019년부터 루트 권한 없이 요청을 수행할 수 있는 Linux 기반 플랫폼에서 사용자 수준 애플리케이션을 만드는 것이 가능해졌습니다 .
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 및 기능 없이 Fedora에서 ping은 어떻게 작동합니까?
Linux 커널의 sysctl 매개변수는 추가 권한이나 기능 없이 패킷을 net.ipv4.ping_group_range
보내고 받을 수 있는 사용자 그룹의 숫자 범위를 정의합니다 .ping