Существует ли служба эхо-запросов ICMP?

Существует ли служба эхо-запросов ICMP?

Часто в приложениях, которые я разрабатываю, я люблю включать индикатор состояния сети для различных устройств в сети. Самый простой способ контролировать эти устройства — пинговать их. Но ICMP-эхо часто сложно интегрировать в приложение из-за требований безопасности с сырыми сокетами или проблем с производительностью при шеллинге в ping. Кроме того, для ситуаций, когда это не проблема, я как бы пишу немного разные вариации одного и того же кода пинга для разных ситуаций.

Большинство устройств, которые я отслеживаю, представляют собой встроенные устройства с минимальными сетевыми возможностями (но всегда включают ICMP-эхо), поэтому яделатьнужно придерживаться этого протокола, напримерЭхо-протокол(указано Марком в комментариях ниже, спасибо!) обычно мне недоступны.

Существует ли уже служба, которая может предоставить низконакладные услуги ICMP-пинга для некорневых приложений?

Я подумываю написать службу, которая будет работать от имени root и позволять другим приложениям, не являющимся root, подключаться к ней, добавлять устройства для мониторинга, а затем запрашивать у нее время пинга и состояние сети, но я не хочу изобретать велосипед, и мне интересно, существует ли уже что-то подобное.

решение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, лучшим вариантом, скорее всего, будет использовать его для генерации пингов.

Если вы делаете это для большого количества хостов, вам может быть интересно посмотретьfping. Другой вариант был быtcping, который может генерировать TCP-пакеты, которые дают результаты, похожие на ICMP-пинг. Требованием будет открытый порт на целевой системе для получения пакета. Вы можете использовать это или повторить его подход на основе источника. Оба они могут быть уже доступны в виде пакета для вашей операционной системы.

Для решения более масштабного мониторинга,НагиосиЗаббиксявляются популярными бесплатными вариантами, но есть и много других.

решение2

Возможно, это слишком громоздко для того, что вы ищете, но большинство полноценных решений для мониторинга, таких как Nagios, icinga или check_mk, обеспечивают мониторинг ICMP и часто предоставляют API, к которым вы можете делать запросы.

решение3

Хотя ICMP echo хорош тем, что это положительный ответ, вы можете проводить тесты активности машины с отрицательными ответами, такими как «порт недоступен» и «протокол недоступен», при условии, что ваша удаленная машина их предоставляет. Попробуйте:

  • connect()на неиспользуемый порт TCP
  • send()на неиспользуемый порт UDP

Вы должны иметь возможность сделать это setsockopt(fd, IP_RECVERR, ...), чтобы получить ошибки обратно чисто, и специальную опцию, чтобы получить сами ошибки. (В Linux см. страницу man 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

Как работает ping в Fedora без setuid и capabilities?

Параметр sysctl ядра Linux net.ipv4.ping_group_rangeопределяет числовой диапазон групп пользователей, которым разрешено отправлять и получать pingпакеты без дополнительных разрешений или возможностей.

Связанный контент