我想运行我正在处理的应用程序,该应用程序绑定到小于 1000 的端口号,而无需 root 访问权限。
我正在使用 Linux Mint 并且具有 root 访问权限来设置它。理想情况下,我希望能够通过 SSH 做到这一点。
也很高兴听到如果这是不可能的,或者我不应该这样做,如果是这样的话。
编辑:大多数情况下,我很乐意使用更高的端口号进行开发,但 Flash 期待端口 843 上的套接字策略。目前我必须以 root 身份运行该应用程序,因此我无法从我的 Makefile 运行它,这是一个 PITA .
joe*_*ker 43
当然这是可能的。您只需要提供二进制 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 -
Run Code Online (Sandbox Code Playgroud)
Jam*_*s C 40
让您的守护程序响应来自较低端口号的请求的另一种方法是使用 iptables 或类似方法将较低编号的端口重定向到您的守护程序正在侦听的较高编号端口:
sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080
Run Code Online (Sandbox Code Playgroud)
将 80 替换为要公开的端口,将 8080 替换为您的应用程序侦听器端口。
我认为有办法做到这一点,但我不能 100% 确定这是否可行。
它是需要 root 的端口的绑定,而不是应用程序正在使用它,所以下面的方法可能有效,但你首先需要有 sudo 访问权限。
首先,您以 root 用户身份使用 启动进程sudo myApp
,一旦端口被绑定,您就可以将进程的所有者切换为非特权用户。
我模糊地记得一个名为“authbind”的库,它通过包装 bind() 系统调用(通过 LD_PRELOAD 库)来满足您的需要,并且如果请求特权端口,则生成一个 setuid root 程序,该程序接收文件描述符,然后验证应用程序确实被允许绑定到端口,执行 bind() 并退出。
不确定项目状态,但如果需要,该方法应该相当简单(重新)实施。
归档时间: |
|
查看次数: |
51720 次 |
最近记录: |