如何在 NodeJS socket.io 服务器上设置 IP 白名单?

Posted

技术标签:

【中文标题】如何在 NodeJS socket.io 服务器上设置 IP 白名单?【英文标题】:How to set an IP whitelist on a NodeJS socket.io server? 【发布时间】:2021-10-10 16:13:17 【问题描述】:

我想将与套接字服务器的连接限制为 IP 列表,有没有简单的方法可以做到这一点?到现在都没找到。

谢谢

【问题讨论】:

【参考方案1】:

这可以通过几种方式完成..

    在连接上放置一些中间件以读取传入的请求 IP,根据 IP 列表(数组)检查它,如果它不起作用,则以错误代码响应。

    通过 nginx 使用 ACL,如果其 IP 未列出,NGINX 将阻止请求

    不是真正基于 IP,而是通过 JWT 控制访问。这将要求您生成令牌并将其与每个请求一起发送,但它确实提供了更多的安全性,您不必管理 IP 范围。在此架构中,您的用户将请求令牌,一旦将令牌发回,您就可以在头部或作为 req 参数的情况下向套接字服务器发出请求。然后套接字服务器对其进行解码,如果它正确解码(意味着它有效)则让它们连接,否则不要

【讨论】:

【参考方案2】:

@proxim0 之后,我使用了一个中间件:

io.use((socket, next) => 
    fs.readFile(__dirname + '/config.json', function(err, file) 
        if(err) return next(new Error("Internal error : " + err.message));

        const config = JSON.parse(file.toString('utf8'));
        if(!config.restrictAccess) return next();
        
        var ip = socket.request.headers['x-forwarded-for'] || socket.request.socket.remoteAddress || null;

        if(ip == null || config.allowedAddresses.indexOf(ip) == -1) 
            console.log("Access denied from remote IP " + ip);
            return next(new Error("Your IP address is not allowed to access this resource."));
        
        next();
    );
);

使用以下格式的 config.json 文件:


    "restrictAccess": true,
    "allowedAddresses": [
        "127.0.0.1",
        "123.456.789"
    ]

欢迎对改进提出任何意见。

【讨论】:

以上是关于如何在 NodeJS socket.io 服务器上设置 IP 白名单?的主要内容,如果未能解决你的问题,请参考以下文章

如何跨多个服务器 nodejs 和 socket.io 存储 socket.id

如何使用 mysql 数据库中的 nodejs 和 socket.io 在网页上获得实时更新?

如何在前端获取 socket.on 函数?事件被触发和处理。我正在使用 socket.io、NodeJS 服务器和 Redis.io

如何允许其他网络连接到服务器 nodejs socket io

NodeJS 和 Socket.IO 用户认证

如何使用套接字(socket.io)在 NodeJS 中找到客户端的响应时间(延迟)?