在所有场景中查找Node js服务器的外部IP地址



我已经为API服务器构建了一个节点js代码。一个功能的一部分是,当它启动时,它应该能够知道自己的IP,尽管它正在运行的服务器的设置类型。

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

有这个案子是我偶然发现的。在一个案例中,Web服务器在谷歌云实例上运行。此实例有两个 IP,一个内部 IP,一个外部。我想要的是外部IP。但是,当我使用上面的方法时,实际的外部 IP 不是返回的对象的一部分。内部 IP 被声明为被视为非内部 IP。即使我从服务器命令行中运行不同的命令,返回的唯一 IP 也是实际内部的 IP,不能用于访问节点服务器。

据我了解,实例本身并不知道它的外部 IP。可能有一个 dns(我认为(可以将对外部 IP 的请求重定向到正确的实例。

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

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

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

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

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

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

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

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

所以如果你真的想

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

唯一的解决方案:构建自己的 ip 回显服务(您维护并可用于将来的项目(。

最新更新