Сканирование UDP-порта Java находит только 1 открытый UDP-порт - PullRequest
4 голосов
/ 02 марта 2012

У меня есть представление о сканировании портов.Я сканирую UDP-порты некоторых IP-адресов в Java. В моей программе (при условии, что все в порядке) я могу найти только один открытый UDP-порт.С другой стороны, при сканировании портов через «nmap» я получаю 4 открытых порта UDP.Может кто-нибудь сказать мне, почему я не могу найти более одного порта через код Java?Кстати, я могу найти истинно открытый порт в своем коде.

int startPortRange=1;
    int stopPortRange=1024;
    InetAddress address = InetAddress.getByName("bigblackbox.cs.binghamton.edu");
    int counter=0;
    for(int i=startPortRange; i <=stopPortRange; i++)
    {
        counter++;      
       try{


            byte [] bytes = new byte[128];
            DatagramSocket ds = new DatagramSocket();
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
            ds.setSoTimeout(100);
            ds.connect(address, i);
            ds.send(dp);
            ds.isConnected();
            dp = new DatagramPacket(bytes, bytes.length);
            ds.receive(dp);
            ds.close();
            System.out.println("open");
            System.out.println(counter);
        }
        catch(InterruptedIOException e){
            //System.out.println("closed");
        }
        catch(IOException e){
            //System.out.println("closed");
        }       
    }

Вывод вышеуказанного кода равен 135 open

Когда я делаю ту же операцию в командной строке, используя nmap, я становлюсь более открытымпорты.Я не могу загрузить изображение, потому что я новый пользователь.Спасибо enter image description here

1 Ответ

4 голосов
/ 02 марта 2012

Невозможно дать конкретный ответ, если вы не предоставите как минимум :

  • Исходный код вашей программы.

  • Пример (неправильного) вывода, который вы получаете.

  • Ожидаемый результат для того же сценария.

Без этой информации мы не сможем сказать вам, что не так. Насколько мы знаем, это может быть простой случай преждевременного завершения вашей программы после обнаружения открытого порта. Или случай, когда последний найденный открытый порт перезаписывал записи предыдущих перед отображением.

В любом случае, возможно, стоит выяснить, что отправляется и принимается с использованием сетевого анализатора , такого как Wireshark . Сравнивая сеанс nmap с сеансом, созданным вашей программой, вы сможете обнаружить существенную разницу, которая поможет точно определить проблему.

EDIT:

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

РЕДАКТИРОВАТЬ 2:

Вот полная история:

При правильном закрытии порта сервер отправляет обратно ICMP Destination Unreachable пакет с кодом ошибки Port unreachable . Java интерпретирует эту ошибку как IOException, который вы правильно считаете указанием на закрытый порт.

Открытый порт, с другой стороны, может привести к двум различным ответам от сервера:

  • Сервер отправляет обратно пакет UDP, который получен вашей программой и однозначно указывает на открытый порт. Например, DNS-серверы часто отвечают ответом Format error . nmap показывает, что эти порты open.

  • Сервер игнорирует ваш тестовый пакет, потому что он неверно сформирован w.r.t. к предоставленной услуге. Это приводит к тайм-ауту сети и SocketTimeoutException в вашей программе.

К сожалению, невозможно определить, является ли тайм-аут сети тем, что активный сервер проигнорировал некорректно сформированный тестовый пакет или потому что фильтр пакетов отключил тестирование. Вот почему nmap отображает время ожидания портов как open|filtered.

...