我对端口扫描有一个分歧。我在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开
当我使用nmap在命令行中进行相同的操作时,我得到更多的开放端口。 我无法上传图片,因为我是新用户。 谢谢
答案 0 :(得分:4)
除非您提供至少:
,否则无法提供具体答案您的计划的源代码。
您获得的(错误)输出的示例。
同一方案的预期输出。
如果没有这些信息,我们无法告诉您哪里出了问题。据我们所知,它甚至可能是一个简单的例子,你的程序在找到一个开放端口后提前终止。或者是一个开放端口的情况,最后发现在显示之前覆盖了之前的条目。
在任何情况下,使用network sniffer调查发送和接收的内容可能是值得的,例如Wireshark。通过将nmap
会话与您的程序创建的会话进行比较,您可能会发现一些有助于查明问题的显着差异。
修改强>
在查看代码并与nmap
进行比较后,您似乎错误地将SocketTimeoutException
的情况作为封闭端口处理,而它可能只是服务器的端口拒绝回答您发送的数据包。
编辑2:
以下是完整的故事:
当端口正确关闭时,服务器会发回ICMP Destination Unreachable packet Port unreachable 错误代码。 Java将此错误解释为您正确认为表示已关闭端口的IOException
。
另一方面,开放端口可能会导致服务器发出两种不同的响应:
服务器发送回一个UDP数据包,该数据包由程序接收并明确指示一个开放端口。例如,DNS服务器通常以格式错误响应进行响应。 nmap
显示这些端口为open
。
服务器会忽略您的探测包,因为它的格式错误了w.r.t.提供的服务。这会导致网络超时并导致程序中出现SocketTimeoutException
。
不幸的是,没有办法判断网络超时是否是因为活动服务器忽略了格式错误的探测数据包,或者因为数据包过滤器会削减探测。这就是nmap
显示超时为open|filtered
的端口的原因。