4

我有一个关于端口扫描的任务。我正在扫描 Java 中某些 IP 地址的 UDP 端口。在我的程序中(假设一切正常)我只能找到一个开放的 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 在命令行中进行相同的操作时,我会得到更多的开放端口。我无法上传图片,因为我是新用户。谢谢 在此处输入图像描述

4

1 回答 1

4

除非您至少提供以下内容,否则无法提供具体答案:

  • 你的程序的源代码。

  • 您得到的(不正确的)输出示例。

  • 相同场景的预期输出。

如果没有这些信息,我们就无法告诉您出了什么问题。据我们所知,它甚至可能是您的程序在找到开放端口后过早终止的简单情况。或者最后发现的开放端口在显示之前覆盖了以前的条目的情况。

在任何情况下,使用网络嗅探器(例如Wireshark)调查发送和接收的内容可能是值得的。通过nmap将会话与您的程序创建的会话进行比较,您可能能够发现一些有助于查明问题的显着差异。

编辑:

查看您的代码并与 进行比较后nmap,您似乎错误地将 a 的情况处理SocketTimeoutException为关闭端口,而它可能只是服务器的端口拒绝回复您发送的数据包。

编辑2:

这是完整的故事:

当一个端口被正确关闭时,服务器会发回一个ICMP Destination Unreachable 数据包,其中包含Port unreachable错误代码。Java 将此错误解释为IOException您正确认为指示关闭端口的错误。

另一方面,一个开放的端口可能会导致来自服务器的两种不同的响应:

  • 服务器发回一个 UDP 数据包,该数据包由您的程序接收,并且明确表示一个开放端口。例如,DNS 服务器通常以格式错误响应进行响应。nmap显示这些端口是open.

  • 服务器会忽略您的探测数据包,因为它对所提供的服务格式不正确。这会导致网络超时并SocketTimeoutException在您的程序中出现。

不幸的是,无法判断网络超时是因为活动服务器忽略了格式错误的探测数据包还是因为数据包过滤器切断了探测。这就是为什么nmap将超时的端口显示为open|filtered.

于 2012-03-02T01:14:29.260 回答