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

我试图search很多,find一种方法来知道客户端和服务器的IP地址和端口号。 到目前为止,我发现:

  1. 客户端ip :可以通过req.ip
  2. 客户端端口 :我search了很多,但我找不到find这个客户端临时端口的方法。 在检查reqres对象后,我发现有时候res.connection._peername包含客户端的IP地址和端口号。 但是,这不是find端口号的可靠方法,因为在某些请求中缺less这个属性。 那么,了解港口的正确方法是什么?
  3. 服务器IP :在这里我有兴趣了解服务器的外部或公共IP。 我search了一下相同的,我发现这个链接 ,使用一些外部的API来检索外部IP。 这是唯一可能的方法来find外部IP? 或者还有其他方法吗?
  4. 服务器端口 :通过listener.address().port [source]可以知道。 但是可以从reqres物体中知道吗? 其实我想知道中间件,我有reqresnext (基本上app.use(function(req,res,next){...})) )的端口号。

如果您与客户端有直接连接(在这种情况下没有代理服务器),可以使用这些属性获取这四个值:

 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

注意:当你以属性值的forms访问它们时,它们在技术上被实现为getter。 您不能设置这些属性。


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

对于涉及代理的情况,您可能还需要查看一些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 

RFC 7239 2014还有一个标准头文件:

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