小弟这里遇到一个困难,求教网络通信高手看有没有办法解决:描述:有的设备在局域网通信的时候构造的包源IP目的IP都是0.0.0.1,这样的包是不可路由的,完全通过接入交换机或路由器后寻找对应的MAC地址来通信,路由和交换机都提供端口与MAC地址绑定(内部维护一个MAC地址和端口的对应关系表),它们会把包发给特定MAC地址绑定的端口上接入的设备这里比如有两台设备MAC地址分别为M1和M2,它们在局域网通信,分别接入交换机的Port-1和Port-2,而我的PC机(MAC地址M3)接入交换机的Port-3,请问我的PC机如何能截获到M1和M2之间的数据包呢?即时是混杂模式,但由于交换机的MAC端口绑定,包根本就不会由交换机的Port-3经过PC机的网卡,所以完全截获不到。曾构想过MAC地址欺骗,由PC机构造源为M2的包发送给向交换机,让交换机误认为Port-3上绑定的是M2,这样可以暂时收到M1发给M2的包,但是当还有一个M4也接入变成M1/M2/M4三设备通信的时候,PC机每次只能伪装成其中一个去监听别人的回复,无法很流畅的截获到三设备之间通信的所有包这个问题困扰我很久了,向高手请教一下!

解决方案 »

  1.   

    最简单的方法是执行arping(Linux)命令,通过IP地址获取MAC地址的相应信息。但是,前提是在同一个子网下,否则无法得到MAC地址。本地MAC地址可如下获取:Enumeration<NetworkInterface> nic = NetworkInterface.getNetworkInterfaces();
            
    for (; nic.hasMoreElements(); ) {
         NetworkInterface n = nic.nextElement();
           
         System.out.println(n.getName() + " : " + java.util.Arrays.toString(n.getHardwareAddress()));
    }
      

  2.   

    我感觉不大可能实现,就像你说的,你同一时间只能用一个mac地址,也就是说你每次只能伪装成一个同网内机器去接受他的数据,不可能同时接受3台机器的。
    不过我好像记得是交换机每次都会把数据包同时发到每台机器上,然后由各自终端机来判断是否是本机的包,并进行读取。如果是这样的话,你可以一直监测本机接收的包,并根据包不断改变本机mac地址,这样理论可以接受局域网内的所有数据包。(提醒一下,如果真的能这样做的话,你的机器会非常卡的,而且,需要你有一个足够大的硬盘)