无需调用外部服务器即可获取 Internet ip

Posted

技术标签:

【中文标题】无需调用外部服务器即可获取 Internet ip【英文标题】:Getting the internet ip without calling an external server 【发布时间】:2018-12-11 08:25:09 【问题描述】:

我正在开发一个需要获取互联网 IP 的 android 应用程序。是否可以在不调用外部服务器的情况下获得 Internet IP?

如果可能,如何在不发出额外网络请求的情况下获取 Internet IP?

【问题讨论】:

你可以查看这个链接,找到你的答案***.com/questions/3097589/… 我想你可以从***.com/questions/3097589/…下面的这个网址找到答案 我想你可以从***.com/questions/3097589/…下面的这个网址找到答案 【参考方案1】:

如果不向外部服务器发出请求,您可能无法获取您的公共 IP 地址,因为您的设备位于 LAN 内,它不关心路由器到 Internet 的公共 IP 地址,因为它不不需要它!

我建议您使用http://checkip.amazonaws.com/ 等网络服务来满足您的需求。

    URL getIP = new URL("http://checkip.amazonaws.com/");
    BufferedReader getIPReader = new BufferedReader(new InputStreamReader(getIP.openStream()));

    System.out.println(getIPReader.readLine()); // prints the IP

【讨论】:

如果您想使用更灵活的 API,请查看ipify。页面上甚至还有一个 Java 使用示例。 ;) 如果您想检查 IPv4 和/或 IPv6,我建议您查看 api.ident.me【参考方案2】:

老问题,但在其他任何地方都没有找到任何合理的答案......

仅使用本地资源获取您的公共 IP

此方法尝试尽可能通用,即使您在 NAT 主机之前的多个跃点处也可以工作。此示例在 bash 和 linux 中,但该方法可用于任何具有某种跟踪路由和 ping 实用程序的操作系统。

#!/bin/bash
# Get the first non-local IP, that will be our ISP gateway
EXTERNAL_GW=`LANG=c traceroute  8.8.8.8 -n |grep -v -E '(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|8\.8\.8\.8)'|sed -n '1 s/ *[^ ]\+ \+\([^ ]*\) .*/\1/p'`
echo "External gateway: $EXTERNAL_GW"
echo -n "External IP     : "
#Ping the gateway with the record source option. Also get the first non-local and not our EXTERNAL_GW
LANG=c ping -4 -R $EXTERNAL_GW -c 1|sed -n '/^RR:/,$p;/^$/q'|grep -v -E '(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|'$EXTERNAL_GW')'|head -n 1|cut -f 2

它只依赖于traceroute和ping(通常sed/grep/head/cut的Appart...)

首先,使用 traceroute 获取非内部范围网络上的第一台主机。这将是您的 NAT 主机之后的第一个公共网关。

然后我们使用记录源的选项 ping 该网关,同时提取所有本地网络范围。

生成的 IP 是您的 NAT 主机在公共网络上使用的 IP。

可以说它确实使用了外部资源。 (在本例中为 8.8.8.8),但任何 ICMP 返回公共主机都可以,并且总会有一些。

【讨论】:

【参考方案3】:

使用Open.NAT:

var discoverer = new NatDiscoverer();
var device = await discoverer.DiscoverDeviceAsync();
var ip = await device.GetExternalIPAsync();

这仅适用于 IPv4

【讨论】:

以上是关于无需调用外部服务器即可获取 Internet ip的主要内容,如果未能解决你的问题,请参考以下文章

无需使用互联网、wifi、APNS 和苹果推送通知服务器即可推送通知

获取网站访问者的IP地址,让他们无需登录即可访问网站

将 Google Cloud 中的外部 IP 与 Kubernetes 服务一起使用以将其公开到 Internet

无需连接到互联网即可获取本地 IP 地址

无需第三方服务(如 ipinfo)即可检测 ip 位置

无需等待结果即可从Web API调用另一个Web API