使用Node.js设置内部Web服务器

时间:2019-01-30 12:34:38

标签: node.js

我想使用HTTP模块在Linux虚拟机上托管带有node.js的Web应用程序。

由于该应用程序将可视化敏感数据,因此我想确保只能从同一LAN上的PC对其进行访问。

我的理解是,使用HTTP模块创建了一个Web服务器,该服务器最初只能由同一LAN上的其他PC访问。我已经看到,如果需要,可以通过隧道或端口转发来公开node.js服务器。

问题

  1. 是否还有其他重要考虑/可以从外部访问服务器的方式?

  2. 是否可以通过特定方式设置node.js服务器以确保仅本地流量可以访问它?

2 个答案:

答案 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服务器的流量。如果这不可能,则本地防火墙将是完成此任务的最佳工具。