Как обнаружить веб-серверы в локальной сети? - PullRequest
2 голосов
/ 27 апреля 2010

Предположим, что в моей локальной сети запущено несколько серверов, обслуживающих базовые запросы (скажем, домашняя сеть, где все машины обычно имеют IP в форме K.K.K.x, где x является переменной). Есть ли простой способ обнаружить все такие серверы? Мне нужно было бы найти каждый IP-адрес в сети, в котором запущено определенное приложение Java-сервера.

Ответы [ 5 ]

4 голосов
/ 27 апреля 2010

Вы ищете решение в своем приложении Java? Если вы просто ищете одноразовое решение, nmap должен работать.

Если ваша локальная сеть имеет форму 192. *. *. * Попробуйте это (я добавил sudo, потому что она должна быть запущена от имени root):

sudo nmap -vv -sS -O -n "192.168.1.1/24"
2 голосов
/ 27 апреля 2010

Итак, у вас есть сеть класса C ... просто попытайтесь открыть определенный порт серверных приложений на каждом IP-адресе от 1 до 254. Если вы хотите стать модным, вы можете сделать несколько проверок, чтобы убедиться, что порт на самом деле открывается, он делает то, что вы ожидаете от этого приложения.

1 голос
/ 27 апреля 2010

Для этого есть 2 основных способа, и оба требуют, чтобы вы отправляли / принимали пакеты на / с каждого хоста, который вы хотите проверить.

  • Самый простой подход - попытаться установить TCP-соединение с нужным портом, как вы это обычно делаете.

  • Более сложный и причудливый подход, но более быстрый с точки зрения исполнения, - это отправка пакета SYN и ожидание ответного пакета. Если ответом является SYN / ACK, это означает, что порт открыт (ожидает подключения), в противном случае это не так. Однако Java не предоставляет необходимый API (см. raw socket ) для этого. Вам нужно будет найти библиотеку / оболочку или написать ее, используя C и JNI.

Чтобы получить более подробную информацию о втором варианте, прочитайте this .

1 голос
/ 27 апреля 2010

Поскольку не каждый веб-сервер прослушивает фиксированный порт 80, вам необходимо сканировать порты.Откройте (и закройте!) В цикле сокет на каждом порту, вы можете использовать java.net.Socket для этого.В случае успеха запустите простой запрос GET на / для соответствующего IP / порта, для этого можно использовать java.net.URLConnection.Если вы получили действительный ответ HTTP (независимо от кода состояния), то это веб-сервер.Вы можете определить тип сервера по заголовку Server в ответе HTTP.Однако необходимо учитывать, что заголовок ответа по умолчанию может быть подделан / удален / изменен администратором сервера.

Обратите внимание, что некоторые брандмауэры могут распознавать шаблон сканирования сканера портов и блокировать его.

0 голосов
/ 27 апреля 2010

Я бы просканировал диапазон IP-адресов и протестировал бы соединение Socket с портом 80 с помощью следующего кода:

try {
       s = new Socket(addr,80);
       System.out.println("Webserver found on IP:" + addr );
       s.close();
     }
catch (IOException ex) {
       System.out.println("Webserver NOT found on IP:" + addr );
    }
...