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

How to set an IP whitelist on a NodeJS socket.io server?

我想将与套接字服务器的连接限制为一个 IP 列表,有什么简单的方法可以做到这一点吗?到目前为止我找不到。

谢谢

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

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

  2. 通过 NGINX 使用 ACL,如果他们的 IP 未列出,NGINX 将阻止请求

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

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

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"
    ]
}

欢迎任何关于改进的评论。