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

peo*_*oro 73 linux networking tcp privileges authbind

我需要允许用户(与 root 不同)运行侦听端口 80 的服务器。

有没有办法做到这一点?

Roh*_*nga 59

setcap 'cap_net_bind_service=+ep' /path/to/program

这将适用于特定过程。但是要允许特定用户绑定到 1024 以下的端口,您必须将他添加到 sudoers。

看看这个讨论更多。


Gil*_*il' 35

(其中一些方法已在其他答案中提到;我按偏好的粗略顺序给出了几种可能的选择。)

您可以将低端口重定向到高端口并侦听高端口。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080
Run Code Online (Sandbox Code Playgroud)

您可以以 root 身份启动服务器并在它开始侦听特权端口后删除特权。最好不要自己编写代码,而是从为您完成工作的包装器启动您的服务器。如果您的服务器为每个连接启动一个实例,请从inetd(或类似程序,例如xinetd)启动它。对于inetd,在 中使用这样的行/etc/inetd.conf

http  stream  tcp  nowait  username:groupname  /path/to/server/executable  argv[0] argv[1]…
Run Code Online (Sandbox Code Playgroud)

如果您的服务器在单个实例中侦听,请从诸如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
Run Code Online (Sandbox Code Playgroud)

  • 在我不得不处理的每种情况下,可执行文件都是一个启动 java 或 python 的脚本。作为一个没有 10 小时花在细节上的人,你的 iptables 解决方案可以轻松解决它。 (4认同)

小智 7

如果该服务由 systemd 运行,

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

来源


Dom*_*kis 5

Authbind,@Gilles 已经提到了它,但我想稍微扩展一下。

它具有方便的访问控制(详细信息在手册页中):您可以通过端口、接口地址、uid、地址范围或端口以及这些的组合来过滤访问。

它有非常有用的参数--depth

--深度级别

导致 authbind 影响调用图中深层次的程序。默认值为 1。

“级别深”意味着当一个脚本(或程序)运行另一个脚本时,它会下降一个级别。因此,如果您拥有--depth 5它意味着在 1 级(或者是 0 级?)到 5 级,您有权绑定,而在 6 级及以上,则没有。当您希望脚本具有访问权限而不是在您不知情或不知情的情况下运行的程序时很有用。


举例来说,你可以有这样的事情:为了安全起见,你有一个java只运行 java的用户,你想让他访问端口 80:

echo > /etc/authbind/byport/80
chown root:java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80
Run Code Online (Sandbox Code Playgroud)

我创建了../byport/80 file, 将它提供给java用户组(每个用户都有自己的组),并使其按组执行,这意味着它可由java用户执行。如果您通过端口授予访问权限,则该文件必须可由应具有访问权限的用户执行,因此我们这样做了。

对于普通的 Joe 来说,这可能已经足够了,但是因为您知道如何使用该--depth参数,所以您(作为java用户)authbind --depth [depth] my_web_app's_start_script从 开始运行并逐步--depth 1增加,直到找到可行的最小深度并使用它。

阅读手册页了解详细信息