允许普通用户监听1024以下的端口

允许普通用户监听1024以下的端口

我需要允许非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 运行,

  1. 在服务配置中设置所需的端口
  2. 打开单元文件(通常),转到该部分,添加新行并保存文件/etc/systemd/system/something.service[Service]AmbientCapabilities=CAP_NET_BIND_SERVICE
  3. 重新加载文件:systemctl daemon-reload
  4. (重新)启动服务:或systemctl start somethingsystemctl restart something

来源

答案4

你可以使用netcat 或 xinetd或 iptables 端口转发,或使用 apache 作为前端代理并在非特权端口上运行该进程。

相关内容