Java InetAddress.getLocalHost()。getHostAddress()返回无效的IP

时间:2019-04-20 11:38:14

标签: java networking ip

当我说无效时,我的意思是无效。我得到的IP地址与机器接口的 any 没有关联。我知道网站上也有类似的问题,但更多的是人们获取他们不想要的接口地址(例如127.0.0.1而不是LAN IP),但这不是那样。我想知道此IP的来源以及如何摆脱它。

每当我致电InetAddress.getLocalHost().getHostAddress()时,我都会得到10.65.90.34。这不是我的路由器,ISP,VPN或其他任何东西分配的IP。 ifconfig的输出中没有提及此IP。我不知道这个IP的来源。建议列举一个不同问题的所有接口,这是我这样做的结果:

public void localIPTest() throws UnknownHostException, SocketException {
    String hostAddress = InetAddress.getLocalHost().getHostAddress();
    System.out.println(hostAddress);

    Enumeration Interfaces = NetworkInterface.getNetworkInterfaces();
    while (Interfaces.hasMoreElements()) {
        NetworkInterface Interface = (NetworkInterface) Interfaces.nextElement();
        System.out.println(Interface.getDisplayName());
        Enumeration Addresses = Interface.getInetAddresses();
        while (Addresses.hasMoreElements()) {
            InetAddress Address = (InetAddress) Addresses.nextElement();
            System.out.println(Address.getHostAddress());
        }
    }
}

这将输出:

10.65.90.34
utun0
fe80:0:0:0:a3c9:7561:3c37:3943%utun0
awdl0
fe80:0:0:0:b458:bbff:feac:2ee8%awdl0
utun1
172.20.97.60
en0
fe80:0:0:0:c88:b30a:16fc:4dbe%en0
192.168.0.106
lo0
fe80:0:0:0:0:0:0:1%lo0
0:0:0:0:0:0:0:1
127.0.0.1

仅当我连接到公司的VPN网络时,才会发生此问题。但是,此IP并非来自VPN接口(utun1)-从上面的输出172.xx中可以看出。

我试图查看此IP是否来自底层操作系统(在我的情况下为macOS),但事实并非如此。

 $  ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*'
inet 127.0.0.1
inet 192.168.0.106
inet 172.20.97.60

$  curl ifconfig.me
183.82.20.54

建议的traceroute 8.8.8.8输出:

 $  traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 64 hops max, 52 byte packets
 1  192.168.0.1 (192.168.0.1)  2.317 ms  1.067 ms  0.847 ms
 2  broadband.actcorp.in (106.51.140.1)  2.220 ms  2.585 ms  2.501 ms
 3  broadband.actcorp.in (202.83.20.173)  3.120 ms  2.199 ms  4.124 ms
 4  broadband.actcorp.in (202.83.20.181)  2.501 ms  2.534 ms  2.635 ms
 5  * * *
 6  72.14.194.18 (72.14.194.18)  43.590 ms  41.858 ms  42.637 ms
 7  74.125.242.131 (74.125.242.131)  42.560 ms
    108.170.253.121 (108.170.253.121)  42.911 ms
    108.170.253.122 (108.170.253.122)  40.468 ms
 8  72.14.239.59 (72.14.239.59)  42.028 ms
    74.125.252.165 (74.125.252.165)  41.743 ms
    209.85.248.251 (209.85.248.251)  43.130 ms
 9  64.233.175.215 (64.233.175.215)  41.679 ms
    72.14.236.223 (72.14.236.223)  43.124 ms
    209.85.242.12 (209.85.242.12)  42.816 ms
10  216.239.35.145 (216.239.35.145)  42.076 ms
    66.249.94.185 (66.249.94.185)  42.791 ms
    216.239.35.167 (216.239.35.167)  42.456 ms
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * google-public-dns-a.google.com (8.8.8.8)  41.985 ms *

还要为ifconfig添加完整的输出:

$  ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
    inet 127.0.0.1 netmask 0xff000000
    inet6 ::1 prefixlen 128
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
    nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC20: flags=0<> mtu 0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether a4:5e:60:e5:b2:8b
    inet6 fe80::c88:b30a:16fc:4dbe%en0 prefixlen 64 secured scopeid 0x5
    inet 192.168.0.104 netmask 0xffffff00 broadcast 192.168.0.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
    ether 06:5e:60:e5:b2:8b
    media: autoselect
    status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
    ether b6:58:bb:ac:2e:e8
    inet6 fe80::b458:bbff:feac:2ee8%awdl0 prefixlen 64 scopeid 0x7
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 6a:00:00:58:9d:c0
    media: autoselect <full-duplex>
    status: inactive
en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 6a:00:00:58:9d:c1
    media: autoselect <full-duplex>
    status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=63<RXCSUM,TXCSUM,TSO4,TSO6>
    ether 6a:00:00:58:9d:c0
    Configuration:
        id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
        maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
        root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
        ipfilter disabled flags 0x2
    member: en1 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 8 priority 0 path cost 0
    member: en2 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 9 priority 0 path cost 0
    nd6 options=201<PERFORMNUD,DAD>
    media: <unknown type>
    status: inactive
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
    inet6 fe80::a3c9:7561:3c37:3943%utun0 prefixlen 64 scopeid 0xb
    nd6 options=201<PERFORMNUD,DAD>
utun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
    inet 172.20.97.60 --> 172.20.97.60 netmask 0xffffffff

3 个答案:

答案 0 :(得分:1)

来自InetAddress.getLocalHost()的文档:

  

这是通过从系统中检索主机的名称,然后将该名称解析为一个InetAddress来实现的。

因此,如果您使用虚假的主机名,则此函数将返回虚假的IP地址。

您可以运行hostname命令来查看您的计算机作为主机名报告的内容,然后使用nslookup来查看该名称解析为什么(或选择ping $(hostname)来执行此操作)名称解析)。

如果这是问题所在,并且您在Mac上具有管理员访问权限,则可以更改名称(有关说明,请参见man hostname)。但是,您可能需要与IT部门联系,以了解正确的主机名应该是什么。

答案 1 :(得分:0)

最终设法解决了这个问题。

正如@guest所指出的那样,该问题是由于某种原因连接到VPN会弄乱名称解析,以便将我的本地主机解析为某个远程IP。

解决方案是简单地添加一个/ etc / hosts条目,将我的主机名手动映射到127.0.0.1。这样就解决了。

答案 2 :(得分:-1)

作为Windows用户,这里可以提供帮助,但对macOS不熟悉

您是否有VMware或VMplayer或任何虚拟化程序?

如果是,则可以检查您拥有的网络适配器并将其关闭。

如果否,并且您仅启用了您正在使用的适配器

这可能是ISP,请确保打开cmd并键入

tracert 8.8.8.8

如果您看到任何熟悉的IP,例如10。*

然后,ISP正在使用NAT,可能会阻止您的请求。