17

我正在运行一个 node.js 服务器,它将为端口 80 上的请求提供服务。显然,这需要应用程序以 root 身份运行(在 Linux 上)。

以这篇文章(http://syskall.com/dont-run-node-dot-js-as-root)为例,很明显有一些简单的方法可以让节点以非root用户身份运行,但我想知道是否有人对建议的不同方法的优缺点有看法:

  1. 代码:在监听端口 80 后,使用 setuid() 从 root 下拉到非特权用户。

  2. 使用某种代理服务器将请求重定向到> 1024的端口(因此不需要节点以root身份运行)

  3. 使用 IP 表转发到另一个端口(同上节点不会以 root 身份运行)

谢谢

4

3 回答 3

22

选项 1 要求您以 root 身份启动节点服务器。不理想。

选项 2 为每个处理的请求增加了开销,并为您的堆栈添加了另一个故障点。

选项 3 是最简单和最有效的方法。

要实施选项 3,请将以下内容添加到您的系统初始化脚本中。(/etc/rc.d/rc.local在基于 RedHat 的系统上,如 AWS)。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

这会将请求从端口 80 重定向到端口 3000。

于 2013-07-04T10:22:26.440 回答
5

(我没有足够的声誉来添加对马特布朗的评论,所以我写这个作为答案。随意编辑。)

与 Matt Browne 的链接中描述的方法相比,有一种更简单的方法可以在重启后自动加载 iptables 规则:可以使用 apt-get 从存储库安装 iptables-persistent:

apt-get install iptables-persistent

规则仍然需要像这样手动保存:

IPv4:

iptables-save > /etc/iptables/rules.v4

IPv6:

iptables-save > /etc/iptables/rules.v6

(来源:http ://www.thomas-krenn.com/de/wiki/Iptables_Firewall_Regeln_dauerhaft_speichern (德语))

于 2014-02-14T15:13:41.193 回答
5

我喜欢这种解决方法的简单性:

sudo setcap 'cap_net_bind_service=+ep' `which node`

它也适用于 nodejs 以外的程序。

基本上作为第二个参数,您键入程序可执行文件的路径(如/usr/bin/nodejs在 Ubuntu 上),在上述情况下which node应动态提供它,从而使其独立于 Linux 发行版工作。

请注意,当您升级 nodejs 或可执行文件由于某些其他原因被覆盖时,您将不得不再次执行相同的命令。

资料来源:

于 2017-07-01T18:22:18.230 回答