LINUX.ORG.RU

ICMP не прост


0

0

Задача такая, надо мониторить доступность определенного хоста, проверять время отклика каждую секунду, например. Оказывается простого кроссплатформенного способа это делать не существует. Библиотек, реализующих ICMP почти нет, а даже если и есть, в unix екзешник должен иметь suid-бит, чтобы посылать icmp-пакеты. Что посоветуете?


Ответ на: комментарий от sadf

Можно послать ему на произвольный порт udp пакет, обычно они отбрасываются системой с посылкой icmp отклика, что позволяет понять что комп в сети, но на порту ничего нет, емнип трейсрут использует сию возможность.

wfrr ★★☆
()

Ну, значит нужно ставить суид-бит на экзешник (ицмп пакет сделать очень просто на самом деле), либо вызывать из своей программы пинг и парсить его вывод (что наверное еще проще чем делать свой ицмп пакет).

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

provaton ★★★★★
()
Ответ на: комментарий от wfrr

> Можно послать ему на произвольный порт udp пакет, обычно они отбрасываются системой с посылкой icmp отклика, что позволяет понять что комп в сети, но на порту ничего нет

Функция отправки UDP-пакета может завершиться до того, как пакет уйдёт в сеть, и ошибку не увидишь. Думаю, лучше пробовать сделать connect на какой попало TCP-порт. Тогда по типу ошибки можно понять, то ли хоста нет, то ли он есть, но не хочет общаться.

Это если совсем низя рутом пользоваться. Если всё-таки можно, то ICMP самое то. Хотя бы даже ping.

const86 ★★★★★
()
Ответ на: комментарий от wfrr

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

provaton ★★★★★
()
Ответ на: комментарий от const86

> Тогда по типу ошибки можно понять, то ли хоста нет, то ли он есть, но не хочет общаться.

Судя по всему, автору кроме статуса хоста нужно еще время отклика. В случае с тцп точно померять время отклика вряд ли можно.

provaton ★★★★★
()

если ты изобретаешь систему мониторинга то возьми готовую.

Если тебе это нужно для своей софтины то просто открой эхо-сервер на той стороне и будет тебе счастье.

ЗЫ раз в секунду это как-то уж слишком часто для хостов в разных сетях :). Всякие, задержки, тормоза тачки итп могут легко превысить эту секунду.

ЗЗЫ если тачка пингуется то это ещё не значит что она жива :).

true_admin ★★★★★
()
Ответ на: комментарий от provaton

> В случае с тцп точно померять время отклика вряд ли можно.

Точно ничем не измерить... Думаю, засечь время на connect() - вполне разумное приближение. Есть идеи получше (без использования рутовых прав)? :)

const86 ★★★★★
()
Ответ на: комментарий от const86

> Функция отправки UDP-пакета может завершиться до того, как пакет уйдёт в сеть, и ошибку не увидишь.

После send() можно через recv() дождаться результата (в норме - ошибки либо таймаута) и проанализировать его. В любом случае, файл /usr/bin/traceroute не имеет suid-флага.

alexsaa
()
Ответ на: комментарий от Syncro

раз в секунду делать system("ping")? :) Ну, в черновом варианте кода почему бы и нет :)

true_admin ★★★★★
()
Ответ на: комментарий от alexsaa

> В любом случае, файл /usr/bin/traceroute не имеет suid-флага.


$ ls -l /usr/sbin/traceroute
-rwsr-xr-x 1 root bin 23408 2008-03-05 13:45 /usr/sbin/traceroute

Reset ★★★★★
()
Ответ на: комментарий от Reset

Удивительно.

$ ll `which traceroute`
-rwxr-xr-x 1 root root 40656 Янв 20 03:54 /usr/bin/traceroute
$ equery b `which traceroute`
[ Searching for file(s) /usr/bin/traceroute in *... ]
net-analyzer/traceroute-2.0.11 (/usr/bin/traceroute)
$ traceroute 192.168.1.3
traceroute to 192.168.1.3 (192.168.1.3), 30 hops max, 40 byte packets
1 192.168.1.2 (192.168.1.2) 3000.155 ms !H 3000.150 ms !H 3000.146 ms !H

alexsaa
()
Ответ на: комментарий от alexsaa

traceroute нужны права root'а, так как кроме udp он ещё умеет работать по icmp, но есть мнение что не надо давать suid на всякие исполняемые файлы, да к тому же давны давно в traceroute была уязвимость.

А вот tracepath работает только по udp и ему хватает обычного пользователя.

Автору топика я бы посоветовал посмотреть исходник tracepath (всего 7 кБайт).

mky ★★★★★
()
Ответ на: комментарий от mky

> traceroute нужны права root'а

Как же он тогда у меня (см. предыдущее сообщение) работает? Ведь работает, и даже !H выдаёт. И, смею заверить, вовсе без рута.

alexsaa
()

>Задача такая, надо мониторить доступность определенного хоста

Вообще-то есть SNMP, для таких задач специально созданный.

Macil ★★★★★
()
Ответ на: комментарий от mky

> Ну, а traceroute -I у вас без root'а заработает?

"The specified type of tracerouting is allowed for superuser only"

Но это и не нужно.

alexsaa
()
Ответ на: комментарий от wfrr

> Можно послать ему на произвольный порт udp пакет
очень многие файрволлы запрещают ицмп тайп 3 коде 3. а некоторые стэки его и не посылают

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

> ртт и время коннекта() - огромная разница, да еще и почти не связанная.

Я и не говорил, что они равны. И connect предлагал использовать не для оценки rtt, а для оценки доступности хоста.

const86 ★★★★★
()

если тебе это еще нужно, и никакие другие, нормальные, варианты не проходят, можешь попробовать этот костыль. http://search.cpan.org/~colinm/Net-Ping-External-0.10/External.pm
это модуль на перле, который дает возможность кросплатформенно пингать. он просто запускает системный пинг и парсит его вывод. преимущество в том, что он осведомлен о специфике работы утилиты пинг во многих системах, не только гну. так же можешь разработать версию этой хрени на <твой язык>, благо, там все понятно.

val-amart ★★★★★
()
Ответ на: комментарий от const86

>Я и не говорил, что они равны.
ок, не говорил, я это сам придумал по контексту.

>И connect предлагал использовать не для оценки rtt, а для оценки доступности хоста.

хорошо, а на какой порт тогда коннект? имхо, это анриал.

val-amart ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.