【问题标题】:How to get client IP address with WebSocket (websockets/ws) library in Node.js?如何使用 Node.js 中的 WebSocket (websockets/ws) 库获取客户端 IP 地址?
【发布时间】:2013-01-27 04:16:59
【问题描述】:

我在客户端对象上找不到客户端 IP 参数。

【问题讨论】:

  • websocket._socket.remoteAddress

标签: node.js websocket


【解决方案1】:

经过一番折腾,试图找出哪个提供了客户端(网络浏览器的)IP 地址,答案是:

ws._socket.remoteAddress

或者,如果您可以通过wss.on('connection', (ws, req) => {}) 访问req

req.socket.remoteAddress

您可以使用它,例如,GeoIP 定位用户连接的位置。

编辑:

如果您在 Nginx 反向代理(或任何其他反向代理)后面运行 Node,您可能需要使用:

req.headers['x-forwarded-for'] || req.connection.remoteAddress

关于安全性的说明:如果您的 Node 服务器可以直接使用以及通过反向代理使用,您可能希望在信任x-forwarded-for 之前检查remoteAddress。远程地址应该是您的反向代理的 IP。有人可能会直接调用您的服务并欺骗 x-forwarded-for

【讨论】:

  • 只是为了迂腐——编辑适用于所有反向代理,而不仅仅是 nginx(很多人使用 haproxy)
  • 嗯,这很奇怪,当在控制台中显示 socket.upgradeReq.connection 时,remoteAddress 字段是隐藏的,知道为什么吗?我花了很长时间才找到用户 IP。谢谢克里斯·诺莱特! :)
  • 令人震惊的是,所有这些 Web 套接字 API 的差异如此之大。如此巨大的潜力,却又如此分散。
  • 查看 npm 中的 forwarded-for 库,它会自动为您完成大部分反向代理和 Node 套接字上的 IP 地址信息,因为它已经更改了很多次。
  • upgradeReq 在 v3.0.0+ 中被移除
【解决方案2】:

通过打印套接字对象中的键得到这个:

> ws._socket.address()
  { port: 8081,
    family: 2,
    address: '127.0.0.1' }

> ws._socket.remoteAddress
  '74.125.224.194'

> ws._socket.remotePort
  41435

我没有任何文档,所以我不确定跨版本的支持程度:/

【讨论】:

    【解决方案3】:

    在 websocket 服务器中,由于 req.connection 已被弃用,您使用 req.socket

    wss.on('connection', (ws, req) => {
        console.log(req.socket.remoteAddress);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2012-02-16
      • 2015-12-20
      • 2016-03-29
      • 2010-12-11
      相关资源
      最近更新 更多