美文网首页
Java 获取物理网卡地址 MAC IP Address 多虚拟

Java 获取物理网卡地址 MAC IP Address 多虚拟

作者: 叫我null | 来源:发表于2019-07-16 11:56 被阅读0次

    主机上安装 VMWare 、 Virtualbox、VirtualPc等软件或者划分多个Vlan会让主机产生多个网卡,我想获取网卡的IP和MAC地址,总是不能取到预期的网卡和IP地址,比如

    ipconfig /all
    
    Windows IP 配置
    
       主机名  . . . . . . . . . . . . . : Think-NULL
       主 DNS 后缀 . . . . . . . . . . . :
       节点类型  . . . . . . . . . . . . : 混合
       IP 路由已启用 . . . . . . . . . . : 否
       WINS 代理已启用 . . . . . . . . . : 否
    
    以太网适配器 以太网 4:
    
       连接特定的 DNS 后缀 . . . . . . . :
       描述. . . . . . . . . . . . . . . : VirtualBox Host-Only Ethernet Adapter #3
       物理地址. . . . . . . . . . . . . : 0A-00-27-00-00-0B
       DHCP 已启用 . . . . . . . . . . . : 否
       自动配置已启用. . . . . . . . . . : 是
       本地链接 IPv6 地址. . . . . . . . : fe80::a969:6011:e455:a0b2%11(首选)
       IPv4 地址 . . . . . . . . . . . . : 192.168.56.30(首选)
       子网掩码  . . . . . . . . . . . . : 255.255.255.0
       默认网关. . . . . . . . . . . . . :
       DHCPv6 IAID . . . . . . . . . . . : 1024065575
       DHCPv6 客户端 DUID  . . . . . . . : 00-01-00-01-1E-D4-36-E6-68-F7-28-B7-2A-08
       DNS 服务器  . . . . . . . . . . . : fec0:0:0:ffff::1%1
                                           fec0:0:0:ffff::2%1
                                           fec0:0:0:ffff::3%1
       TCPIP 上的 NetBIOS  . . . . . . . : 已启用
    
    无线局域网适配器 WLAN:
    
       媒体状态  . . . . . . . . . . . . : 媒体已断开连接
       连接特定的 DNS 后缀 . . . . . . . :
       描述. . . . . . . . . . . . . . . : Realtek RTL8723BE Wireless LAN 802.11n PCI-E NIC
       物理地址. . . . . . . . . . . . . : 48-E2-44-32-D4-BF
       DHCP 已启用 . . . . . . . . . . . : 是
       自动配置已启用. . . . . . . . . . : 是
    
    无线局域网适配器 本地连接* 3:
    
       媒体状态  . . . . . . . . . . . . : 媒体已断开连接
       连接特定的 DNS 后缀 . . . . . . . :
       描述. . . . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter #4
       物理地址. . . . . . . . . . . . . : 4A-E2-44-32-D4-BF
       DHCP 已启用 . . . . . . . . . . . : 是
       自动配置已启用. . . . . . . . . . : 是
    
    无线局域网适配器 本地连接* 6:
    
       媒体状态  . . . . . . . . . . . . : 媒体已断开连接
       连接特定的 DNS 后缀 . . . . . . . :
       描述. . . . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter #5
       物理地址. . . . . . . . . . . . . : 48-E2-44-32-D4-BF
       DHCP 已启用 . . . . . . . . . . . : 是
       自动配置已启用. . . . . . . . . . : 是
    
    以太网适配器 以太网:
    
       连接特定的 DNS 后缀 . . . . . . . :
       描述. . . . . . . . . . . . . . . : Intel(R) Ethernet Connection I218-V
       物理地址. . . . . . . . . . . . . : 68-F7-28-B7-2A-08
       DHCP 已启用 . . . . . . . . . . . : 否
       自动配置已启用. . . . . . . . . . : 是
       IPv4 地址 . . . . . . . . . . . . : 10.5.16.247(首选)
       子网掩码  . . . . . . . . . . . . : 255.255.255.0
       默认网关. . . . . . . . . . . . . : 10.5.16.1
       DNS 服务器  . . . . . . . . . . . : 114.114.114.114
                                           8.8.8.8
                                           1.1.1.1
       TCPIP 上的 NetBIOS  . . . . . . . : 已启用
    
    以太网适配器 以太网 2:
    
       媒体状态  . . . . . . . . . . . . : 媒体已断开连接
       连接特定的 DNS 后缀 . . . . . . . :
       描述. . . . . . . . . . . . . . . : TAP-Windows Adapter V9
       物理地址. . . . . . . . . . . . . : 00-FF-6F-F3-F6-AE
       DHCP 已启用 . . . . . . . . . . . : 是
       自动配置已启用. . . . . . . . . . : 是
    

    直接使用 NetworkInterface.getNetworkInterfaces() 获取到的网卡比这个还要多,
    排除:
    1、isUp()==false
    2、isLoopback()
    3、isVirtual() //这个好像没有太多作用
    我们至少能拿到2条数据

    68-F7-28-B7-2A-08 10.5.16.247
    0A-00-27-00-00-0B 192.168.56.30
    

    其中 192.168.56.30 是VirtualBox的IP显然不是我们所需要的。
    找到下面这种,感觉还是蛮好用的,先试试看

        private final static byte INVALID_MACS[][] = {
                {0x00, 0x05, 0x69},             // VMWare
                {0x00, 0x1C, 0x14},             // VMWare
                {0x00, 0x0C, 0x29},             // VMWare
                {0x00, 0x50, 0x56},             // VMWare
                {0x08, 0x00, 0x27},             // Virtualbox
                {0x0A, 0x00, 0x27},             // Virtualbox
                {0x00, 0x03, (byte) 0xFF},       // Virtual-PC
                {0x00, 0x15, 0x5D}              // Hyper-V
        };
    
        public static boolean isVMMac(byte[] mac) {
            if (null == mac) {
                return false;
            }
    
            for (byte[] invalid : INVALID_MACS) {
                if (invalid[0] == mac[0] && invalid[1] == mac[1] && invalid[2] == mac[2]) {
                    return true;
                }
            }
    
            return false;
        }
    
        public static String getLocalIpAddress() {
            try {
                Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
                while (networkInterfaces.hasMoreElements()) {
                    NetworkInterface ni = networkInterfaces.nextElement();
    
                    if (!ni.isUp() || ni.isLoopback() || ni.isVirtual()) {
                        continue;
                    }
    
                    if (NetUtils.isVMMac(ni.getHardwareAddress())) {
                        continue;
                    }
    
    
                    Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
                    while (inetAddresses.hasMoreElements()) {
                        InetAddress inetAddress = inetAddresses.nextElement();
                        if (inetAddress.isLinkLocalAddress()) {
                            continue;
                        }
    
                        return inetAddress.getHostAddress();
                    }
                }
            } catch (SocketException e) {
                log.error("获取本机IP地址失败。", e);
            }
            return StringUtils.EMPTY;
        }
    

    效果不错,现在拿到的IP是需要的了

    10.5.16.247
    

    相关文章

      网友评论

          本文标题:Java 获取物理网卡地址 MAC IP Address 多虚拟

          本文链接:https://www.haomeiwen.com/subject/almzkctx.html