Как я могу получить все IP-адреса подсети, которые работают на конкретном порту - PullRequest
1 голос
/ 22 января 2012

Я хочу найти все системы, которые находятся в одной локальной сети, т.е. имеют одинаковую маску подсети.

Я думаю, что должен работать с InetAddress Классом в Java, но я не знаю, что должноЯ делаю.Мой алгоритм:

  1. Найти все доступные системы в локальной сети

  2. Проверить, работают ли они на моем запрошенном порту

  3. Имейте в виду IP-адрес системы, которая работает на этом порту

InetAddress localHost = Inet4Address.getLocalHost(); 
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
System.out.println(networkInterface);
networkInterface.getByInetAddress(localHost);

for (){
    networkInterface.getByInetAddress(localHost) 
}

Я думаю, что networkInterface.getByInetAddress(localHost) может дать мневсе доступные IP-адреса в подсети, но я не знаю, как я могу это сделать для всех доступных систем, и каково условие для условия for.

Ответы [ 2 ]

4 голосов
/ 22 января 2012

Найти все возможные IP-адреса в подсети IP очень просто.Просто напишите цикл, который перечисляет все возможные byte[] представления в подсети и создает для них InetAddress экземпляров.

Это простой бит, который решает эти две проблемы:

  • как вы найдете все, если live IP-адреса в подсети и

  • для данного IP-адреса, как вы выяснитеесли он использует определенный порт.

Первая проблема может быть решена двумя способами:

  • Вы можете использовать метод InetAddress.isAlive()чтобы увидеть, отвечает ли хост на пинг.Проблема в том, что некоторые хосты могут быть настроены так, чтобы они не отвечали на эхо-запросы, или эхо-запросы могут быть заблокированы внутренним брандмауэром.Это также не работает, если подсеть большая.Проблема в том, что вам нужно пропинговать большое количество хостов, и это займет много времени и будет генерировать большой сетевой трафик ... особенно если это делают несколько экземпляров приложения.

  • Более разумной альтернативой является проверка ARP-кэша вашего локального компьютера и извлечение всех известных ему IP-адресов.Проблема в том, что 1) ваше приложение может не иметь прав доступа для доступа к кешу ARP, 2) некоторые IP-адреса могут отсутствовать в кеше, и 3) нет способа доступа к кешу ARP в чистой Java.

Вторая проблема зависит от характера службы на порту:

  • Если это служба на основе TCP, вы можете попытатьсяподключиться к IP / порту с помощью простого сокета.Если соединение принято, то порт чем-то используется.Это может быть или не быть ожидаемой вами услугой, но в целом единственный способ сказать, что это попытка использовать службы.

  • Если этоСлужба на основе UDP, то есть теперь способ в общем, чтобы узнать, если что-то использует порт.

0 голосов
/ 22 января 2012

Я надеюсь, что вы имеете в виду следующее:

"Я хочу обнаружить все системы в той же локальной сети, что и (компьютер, на котором выполняется моя программа), основной IP-адрес, который прослушивается.определенный порт TCP. "

С UDP это немного более сложная проблема - вы можете искать отказы, но ваш пакет может быть съеден или потерян (как и ответ).

ТеперьПредполагая, что у вас TCP, у вас есть три шага.

  1. Получите IP-адрес локального интерфейса, который вы считаете «основным».
  2. Перечислите хосты в той же подсети, что и этот адрес.
  3. Для каждого хоста определите, прослушивает ли соответствующий порт.

Для шага 1 используйте InetAddress.getLocalHost().

Для шага 2 получите подсетьчасть полученного адреса, а затем попробуйте все возможные узлы в этой подсети.Будем надеяться, что это класс C, и там всего 254 хоста. Нет 100% уверенного способа получить все хосты, не пробуя каждый из них .Не определенный на 100% (и более сложный) способ состоит в том, чтобы использовать таблицы ARP, чтобы получить представление маршрутизатора о сети, отправлять широковещательный пинг в локальную сеть или переходить на уровень 2 и отправлять широковещательный Ethernet-пакет..

На шаге 3 откройте соединение с каждым хостом на соответствующем порту, а затем закройте его.Если время ожидания истекло или отказано, поцарапайте хост.В противном случае добавьте его в список «прослушивания».Возможно, вы захотите попробовать более одного соединения за раз и установить интервал тайм-аута на что-то небольшое, так как большинство людей не будут слушать.

Шаг 4: поздравляем!Вы только что сделали очень ненадежную версию nmap на Java.

...