如何在Node.js

时间:2016-07-17 17:20:19

标签: node.js express

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

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

1 个答案:

答案 0 :(得分:13)

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

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