Сканирование портов на нелокальных хостах

Пишу сканер портов на Java. Я использую цикл for для подсчета портов от 0 до 100, создавая сокет для каждого и наблюдая, выдает ли он исключение или нет. Однако, когда я пытаюсь сканировать нелокальные порты, такие как «www.google.com», он сканирует первый, а затем останавливается (буквально программа просто ждет), если кто-нибудь знает, почему это так, я хотел бы знать. Вот код для метода сканирования. Обратите внимание, что переменная ia является объектом InetAddress.

private void scan(int low, int high){
    for(int port =low; port<high; port++){
    try {
    connection = new Socket(ia, port);
    r.addPort(port);
    System.out.println("port "+port+" open");
    connection.close();
    } catch (IOException e) {
    System.out.println("port "+port+" not open");
    }
}
}

person lilroo    schedule 28.05.2012    source источник
comment
Именно так многие системы защищаются от сканирования портов. Они отбрасывают ваш SYN-пакет, не отвечая, поэтому ваш сканер будет ждать вечно (или пока не истечет время ожидания) ответа, который так и не приходит. Кстати, это называется черная дыра.   -  person biziclop    schedule 28.05.2012


Ответы (1)


попробуйте установить тайм-аут на сокете. Он выйдет из строя быстрее.

connection.setSoTimeout(10*1000); // milliseconds

person WeMakeSoftware    schedule 28.05.2012
comment
вы должны установить его перед вызовом операции блокировки. - person WeMakeSoftware; 28.05.2012
comment
создайте пустой сокет, установите таймаут, попробуйте его открыть - person WeMakeSoftware; 28.05.2012
comment
Хорошо, я только что сделал то, что вы говорите, время ожидания сокета истекло, но я только что попытался просканировать порты на компьютере моих друзей в той же сети, используя ее IP-адрес, и у меня возникла та же проблема. Если я сканирую порты на своем локальном компьютере, он работает отлично и не зависает, даже если я не устанавливаю тайм-аут. - person lilroo; 28.05.2012
comment
Какой IP вы пытаетесь сканировать? локальный? Сканирование локального хоста — это нечто совершенно другое. Попробуйте свой внешний IP - person WeMakeSoftware; 28.05.2012
comment
Я только что просканировал свой внешний IP-адрес, и он работал нормально, как и при сканировании «localhost». - person lilroo; 28.05.2012
comment
Он зависает, когда вы сканируете только один порт, который, как вы знаете, открыт? (Проверьте с помощью telnet, что он действительно открыт, если вы не уверены.) - person biziclop; 28.05.2012
comment
Он зависает, когда пытается подключиться ко второму номеру порта, к которому он зацикливается. Это делает первый хорошо - person lilroo; 29.05.2012