首页 > 解决方案 > 如何获取连接到 websocket 服务器的所有客户端的“真实”IP 地址

问题描述

所以我有一个nodejs Web 套接字服务器坐在 nginx 反向代理后面。我的 nginx 配置如下所示:

server {
    listen 80;
    location / {
        proxy_pass ​http://localhost:9898;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

我的 Web 套接字服务器应用程序代码包含将客户端的 IP 地址存储在表中以供以后检索的逻辑。当他们连接时检索客户端的 IP 地址没有问题,因为我可以简单地做这样的事情,req.headers["x-forwarded-for"]因为我可以访问req每个新连接上的对象。我的问题是每当我想仅向某些客户端的子集发送服务器广播时检索“转发的 IP 地址”。因为每当我这样做时ws._socket.remoteAddressws网络套接字对象在哪里),我都期望得到 IP 地址:127.0.0.1.

我想这是关于我用来托管 Web 套接字服务器的特定 npm 包的问题:https ://www.npmjs.com/package/ws 。

标签: node.jswebsocketnginx-reverse-proxy

解决方案


您的问题已在您链接的 NPM 页面中得到解答:

当服务器在像 NGINX 这样的代理之后运行时,事实上的标准是使用X-Forwarded-For标头。

wss.on('connection', function connection(ws, req) {
  const ip = req.headers['x-forwarded-for'].split(/\s*,\s*/)[0];
});

那时你可以将它存储ipws对象上(事实上,你也可以ws._socket.remoteAddress用它覆盖ip)。


推荐阅读