我想运行我正在处理的应用程序绑定到小于1000的端口号,而不需要root权限。
我正在使用Linux Mint并具有root权限来设置它。 我希望能够通过SSH做到这一点。
也很高兴听到,如果不可能,或者我不应该这样做,如果是这样的话。
编辑:大部分我很乐意使用更高的端口号进行开发,但Flash期望在端口843上的套接字策略。目前我必须以root身份运行该应用程序,因此我不能从我的Makefile这是一个PITA 。
让守护进程响应来自较低端口号的请求的另一种方法是使用iptables或类似的方法将较低编号的端口redirect到守护进程正在监听的较高编号的端口。
当然这是可能的。 您只需要提供二进制CAP_NET_BIND_SERVICE。
sudo setcap cap_net_bind_service=ep some-binary
在Linux中,根可以做的事情已经被分解成一组function。 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 -
我认为有办法做到这一点,但我不是100%肯定这是否会奏效。
它需要根的端口的绑定,而不是应用程序的使用它,所以下面的方法可能工作,但你需要首先具有sudo访问。
首先,以root用户身份使用sudo myApp
启动进程,一旦绑定了端口,就可以将进程的所有者切换为非特权用户。
我模糊地记得一个名为“authbind”的库,它通过包装bind()系统调用(通过LD_PRELOAD库)来完成你所需要的工作,并且,如果请求特权端口,产生一个setuid根程序,文件描述符,然后validation应用程序确实被允许绑定到端口,执行bind()并退出。
不确定项目状态,但如果需要的话,该方法应该相当简单(重新)实施。