我正在尝试在 ubuntu 服务器上设置一个简单的 node.js express 应用程序。我希望我的应用程序监听端口 :80,但它在启动时抛出错误,所以我将其更改为监听端口 :3000(我不太明白为什么它不能在端口 80 上工作,但我听说这不是一个好的做法)。我找到了一些关于如何进行 iptables 重新路由的帖子,所以我写了那个命令
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
然后我尝试访问我的服务器,它在桌面浏览器上工作正常(尽管需要一段时间才能得到响应),但当我尝试在手机上访问网站时,只有当我在地址栏中定义端口 3000 时,它才有效。此外,当我在桌面浏览器的地址栏中定义端口 :3000 时,响应是即时的。
有人能告诉我问题可能出在哪里吗?
答案1
然后我尝试访问我的服务器,它在桌面浏览器上工作正常(尽管需要一段时间才能得到响应),但当我尝试在手机上访问网站时,只有当我在地址栏中定义端口 3000 时,它才有效。此外,当我在桌面浏览器的地址栏中定义端口 :3000 时,响应是即时的。
我的第一个怀疑是您的服务器同时具有 IPv4 和 IPv6,但您仅添加了针对 IPv4 的 NAT 规则。
再做一次以ip6tables
处理 IPv6。
我希望我的应用程序监听端口:80,但是它在启动时会抛出错误,所以我将其改为监听端口:3000(我不太明白为什么它不能在端口 80 上工作,但我听说这不是一个好的做法)。
传统上,在 Unix 中,端口 1–1023 仅限于“root”用户使用。这是为了采取一项次要的安全措施,以便用户无法启动虚假远程控制或其他安全敏感服务。
要求以 root 身份启动应用程序是其“不是好做法”的原因——当然,程序之后不必继续以 root 身份运行,但它仍然是需要非常小心编写的附加代码。
但如果你运行Linux并通过systemd .service
,您可以通过两种方式避免此问题,您可以授予它具体来说仅允许使用低端口(称为 CAP_NET_BIND_SERVICE),或者您可以让 systemd 本身监听端口并将可立即使用的套接字提供给您的应用程序(称为套接字激活)。
(如果您目前没有通过 .service 启动应用程序——那么您应该这样做!)