使用端口80运行Node.js时的最佳做法(Ubuntu/Linode)

Rob*_*ugs 250 linux security configuration web-applications node.js

我正在设置我的第一台Node.js服务器cloud Linux node,我对细节很新Linux admin.(顺便说一句,我不是在尝试同时使用Apache.)

一切都安装正确,但我发现,除非我使用root login,我无法听port 80节点.但是出于安全原因,我宁愿不以root身份运行它.

什么是最佳做法:

  1. 为节点设置好的权限/用户以使其安全/沙盒化?
  2. 允许在这些约束内使用端口80.
  3. 启动节点并自动运行它.
  4. 处理发送到控制台的日志信息.
  5. 任何其他一般维护和安全问题.

我应该将端口80流量转发到不同的侦听端口吗?

谢谢

Dan*_*iel 516

80号港口

我在我的云实例上做的是使用以下命令将端口80重定向到端口3000:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
Run Code Online (Sandbox Code Playgroud)

然后我在端口3000上启动我的Node.js.端口80的请求将被映射到端口3000.

您还应该编辑您的/etc/rc.local文件并添加该行减去sudo.这将在机器启动时添加重定向.您不需要sudoin,/etc/rc.local因为那些命令root在系统引导时运行.

日志

使用forever模块启动Node.js.它将确保它在崩溃时重新启动,并将控制台日志重定向到文件.

在Boot上启动

将Node.js启动脚本添加到您为端口重定向编辑的文件中/etc/rc.local.这将在系统启动时运行Node.js启动脚本.

数字海洋和其他VPS

这不仅适用于Linode,还适用于Digital Ocean,AWS EC2和其他VPS提供商.但是,基于RedHat的系统/etc/rc.local/ect/rc.d/local.

  • 顺便说一下,在Ubuntu上,它是/etc/rc.local (20认同)
  • 通常,"-i eth0"标志将成为虚拟专用服务器的问题.根据需要替换eth0. (11认同)
  • 如果我将我的Node.js启动脚本添加到`/ etc/rc.local`,它不会在系统启动时作为`root`执行吗?这将破坏端口80重定向的目的. (7认同)
  • 请注意,要使端口重定向生效,目标端口也需要在防火墙上运行.WRT在启动时启动节点实例,我们只是使用分发的init脚本/ systemd文件,允许您指定用户. (4认同)
  • 谢谢你的回答,很好,也很重要. (2认同)
  • `添加Node.js脚本到/ etc/rc.local`是什么意思?我只需要添加一行调用脚本,即行:`node server.js`? (2认同)
  • 非常糟糕的解决方案,您正在为内核加载不必要的流量。所有数据包都从一个缓冲区复制到另一个缓冲区,这是在浪费资源。更好的选择是在初始化时将setuid 0设置为节点进程,以便它可以获取特权端口,在bind()之后,您只需删除特权即可。 (2认同)

Mee*_*hta 108

授予安全用户权限以使用端口80

请记住,我们不希望以root用户身份运行您的应用程序,但有一个障碍:您的安全用户无权使用默认HTTP端口(80).您的目标是能够通过导航到易于使用的URL来发布访问者可以使用的网站http://ip:port/

不幸的是,除非您以root身份登录,否则通常必须使用类似的URL http://ip:port- 其中端口号> 1024.

很多人都被困在这里,但解决方案很简单.有一些选择,但这是我喜欢的.输入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
Run Code Online (Sandbox Code Playgroud)

现在,当您告诉Node应用程序您希望它在端口80上运行时,它不会抱怨.

检查此参考链接

  • 这是更好,更简单的答案. (8认同)
  • 另外,在此处添加了详细的答案http://stackoverflow.com/questions/23281895/node-js-eacces-error-when-listening-on-http-80-port-permission-denied/23281904#23281904 (2认同)
  • 最佳答案.:) (2认同)

slu*_*und 14

绑定到端口80(或443)后删除root权限.

这允许端口80/443保持受保护,同时仍然阻止您以root身份提供请求:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}
Run Code Online (Sandbox Code Playgroud)

使用上述功能的完整工作示例:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});
Run Code Online (Sandbox Code Playgroud)

请参阅此完整参考资料.


Nic*_*nes 8

对于80号港口(这是原始问题),丹尼尔是完全正确的.我最近搬到了https不得不切换iptables到管理SSL证书的轻型nginx代理.我发现了一个有用的答案与沿要点通过gabrielhpugliese如何处理这个问题.基本上我

希望这可以为别人带来一些麻烦.我确信有一种纯粹的节点方式可以做到这一点,但是nginx很快就可以了.