如何打开端口80,以便非根进程可以绑定到该端口?


46

我想在Mac上以非root用户身份运行Web服务器。通常,只有根进程才能绑定到端口80(或低于1024的任何端口)。

我可以专门打开端口80,以便非root进程可以监听吗?


相关链接:link1link2
内森·法灵顿

更像unix.stackexchange.com问题,不是吗?
Filip Bartuzi 2015年

1
为什么要在macOS系统上使用unix?
nhed 2015年

Answers:


27

这在设计上很难做到,除非您具有对计算机的超级用户访问权限,否则以下任何一项都不起作用,因为它们需要超级用户才能设置更改。但是,一旦更改,用户空间程序将无需root就可以访问。

有两种常见的方法可以完成此操作,您选择哪种方法取决于您尝试解决限制的原因:

将端口80指向另一个端口,例如8080

通过将计算机重新配置为将所有端口80流量传递到端口8080或您选择的任何端口,则可以允许用户空间服务器在它们可以访问的区域中接收root用户特权端口。

这个过程很简单:

步骤1:查看当前的防火墙规则。

sudo ipfw show

步骤2:添加端口转发规则(80至8080)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

如果要删除防火墙规则,请运行:

sudo ipfw刷新

来源

这是一个临时更改,将在您重新启动后恢复,或者按照最后一行中的指示进行刷新。

您可以使更改成为永久更改,也可以在启动服务器之前将命令添加为启动行,从安全角度考虑,这可能更安全。

使用Authbind

Authbind是专门为允许一个程序访问较低级别的端口而没有给予其完全根访问权限而设计的。

有一个OS X端口:

https://github.com/Castaglia/MacOSX-authbind

但是,它可能仍然仅限于IPv4流量,您可能必须进行一些其他调查才能确定它是否满足您的需求。


LOVE MacOSX-authbind ...它允许您例如以“常规管理员”在端口80上运行Web服务器。即在你的launchd .plist...` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]呜呼!
亚历克斯·格雷2014年

13
OS X Yosemite删除ipfw本要点描述了使用的替代解决方案pf
lyschoening 2014年

请注意,如果您使用的是共享环境,将流量重定向到非特权端口可能是不安全的。在您的程序执行该操作之前,或者您的程序甚至暂时取消绑定该端口以进行快速重启,则另一个进程可能已绑定到该端口。
Lie Ryan

authbind ist确实是一个很好的解决方案,谢谢!
favo 2015年

7

您可以ncat用来转发来自其他端口上运行的Web服务器的流量:

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

这会将端口80上的流量转发到localhost:1234。这有点麻烦,但是我不会在快速测试之外的任何地方使用它,而且绝对不会在生产中使用它。

请注意,这不允许非根进程绑定到该端口,但是通过选择该进程可以绑定到的端口,在本示例中,它看起来像是绑定到端口80。使用防火墙将端口80转发到端口1234,但这只是暂时的。


2
这是一个很好的解决方法。注意 ncat附带nmap可以通过Mac Ports使用进行安装sudo port install nmap。MacPorts本身可以从macports.org/install.php安装。
威廉·丹尼斯

这只是给我bind:地址已在使用中的错误。
马特·乔纳

同样在这里-没有用。这可以解决问题:unix.stackexchange.com/a/187038
Sebastian J.

2

您也可以使用ssh进行端口转发。因此,如果您有一台运行在8080上的服务器,则可以从端口80转发流量。这是我使用的脚本,如果该脚本正在运行,它将停止本地apache并转发流量:

forward8080to80.command:

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh user@127.0.0.1 -L 80:127.0.0.1:8080

Ssh端口转发的性能可能非常低,并且在本地->本地环境中,安全功能没有多大意义。最好使用osx的内置端口转发或类似ncat的东西。
Shayne

-3

您应该能够做的是打开路由器上的端口80,并将其指向Web服务器的本地IP地址。然后在Mac上,从“系统偏好设置”>“共享”偏好设置窗格中启用“ Web共享”,然后将其指向您选择的目录。过去,这一直适用于我,直到切换到10.6 Server。


1
我正在寻找这作为我自己的开发机器的解决方案。由于我必须在无法控制路由器的地方工作,因此该解决方案对我不起作用。我怀疑如果您要设置服务器并且由于某种原因没有超级用户访问权限,它应该可以工作。
Avner

因此,为了清楚起见,您正在尝试在不同的客户端站点上设置Web服务器,但是没有开放端口80的访问权限?如果没有访问权限,如何在路由器上打开端口?我是正确理解还是我脱离了基础?
Matt Love

我只是想在我自己的开发机器上而不是生产服务器上使用端口80。我还是部署在heroku上。
Avner 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.