如何纠正 ssh 本地端口转发提示端口已被使用?

如何纠正 ssh 本地端口转发提示端口已被使用?

我正在运行一个 Web 服务器,该服务器在客户端计算机上本地公开一个网站dev.local.company.com:3888,我想通过 ssh 在本地网络上的另一台计算机上访问该网站。两台计算机都是 macOS,dev.local.company.com 域相当于 localhost。

因此,我ssh -L 3888:dev.local.company.com:4000 connors-mbp尝试将 dev.local.company 内容转发到端口 3888,以便在远程端口 4000 上查看。此操作有效并登录到远程。但是,当我尝试启动 Web 服务器时,它显示错误,指出端口 3888 已被使用,并指出 SSH 本身正在使用它。

如果 SSH 应该转发该端口,为什么它会在该端口上“运行”?错误如下所示。

? Something is already running on port 3888. Probably:
  ssh -L 3888:dev.local.company.com:3000 Connors-MBP-3 (pid 38536)
  in /Users/connor

以相反的顺序运行,首先打开服务器,然后尝试运行ssh -L,ssh 显示错误,指出端口已被服务器使用。此替代顺序的错误如下所示。

bind [127.0.0.1]:3888: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 3888

答案1

消息正确;端口正在使用。“本地”或-L隧道在SSH 客户端端,通过服务器转发到端点的连接;它们自然会与 SSH 客户端系统上的任何其他侦听器发生冲突。

你要的是完全相反– “在远程端口 4000 上可查看”意味着监听器需要位于SSH 服务器端,转发目标是您的客户端。这意味着如果您正在 SSH“Web 服务器”机器需要使用其他隧道类型,-R或“远程”隧道,您还需要交换其监听和目标参数:

ssh -R 4000:dev.local.company.com:3888 connors-mbp
-or-
ssh -R 4000:localhost:3888 connors-mbp

这里4000(隐含的localhost:4000)将是“connors-mbp”机器上的监听器,它将连接转发到客户端机器上的“dev.local.company.com:3888”。

一般来说,语法总是<new_listen_port>:<connect_host>:<connect_port>。带有-Llisten 端口的是在 SSH 客户端,带有-Rit 的是在 SSH 服务器端。


请记住,Web 服务器不知道您在这些选项中使用了哪个域名;它只知道最终 URL(即浏览器发送的 HTTP“Host:”标头)中使用的域名,因此-R 4000:dev.local.company.com:3888-R 4000:localhost:3888在您的情况下完全等效(正如您提到的那样,您有一个前者的 /etc/hosts 映射)。如果 Web 服务器希望使用特定的“Host:”标头进行调用,您还需要在另一台计算机上添加相同的映射(也指向 127.0.0.1)。

相关内容