如何在Node.js中获取客户端和服务器的IP地址和端口号

17

我试图搜索很多内容来找到一种方法来了解客户端和服务器IP地址和端口号。目前为止我发现:

  1. 客户端IP: 可以通过 req.ip 得知。
  2. 客户端端口号: 我搜索了很多但我无法找到任何方法来查找客户端的短暂端口号。在检查 reqres 对象后,我发现有时候 res.connection._peername 包含客户端IP地址和端口号。但是这不是可靠的方法来查找端口号,因为在某些请求中此属性缺失。那么,了解有关端口的正确方法是什么?
  3. 服务器IP: 这里我想知道服务器的外部或公共IP地址。我为此搜索了一些内容,我找到了这个链接,该链接使用一些外部API来检索外部IP。这是唯一可能找到外部IP的方式吗?还是有其他可能的方式?
  4. 服务器端口号: 它可以通过 listener.address().port 得知[来源]。但是它可以从 reqres 对象中获知吗?实际上,我想在只有 reqresnext 的中间件中了解端口号(基本上是 app.use(function(req,res,next){...}) )。
1个回答

23

如果你与客户端直接连接(没有代理),则可以使用这些属性获取这四个值:

req.connection.remoteAddress
req.connection.remotePort
req.connection.localAddress
req.connection.localPort

在 net.js 中相关的 Node.js 源代码指针: https://github.com/nodejs/node/blob/863952ebadd4909a66bb9da7868bf75bbbe1462d/lib/net.js#L608

注意:虽然您将其作为属性值访问,但它们实际上是 getter。 您无法设置这些属性。


如果存在负载均衡器、代理等服务器基础设施位于您的实际服务器前面,则上述本地值可能返回本地服务器,而不是客户端最初连接到的实际公共 IP / 端口。 检索原始公共 IP / 端口的唯一方法是,如果您的基础架构将它们设置为 HTTP 标头(某些代理设置 IP,不知道是否有任何代理设置端口),因为它们不存在于来自代理的当前原始 TCP 连接中。

对于涉及代理的情况,您还可以查看一些 HTTP 标头:

X-Forwarded-For - The IP address of the client before it went through the proxy
X-Forwarded-Port - The port of the client before it went through the proxy

X-Forwarded头信息可能是逗号分隔的列表,如果通过多个代理,例如:

X-Forwarded-For: OriginatingClientIPAddress, proxy1-IPAddress, proxy2-IPAddress

2014年RFC 7239起,也有一个标准的头部:

Forwarded: for=192.0.2.60; proto=http; by=203.0.113.43

1
req.ip 是 Express 用于内部信任代理处理的内容。如果正在使用 Express,则最好使用它而不是 req.connection.remoteAddress。但对于端口,上游代理通常不会发送该信息。 - Brad
1
没错,我是在回应你关于上游代理的评论。你可以在这里阅读有关信任代理设置的信息:http://expressjs.com/en/api.html。你的建议只获取了直接连接,这通常是需要的。然而,如果你想知道请求IP实际上是什么,并且你有一个代理在前面,最简单的方法就是依赖Express内置的处理此情况的功能。 - Brad
req.connection.localAddress 将会给出服务器的本地 IP 地址。是否有类似的方法可以检索服务器的公共 IP 地址? - user2805872
@user2805872 - req.connection.loadAddress 应该是 TCP 连接的服务器端 IP 地址。如果在您和公共互联网之间没有代理,则应该是您的公共 IP 地址。如果有代理,则该地址将不是公共 IP 地址,因为公共 IP 地址实际上不属于您的服务器。我在我的答案中添加了有关代理标头的更多信息,但我不知道它是否会让您获得客户端最初连接到的真实公共 IP 地址。 - jfriend00
你好,如果你没有使用node.js,那么在纯vanilla js中能否获取远程(客户端)端口?谢谢。 - Gabriel
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接