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

标签 node.js express

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

  1. Client ip:可以通过req.ip知道。
  2. 客户端端口:我搜索了很多,但找不到任何方法来找到此客户端临时端口。检查 reqres 对象后,我发现有时 res.connection._peername 包含客户端 ip 地址和端口号。但这不是查找端口号的可靠方法,因为在某些请求中缺少此属性。那么,了解港口的正确方法是什么?
  3. 服务器 ip :这里我有兴趣知道服务器的外部或公共(public) ip。我搜索了一下,发现了 link它使用一些外部 api 来检索外部 ip。这是找到外部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

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


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

对于涉及代理的情况,您可能还需要查看一些 HTTP header :

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 header 经过多个代理,也可能是一个逗号分隔的列表,例如:

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

RFC 7239 开始,还有一个标准标题。 2014:

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

关于node.js - 如何在 Node.js 中检索客户端和服务器 IP 地址和端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38423930/

相关文章:

node.js - Vue.js 和 Node.js - 我应该将图像上传到 vue(前端)还是 Node(后端)

node.js - 找不到模块,因为 tsconfig.json 中提到了路径

javascript - 我遇到 'req.param.id' 问题

json - 如何在 Express 4 中将 Promise 的 yield 结果作为流发送?

mysql - 如何将mysql数据渲染到jade文件?

javascript - MySQL 条件过滤器处理

node.js - Sequelize 将现有条目作为关联添加到新创建的条目并获取新创建/更新的条目

javascript - AJAX post to Express 没有返回任何数据到 req.query(是的,有相同的 q 但没有任何作用)

javascript - Express APP如何将用户重定向到/:id path from server side

javascript - Node .js `request.get` : store body in variable