2017-08-03 72 views
0

我已经为API服务器构建了一个节点js代码。部分功能之一是,它在启动时应该能够知道自己的IP,尽管它运行的服务器的设置类型不同。在所有场景中查找节点js服务器的外部IP地址

经典场景并不难(我认为)。有几个选项,例如使用os模块并查找ip或外部接口。我相信还有其他方法,有些可能会更好,但这是我迄今为止所做的方式。随意添加尽可能丰富的信息。

有这种情况,我偶然发现。在一种情况下,网络服务器在谷歌云实例上运行。这个实例有两个IP,一个是内部的,一个是外部的。我想要的是外部IP。但是,当我使用上述方法时,实际的外部IP不是返回对象的一部分。内部知识产权被宣布为被视为非内部知识产权。即使当我在服务器命令行中运行不同的命令时,唯一返回的IP也是实际上是内部的,并且不能用于访问节点服务器。

据我所知,实例本身并不知道它是外部IP。可能有一个DNS(我认为)会将对外部IP的请求重定向到正确的实例。

在互联网上阅读时,我发现在使用负载平衡或代理时,获取服务器的正确外部IP的问题也可能会增加。

我想过的解决方案是让节点js代码向我将构建的服务发出请求。此服务将把节点js服务器视为客户端,并将返回其外部IP。从我所做的实验中,req对象包含客户IP的信息。所以我应该先检查req.connection.remoteAddress然后req.headers ['x-forwarded-for']的第一个元素。理想情况下,服务器将向自己发出请求,但

我知道有外部API,例如https://api.ipify.org?format=json这样做 - 返回实际的IP。但我非常希望节点js服务器独立于我无法控制的服务。

但是,我真的希望有比从服务器返回服务器IP请求更好的解决方案。

+0

不幸的是,服务器没有办法让所有的配置都知道它的公有IP,而不需要询问外部观察者(比如你引用的服务)。 –

+0

你最后提出了什么解决方案? – EMX

+0

@EMX:我最终创建了自己的服务,迄今为止已证明可以用于我们测试过的场景。 –

回答

0

但是,我真的希望有更好的解决方案 比从服务器返回服务器IP请求。

这是不可能的,你总是依赖某种外部观察者/外部请求。

虽然在互联网上阅读,我读了获得 服务器的正确外部IP的问题也可能会使用负载均衡 或代理时上升。

这是因为并非在所有情况下自己的设备能够自我感知其外部IP的。可能有一些网络位于后面,这意味着分配给将WAN转发给它的设备的外部地址。 (例如:路由器),所以当你试图从设备接口本身获取外部IP时,你最终会获得一个IP,但是在路由器LAN的范围内,而不是用于外部请求的IP。

所以,如果你真的想

  1. 在所有方案中使用的方法
  2. 不依赖于第三方服务

唯一的解决办法: 构建自己ip回声服务(您维护并可用于未来的项目)。