我需要允许非root用户运行在端口tcp/80上监听的服务器。
有什么办法可以做到这一点吗?
答案1
setcap 'cap_net_bind_service=+ep' /path/to/program
这适用于特定流程。但要允许特定用户绑定到 1024 以下的端口,您必须将其添加到 sudoers 中。
看看这个讨论了解更多。
答案2
(其中一些方法已在其他答案中提到;我按照粗略的优先顺序给出了几种可能的选择。)
您可以将低端口重定向到高端口并监听高端口。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080
您可以以 root 身份启动服务器,并在服务器开始侦听特权端口后删除特权。最好不要自己编码,而是从为您完成工作的包装器启动服务器。如果您的服务器为每个连接启动一个实例,请从以下位置启动它inetd
(或类似的程序,例如xinetd
)。对于inetd
,在 中使用如下行/etc/inetd.conf
:
http stream tcp nowait username:groupname /path/to/server/executable argv[0] argv[1]…
如果您的服务器在单个实例中侦听,请从以下程序启动它authbind
。创建一个空文件/etc/authbind/byport/80
并使其对运行服务器的用户可执行;或 create /etc/authbind/byuid/1234
,其中 1234 是运行服务器的 UID,包含行0.0.0.0/0:80,80
.
如果您的服务器可执行文件存储在支持功能的文件系统上,您可以为其指定cap_net_bind_service
能力。请注意,这些功能仍然相对较新,并且还有一些问题。
setcap cap_net_bind_service=ep /path/to/server/executable
答案3
如果该服务由 systemd 运行,
- 在服务配置中设置所需的端口
- 打开单元文件(通常),转到该部分,添加新行并保存文件
/etc/systemd/system/something.service
[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
- 重新加载文件:
systemctl daemon-reload
- (重新)启动服务:或
systemctl start something
systemctl restart something
答案4
你可以使用netcat 或 xinetd或 iptables 端口转发,或使用 apache 作为前端代理并在非特权端口上运行该进程。