为啥在 macos 上即使使用了 sudo 也没办法运行 Nodejs 应用在 443 端口

发布于 1周前 作者 yibo5220 来自 nodejs/Nestjs

为啥在 macos 上即使使用了 sudo 也没办法运行 Nodejs 应用在 443 端口

已经用了

sudo npm run dev

然后总是提示

✖ 「 wds 」:  Error: listen EACCES: permission denied 192.168.0.126:443
    at Server.setupListenHandle [as _listen2] (node:net:1302:21)
    at listenInCluster (node:net:1367:12)
    at GetAddrInfoReqWrap.doListen [as callback] (node:net:1505:7)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:73:8) {
  code: 'EACCES',
  errno: -13,
  syscall: 'listen',
  address: '192.168.0.126',
  port: 443
}

也已经用了

sudo lsof -i:443

命令去查了占用,该 kill 的也都 kill 了,还是不行,怎么办


5 回复

试了下 python 的 http.server ,不用 sudo 都可以,只是第一次运行弹出了防火墙允许传入连接的请求


这个我试过了。。。都不行,之前就搜索过了,其实能搜的关键词我都搜了

在macOS上,即使使用了sudo也无法运行Node.js应用在443端口,这通常是由于macOS的安全策略限制。1024以下的端口(包括443)被视为受保护端口,需要root权限才能绑定。然而,仅仅使用sudo可能不足以绕过这些限制。

这里有几种可能的解决方案:

  1. 端口转发: 使用pfctl配置端口转发规则,将443端口的流量转发到Node.js应用实际监听的端口(例如8443)。配置示例如下:

    sudo pfctl -F all -f /dev/null   # 清除所有现有规则
    echo "rdr pass on lo0 inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443" | sudo tee /etc/pf.anchors/http
    sudo pfctl -vnf /etc/pf.anchors/http  # 检测配置文件
    echo "rdr-anchor \"http-forwarding\"" | sudo tee -a /etc/pf.conf
    echo "load anchor \"http-forwarding\" from \"/etc/pf.anchors/http\"" | sudo tee -a /etc/pf.conf
    sudo pfctl -ef /etc/pf.conf  # 加载配置
    

    配置完成后,将Node.js应用运行在8443端口,并通过443端口访问。

  2. 直接修改应用权限: 使用sudo启动Node.js应用,并确保应用有足够的权限绑定到443端口。然而,这种方法可能会带来安全风险,因为它绕过了操作系统的安全策略。

回到顶部