Форум: "Сети";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
ВнизПинг UDP-порта Найти похожие ветки
← →
alexm_hs © (2007-02-21 18:28) [0]Задача, сканер UDP-портов. Есть функция на Indy:
function TfIPScan.ScanUDPPort(_ip_: string; nport: word; timeout: integer): boolean;
var PWS: TIdUDPClient;
s: string;
begin
if _ip_ <> "" then begin
PWS := TIdUDPClient.Create(self);
try
PWS.host := _ip_;
PWS.Port := nport;
PWS.Send(" ");
s := PWS.ReceiveString(timeout);
result := true;
PWS.free;
except
result := false;
PWS.free;
end;
end else result := false;
end;
Но вот беда. В части случаев ищет правильно, а в части (на некоторых хостах) - выдает все порты подряд (т.е. 1,2,3,4...). Что может быть не так?
← →
Сергей М. © (2007-02-22 08:20) [1]
> Пинг UDP-порта
Нет здесь никакого "пинга".
Пинг - это просто широкоизвестное имя программы (PING.ЕХЕ = Packet INternet Gopher), использующей для проверки доступности хостов (а не портов !) протокол ICMP, коим в твоем коде и не пахнет.
> выдает все порты подряд
Кто выдает-то ?
← →
SlymRO (2007-02-22 08:33) [2]UDP детектируются не гарантированно и по косвенным признакам типа ICMP_PortUnreachable, но их не каждый узел тебе вернет...
Или детектируются порты с сервисом который по протоколу обязан ответить
← →
alexm_hs © (2007-02-23 16:57) [3]Под словом "ПИНГ" я подразумевал именно обнаружение неработоспособности удаленного хоста, на котором, доподлинно известно, должен быть открыт искомый порт. Пример работает в части случаев. Вот только Некоторые хосты присылают ответ, что типа сканируемый порт открыт. Хотя на самом деле он закрыт.
← →
Сергей М. © (2007-02-26 12:01) [4]
> Хотя на самом деле он закрыт
Ну и причем тут "неработоспособность хоста" ?
Мало ли какие порты он не открыл ! Это же вовсе не говорит о том, что хост "неработоспособен" ..
А еще и файрволы к тому же существуют.
← →
alexm_hs © (2007-02-28 20:37) [5]дело в том, что я точно знаю, что такой-то порт открыт. Например UDP:161 - на нем SNMP-агент висит. Так вот, задавая диапазон сканирования UDP портов данного хоста с 1 по 200 й к примеру, я получаю, что открыт 1,2,3,4,5...199,200. И это происходит на части хостов. Другая я же часть верно откликается только на 161. Я пробовал разные сканеры - на всех хостах отрабатывает нормально - показывают только те, кот действительно открыты (161 например). Дело в моем коде. Вот я и спрашиваю, как правильно определить, что порт UDP не открыт.
← →
alexm_hs © (2007-02-28 20:43) [6]
> А еще и файрволы к тому же существуют.
если бы файрвол даже был бы включен - так сканирование ни к чему не результативному не привело - т.е. ни один порт бы не нашелся. У меня обратная проблема - находятся лишние "открытые" порты. Причем, видно, что это "лажа" т.к. из диапазона от 1 до 1000 не могут быть открыты все сразу.
← →
Сергей М. © (2007-03-01 08:24) [7]
> задавая диапазон сканирования UDP портов данного хоста с
> 1 по 200 й к примеру, я получаю, что открыт 1,2,3,4,5...
> 199,200
Я не понимаю, с какого перепугу служба, например, на 199-м порту обязана "понимать" посылаемую тобой пустую строку, да еще и отвечать (!) на твой посыл именно строкой (!), а не чем-то иным..
Поясни свою логику ...
← →
Rouse_ © (2007-03-01 11:29) [8]
> с какого перепугу служба, например, на 199-м порту обязана
> "понимать" посылаемую тобой пустую строку, да еще и отвечать
> (!) на твой посыл именно строкой (!), а не чем-то иным..
>
Сергей, тут все хуже :)s := PWS.ReceiveString(timeout);
result := true;
У него функция возвращает валидный результат после таймаута или если не поднялось исключение (а откуда ему там взяться)? :)
← →
Сергей М. © (2007-03-01 11:45) [9]
> Rouse_ © (01.03.07 11:29) [8]
> тут все хуже
Ну это само собой ляп)
← →
alexm_hs © (2007-03-01 22:13) [10]Попробуйте сами этот пример. Он работает :) Но для эксперимента его можно попробовать так же на выключенном или не существующем хосте - рез-т будет что я и говорил - все порты подряд.
> или если не поднялось исключение (а откуда ему там взяться)?
> :)
Таки берется ведь! Я не настаиваю, но предлагаю попробовать. Делов-то на 5 мин. На включенных хостах пример работает. А вот на выкл - исключения не возникает и возвращается пустая строка. Соотв. вопрос, тем кто знает: ПОЧЕМУ выключенный или несуществующий хост возвращает строку и отправка этой строки данному хосту не вызывает исключение?
← →
alexm_hs © (2007-03-01 22:23) [11]
> с какого перепугу служба, например, на 199-м порту обязана
> "понимать" посылаемую тобой пустую строку, да еще и отвечать
> (!) на твой посыл именно строкой (!), а не чем-то иным..
>
Почему же службы
137 (netbios-ns) UDP
138 (netbios-dgm) UDP
161 (snmp) UDP
445 (microsoft-ds) UDP
500 (isakmp) UDP
к примеру все-таки отвечают на пустую строку? Порты, открытые этими службами найдены именно этим примером
← →
SlymRO © (2007-03-02 04:59) [12]На недоступный порт сервер должен послать ICMP type:Destination Unreachable code:Port Unreachable
Если пришел пришел такой пакет ВинСок может сгенерить эксепшн сокету. Если такого пакета или эксепшина нет то отправка UDP может считаться состоявшейся т.е. порт вероятно открыт.
← →
Сергей М. © (2007-03-02 10:10) [13]
> Почему же службы
> к примеру все-таки отвечают на пустую строку?
Да нифига они не отчечают.
Какой м.б. ответ на галиматью в запросе ?
По таймауту ReceiveString возвращает управление, и это вовсе нельзя назвать ответом.
← →
alexm_hs © (2007-03-02 17:32) [14]
> По таймауту ReceiveString возвращает управление, и это вовсе
> нельзя назвать ответом.
интересно получается, что каждый раз при отправке пустой строки (не пустой, кстати, а пробела) одним и тем же портам (137,138 161,445, 500) возвращается управление после ReceiveString и result принимает значение true, а все посыл остальным портам той же строки вызывает исключение. Закономерность чтоль по Вашему?
← →
alexm_hs © (2007-03-02 17:36) [15]
> На недоступный порт сервер должен послать ICMP type:Destination
> Unreachable code:Port Unreachable
> Если пришел пришел такой пакет ВинСок может сгенерить эксепшн
> сокету. Если такого пакета или эксепшина нет то отправка
> UDP может считаться состоявшейся т.е. порт вероятно открыт.
>
уже что-то. Есть направление. А конкретную реализацию не подскажете? Т.е. я так понял, лучше всего самому пакет собирать и сокет открывать?
← →
Сергей М. © (2007-03-05 13:47) [16]
> не пустой, кстати, а пробела
Да по барабану, хоть пустая хоть пробел !
Есть такое понятие - "протокол прикладного информационного обмена", и если для конкретного сервиса он не подразумевает запросов вида "пустая строка" или "пробел", то строки с таким содержимым и есть галиматья, на которую конкретный сервис отвечать НЕ обязан.
> Закономерность чтоль по Вашему?
Конечно закономерность !
Не активен (или не доступен) конкретный порт на заведомо доступном хосте ? Заполучи исключение !
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.046 c