【发布时间】:2021-10-10 16:13:17
【问题描述】:
我想将与套接字服务器的连接限制为 IP 列表,有没有简单的方法可以做到这一点?到现在都没找到。
谢谢
【问题讨论】:
标签: node.js socket.io ip whitelist
我想将与套接字服务器的连接限制为 IP 列表,有没有简单的方法可以做到这一点?到现在都没找到。
谢谢
【问题讨论】:
标签: node.js socket.io ip whitelist
这可以通过几种方式完成..
在连接上放置一些中间件以读取传入的请求 IP,根据 IP 列表(数组)检查它,如果它不起作用,则以错误代码响应。
通过 NGINX 使用 ACL,如果其 IP 未列出,NGINX 将阻止请求
不是真正基于 IP,而是通过 JWT 控制访问。这将要求您生成令牌并将其与每个请求一起发送,但它确实提供了更多的安全性,您不必管理 IP 范围。在此架构中,您的用户将请求令牌,一旦将令牌发回,您就可以在头部或作为 req 参数的情况下向套接字服务器发出请求。然后套接字服务器对其进行解码,如果它正确解码(意味着它有效)则让它们连接,否则不要
【讨论】:
在 @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"
]
}
欢迎对改进提出任何意见。
【讨论】: