我想使用HTTP模块在Linux虚拟机上托管带有node.js的Web应用程序。
由于该应用程序将可视化敏感数据,因此我想确保只能从同一LAN上的PC对其进行访问。
我的理解是,使用HTTP模块创建了一个Web服务器,该服务器最初只能由同一LAN上的其他PC访问。我已经看到,如果需要,可以通过隧道或端口转发来公开node.js服务器。
问题
是否还有其他重要考虑/可以从外部访问服务器的方式?
是否可以通过特定方式设置node.js服务器以确保仅本地流量可以访问它?
答案 0 :(得分:2)
这真的取决于您要保护的内容。
例如,您局域网上的某人可以使用ngrok之类的端口来转发您的服务。您可以检查以下几件事:
x-forwarded-for
。因此,为了防止这种情况,您可以在传入请求中检查此标头,如果已设置,则可以拒绝该请求。 host
标头,它将指示客户端如何引用您的服务-如果它符合您的期望(可能是直接的本地LAN地址,例如192.168.0.xxx:3000
),那么一切正常,否则(我在本地服务上运行ngrok并获得了xxxxxxxx.ngrok.io
形式的内容),然后拒绝了它。当然,恶意的人可以创建自己的服务器来重定向请求。唯一的方法是输入用户名和密码或类似名称。至少您随后才知道谁(据说)正在访问您的服务并对此进行处理。
但是,如果您不打算对恶意的内部角色进行保护,那么您应该保持现状-我想不出任何办法(除非您的LAN中存在安全漏洞),被公开,无需有人积极设置。
我最后的建议是单独使用express之类的模块,而不是http
模块。确实确实使生活简单得多。我仅将这种服务器用于这种简单的内部服务器。
我想添加一个简单的例子。我已经用ngrok测试了它,它阻止了通过公共地址的访问,但是可以通过localhost查找。将主机测试更改为要从中提供此服务的任何本地地址。
const express=require('express');
const app=express();
app.use((req,res,next)=>{
if (req.headers.host!=='localhost:3000' || req.headers['x-forwarded-for']){
res.status(403).send('Invalid access!');
} else next();
});
app.get('/',(req,res)=>res.send('Hello World!'));
app.listen(3000,()=>{
console.log('Service started. Try it at http://localhost:3000/');
});
答案 1 :(得分:0)
在这里,我宁愿使用nginx作为代理,并依靠nginx的配置来接受从本地LAN到node.js Web服务器的流量。如果这不可能,则本地防火墙将是完成此任务的最佳工具。