如何欺骗NetworkInterface.getHardwareAddress()(Java)

时间:2019-05-24 12:25:06

标签: java kubernetes openshift mac-address

我有一个在OpenShift(Kubernetes)中运行的软件,其许可证基于MAC地址。重新启动应用程序时,容器的MAC地址会更改,我必须申请一个新的许可证文件。

由于k8s吊舱中没有静态MAC地址,我想欺骗对NetworkInterface.getHardwareAddress()的Java调用,以诱使软件认为MAC地址仍然相同。

Enumeration enumeration = NetworkInterface.getNetworkInterfaces();
while (enumeration.hasMoreElements()) {
    NetworkInterface networkInterface = (NetworkInterface) enumeration.nextElement();
    if (networkInterface.isLoopback() || networkInterface.isPointToPoint() || networkInterface.isVirtual()) {
        continue;
    }
    if (networkInterface.isUp()) {
        byte[] arrayOfByte = networkInterface.getHardwareAddress();
        if (arrayOfByte != null && arrayOfByte.length == 6) {
            StringBuilder stringBuilder = new StringBuilder();
            for (byte b = 0; b < arrayOfByte.length; b++) {
                if (b != 0) {
                    stringBuilder.append(":");
                }
                stringBuilder.append(String.format("%02x", arrayOfByte[b]));
            }
            System.out.println(networkInterface.getName() + ": " + stringBuilder);
        }
    }
}

实际:eth0:01:14:4d:ec:01:42

预期:eth0:ee:ee:ee:ee:ee:ee:ee

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法在Java中执行此操作。

方法NetworkInterface::getNetworkInterfaces()被实现为native,这意味着它不访问任何特定字段来获取其结果。如果这样做的话,您可能会倒霉,但是现在看来,您必须在操作系统配置中对其进行管理。

编辑:对于Kubernetes解决方案,您可能需要在这里查看:https://www.reddit.com/r/kubernetes/comments/8a36jw/set_mac_address_possible_with_k8s/