如何在 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