我尝试了很多搜索以找到一种方法来了解客户端和服务器的 IP 地址和端口号。到目前为止,我发现:
- Client ip:可以通过
req.ip
知道。 - 客户端端口:我搜索了很多,但找不到任何方法来找到此客户端临时端口。检查
req
和res
对象后,我发现有时res.connection._peername
包含客户端 ip 地址和端口号。但这不是查找端口号的可靠方法,因为在某些请求中缺少此属性。那么,了解港口的正确方法是什么? - 服务器 ip :这里我有兴趣知道服务器的外部或公共(public) ip。我搜索了一下,发现了 link它使用一些外部 api 来检索外部 ip。这是找到外部IP的唯一可能方法吗?或者有没有其他可能的方法?
- 服务器端口:可以通过
listener.address().port
[source]得知.但是可以从req
或res
对象中得知吗?实际上我想知道我只有req
、res
和next
的中间件中的端口号(基本上是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/