绑定到小于 1024 的端口,无需 root 访问权限

绑定到小于 1024 的端口,无需 root 访问权限

我想运行我正在开发的绑定到小于 1000 的端口号的应用程序,而不需要 root 访问权限。

我使用 Linux Mint 并具有 root 权限来设置它。我理想情况下希望能够通过 SSH 进行设置。

如果事实确实如此,并且这是不可能的或者我不应该这样做,我也很高兴听到这个消息。

编辑:大多数情况下我很乐意使用更高的端口号进行开发,但 Flash 需要端口 843 上的套接字策略。目前我必须以 root 身份运行该应用程序,因此我无法从我的 Makefile 运行它,这是一个 PITA。

答案1

让守护进程响应来自较低端口号的请求的另一种方法是使用 iptables 或类似方法将较低编号的端口重定向到守护进程正在监听的较高编号的端口:

sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

将 80 替换为要公开的端口,将 8080 替换为您的应用程序侦听端口。

答案2

当然可以。你只需要提供二进制文件CAP_NET_BIND_SERVICE。

sudo setcap cap_net_bind_service=ep some-binary

在 Linux 中,root 可以做的事情被分解为一组功能。CAP_NET_BIND_SERVICE 是绑定到 <= 1024 端口的能力。

甚至可能可以使用 AppArmor、SELinux 或其他 Linux 安全模块 (LSM) 来授予程序访问权限以绑定特定端口,但我认为这会浪费时间。安全性实际上并不像过去那样基于端口号。

以下是 OSX 将端口 80 和 443 转发到非特权端口的脚本:

echo " 
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -

答案3

我认为有办法做到这一点,但我不能 100% 确定这是否有效。

它的端口绑定需要root,而不是应用程序使用它,所以下面的方法可能有效,但您首先需要有sudo访问权限。

首先,您使用 以 root 用户身份启动您的进程sudo myApp,一旦端口被绑定,您就可以将进程的所有者切换为非特权用户。

答案4

我依稀记得有一个名为“authbind”的库可以满足您的需要,它通过包装 bind() 系统调用(通过 LD_PRELOAD 库),并且如果请求特权端口,则生成一个 setuid root 程序来接收文件描述符的副本,然后验证应用程序确实被允许绑定到端口,执行 bind() 并退出。

不确定项目状态,但如果需要的话,该方法应该相当容易(重新)实施。

相关内容