【问题标题】:How to discover web servers on a local network?如何发现本地网络上的 Web 服务器?
【发布时间】:2010-04-26 22:45:47
【问题描述】:

假设我在本地网络上运行了几台服务器来处理基本请求(比如一个家庭网络,其中所有机器通常都有一个 K.K.K.x 形式的 IP,其中 x 是可变的)。有没有一种简单的方法可以发现所有这些服务器?我需要找到运行特定 java 服务器应用程序的网络上的每个 IP。

【问题讨论】:

    标签: java sockets discovery


    【解决方案1】:

    您是否正在为您的 Java 应用程序寻找解决方案?如果您只是在寻找一次性解决方案,nmap 应该可以工作。

    如果您的本地网络是 192.*.*.* 的形式,试试这个(我添加了 sudo,因为它必须以 root 身份运行):

    sudo nmap -vv -sS -O -n "192.168.1.1/24"
    

    【讨论】:

    • 需要 root,因为您提供的选项执行 SYN 扫描,它依赖于 RAW 套接字,并且这些只能由超级用户创建。
    【解决方案2】:

    所以你有一个 C 类网络...只需尝试在 1 到 254 之间的每个 IP 地址上打开特定的服务器应用程序端口。如果你想变得花哨,你可以做一些检查来验证端口是否真的打开后,它会执行您对该应用程序的期望。

    【讨论】:

    • 我不太热衷于网络。我可以运行1-254,但是如何以跨平台的方式获取IP地址的前3个字节?我的直觉说,有一些像 ipconfig/ifconfig 这样的工具,使用适当的参数,会返回本地 IPV4 地址(这会给我我需要的字节),但我想知道是否有更多的 java-ish 方式。跨度>
    • 呃。我刚刚搜索了“获取 IP 地址 Java”。这应该很好用。
    【解决方案3】:

    由于并非每个网络服务器都侦听固定端口 80,因此您需要扫描端口。在每个端口上循环打开(并关闭!)一个套接字,您可以为此使用java.net.Socket。如果成功,则在相关 IP/端口上的 / 上触发一个简单的 GET 请求,您可以为此使用 java.net.URLConnection。如果您收到有效的 HTTP 响应(无论状态码如何),那么它就是一个网络服务器。您可以通过 HTTP 响应中的 Server 标头确定服务器类型。但是,您需要考虑到默认响应标头可能会被服务器管理员欺骗/删除/更改。

    请注意,某些防火墙可能会识别端口扫描器的扫描模式并阻止它。

    【讨论】:

      【解决方案4】:

      有两种基本方法可以实现这一点,都需要您向/从您要检查的每个主机发送/接收数据包。

      • 最简单的方法是尝试建立与所需端口的 TCP 连接,就像您通常所做的那样。

      • 一种更复杂、更花哨但执行速度更快的方法是发送 SYN 数据包,并等待响应数据包。如果响应是 SYN/ACK,则表示端口已打开(等待连接),否则表示未打开。但是,Java 没有为此提供必要的 API(请参阅raw socket)。您必须找到一个库/包装器或使用 C 和 JNI 编写一个。

      有关第二个选项的更多见解,请阅读this

      【讨论】:

      • 这样做需要能够推送原始数据包,这通常是 A) 从 Java 中不可行,B) 不可取,因为发送原始数据包需要额外的系统权限。如果人们不以管理员身份运行 Windows,那么恶意软件感染的案例就会少得多。
      • @Devon 正确,我正在更新我的答案,提到 Java 没有必要的 API。 Microsoft 删除了对 XP-SP2 上创建原始套接字的支持,但您仍然可以创建/发送以太网帧。
      【解决方案5】:

      我会scan IP range 并使用如下代码测试与端口 80 的 Socket 连接:

      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 );
          }
      

      【讨论】:

      • 别忘了s.close()
      【解决方案6】:

      这是一个老问题,反正这个回答是针对未来的访问者

      如果您使用的是 linux 并安装了 firefox(默认安装)和 nmap,那么您就可以开始使用了。

      network="192.168.0.0/24" change this to your local network.
      nmap -sn $network | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' |sort |uniq | xargs -n1 -I{} firefox {}
      

      这会在浏览器中打开本地网络中的每个 ip(最大:254),这样您就可以一个一个地检查它们,如果您在家庭网络上(大约 7 个左右),通常不会找到很多 ip。

      细分

      network=192.168.0.0/24 :这代表本地网络,(net-ip/netmask),24 表示:255.255.255.0(24 位代表 net-ip,其余位表示此网络上的可用主机(254 主机)。 您可以输入 ifconfig (linux) 或 ipconfig (windows) 来获取本地网络信息。

      nmap -sn $notwork:扫描本地网络中的所有活动 IP(-sn:禁用端口扫描)。

      grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1 ,3}':此正则表达式过滤器从 nmap 结果中返回每个 ip (x.x.x.x)。

      排序 | uniq : 对 ip 进行排序并删除副本。

      xargs -n1 -I{} firefox {}:借助 firefox 实用程序,在浏览器窗口中打开先前结果中的每一行。

      【讨论】:

      • 请在您的答案中添加一些解释,以便其他人可以从中学习。给定的解决方案如何与 Java 协同工作?
      • 感谢您的评论@NicoHaase,我会编辑答案,它不会检查它是否是java服务器,它会在Web浏览器中打开本地网络中的每个IP ,有人可以手动检查。
      猜你喜欢
      • 1970-01-01
      • 2012-05-27
      • 2020-02-24
      • 2013-10-20
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多