SSH -L 连接成功,但 localhost 端口转发不起作用“通道 3:打开失败:连接失败:连接被拒绝”

Posted

技术标签:

【中文标题】SSH -L 连接成功,但 localhost 端口转发不起作用“通道 3:打开失败:连接失败:连接被拒绝”【英文标题】:SSH -L connection successful, but localhost port forwarding not working "channel 3: open failed: connect failed: Connection refused" 【发布时间】:2013-09-13 08:50:18 【问题描述】:

我的实验室在服务器上运行 RStudio。几周前,在我表弟的家里,我成功地通过 ssh 连接到服务器并通过本地 Firefox 浏览器启动了服务器端 RStudio。现在,当我尝试从家里(通过我自己的路由器)访问服务器 RStudio 时,它不起作用。我需要帮助进行故障排除,我猜这是路由器的问题。我正在运行 Mac OSX 10.6.8。不知道大学服务器在运行什么,但我认为这不是服务器端问题。

这是我第一次在我表弟家中的工作方式:首先,我通过 *** 连接到大学网络;然后我用端口转发调用SSH;然后我打开一个 Firefox 浏览器,连接到我的 localhost 端口,它会在服务器端打开 RStudio,我可以通过本地浏览器窗口访问它。

这是我现在尝试从家庭网络登录时遇到的问题:

我可以成功建立 *** 连接。我还可以使用以下命令成功设置 SSH: ssh -v -L 8783:localhost:8783 myacct@server.com

以下是成功的 ssh 命令的详细输出的最后几行:

debug1: Authentication succeeded (password).
debug1: Local connections to LOCALHOST:8783 forwarded to remote address localhost:8783
debug1: Local forwarding listening on 127.0.0.1 port 8783.
debug1: channel 0: new [port listener]
debug1: Local forwarding listening on ::1 port 8783.
debug1: channel 1: new [port listener]
debug1: channel 2: new [client-session]
debug1: Entering interactive session.
Last login: Mon Sep  2 04:02:40 2013 from ***ipaddress

所以我认为我在 *** 和 SSH 阶段仍然取得了成功(尽管我不知道为什么它说我上次登录是 9 月 2 日,那时我已经登录了几次)。

接下来,我打开 Firefox,然后键入 localhost:8783,而不是通过浏览器窗口获取 RStudio 服务器应用程序,而是收到以下错误:

在 Firefox 浏览器窗口中,它显示:找不到服务器,Firefox 在 www.localhost.com 找不到服务器,检查地址输入错误等。

在终端窗口中,它说:

debug1: Connection to port 8783 forwarding to localhost port 8783 requested.
debug1: channel 3: new [direct-tcpip]
channel 3: open failed: connect failed: Connection refused
debug1: channel 3: free: direct-tcpip: listening port 8783 for localhost port 8783, connect from 127.0.0.1 port 50420, nchannels 4

我不确定我做错了什么。自上次成功连接以来,我的笔记本电脑上没有任何更改。我在自己的路由器上(而不是我堂兄的),所以也许我需要弄乱防火墙?我已经允许端口 22 和 8783 通过防火墙进入我的笔记本电脑(我什至不确定我是否需要这样做)。帮忙?

【问题讨论】:

奇怪,你有没有想过查看你的主机文件?它应该定义 localhost = 127.0.0.1 在浏览器中尝试使用 127.0.0.1:8783 ... 【参考方案1】:
ssh -v -L 8783:localhost:8783 myacct@server.com
...
channel 3: open failed: connect failed: Connection refused

当您连接到本地系统上的端口 8783 时,该连接会通过您的 ssh 链接通过隧道连接到 server.com 上的 ssh 服务器。从那里,ssh 服务器与 localhost 端口 8783 建立 TCP 连接,并在隧道连接和隧道目标连接之间中继数据。

“连接被拒绝”错误来自 server.com 上的 ssh 服务器,当它尝试与隧道目标建立 TCP 连接时。 “连接被拒绝”意味着连接尝试被拒绝。拒绝的最简单解释是,在 server.com 上,没有任何东西在监听 localhost 端口 8783 上的连接。换句话说,您尝试通过隧道连接到的服务器软件没有运行,或者它正在运行但它是不在那个端口上监听。

【讨论】:

那么我该如何解决这个问题呢?我有一个带有数字海洋的水滴。如何让它“监听”我的连接? 是的。 Kenster 说你很可能没有在那个端口上运行任何东西。又名“我们试图监听您指定的端口,但该端口上没有任何内容”。这就像我为本地服务器的端口指定了端口转发,但是本地服务器还没有启动,它会抛出一个错误。但是启动服务器和 BOOM!错误消失。对于 Digital Ocean,请确保您的 ssh 服务器实际上正在侦听转发到本地计算机的端口。 您是否尝试过像这样添加前导“:”:ssh -v -L :8783:localhost:8783 myacct@server.com 尝试使用 IP 地址,而不是 localhost,例如ssh -v -L 8783:127.0.0.1:8783 myacct@server.comssh -v -L 8783:192.168.1.10:8783 myacct@server.com。还要检查 server.com 上运行的服务是否正在侦听正确的 IP 地址和端口 Kenster 是完全正确的——RStudio Server 不监听 8783,它监听 8787,至少在我的服务器上。所以我试图连接到一个没有做任何事情的端口。【参考方案2】:

发布此内容是为了帮助某人。

症状:

channel 2: open failed: connect failed: Connection refused
debug1: channel 2: free: direct-tcpip:
   listening port 8890 for 169.254.76.1 port 8890,
   connect from ::1 port 52337 to ::1 port 8890, nchannels 8

我的场景;我不得不使用远程服务器作为堡垒主机来连接其他地方。最终目的地/目标:169.254.76.1,端口 8890。通过具有公共 ip 的中间服务器:ec2-54-162-180-7.compute-1.amazonaws.com

SSH本地端口转发命令:

ssh -i ~/keys/dev.tst -vnNT -L :8890:169.254.76.1:8890
glue@ec2-54-162-180-7.compute-1.amazonaws.com

问题是什么: 目标主机的 8890 端口上没有服务绑定。我忘记启动服务了。

我是如何解决问题的:

SSH 进入堡垒主机,然后进行 curl。

希望这会有所帮助。

【讨论】:

【参考方案3】:

我曾经遇到过类似的问题,因为重新启动网络服务时服务器上的'localhost'不可用,例如'ifdown -a' 但后面只有 'ifup -eo1'。除了服务器没有监听端口外,您还可以检查“localhost”是否可用。

ps:贴出来只是希望有类似问题的人可以受益。

【讨论】:

【参考方案4】:

当我想通过隧道建立 vnc 连接时,我遇到了这个问题。 但是 vncserver 没有运行。 我用vncserver :3打开远程机器上的频道解决了这个问题。

【讨论】:

【参考方案5】:

注意:localhost 是使用本地(环回)网络接口的地址的主机名,127.0.0.1 是它在 IPv4 network standard 中的 IP(在 IPv6 中是 ::1)。 0.0.0.0 是 IPv4 标准的“当前网络”IP 地址。

我在安装 Docker 时遇到了这个错误。我有一个在外部服务器上运行的 Docker 容器,我(正确地)将其端口映射为127.0.0.1:9232:9232。通过端口转发ssh remote -L 9232:127.0.0.1:9232,我希望能够与remote 服务器的端口9232 进行通信,就好像它是我自己的本地端口一样。

事实证明,Docker 容器内部在 127.0.0.1:9232 而不是 0.0.0.0:9232 上运行其进程,因此即使我正确指定了容器的端口映射,它们也没有在正确的接口上运行绘制出来。

【讨论】:

我也有类似的问题,有两个 ssh 跃点后跟一个 Docker,但我不明白最后一段。您能否详细说明您为解决问题所做的工作? @McLawrence (Comment 1/2...) 例如,在 Docker Compose 文件中,您可以通过指定:ports: ["127.0.0.1:3000:9232"](这将暴露容器的 0.0.0.0:9232 端口主机的127.0.0.1:3000 端口)或ports: ["0.0.0.0:3000:9232"](这会将容器的0.0.0.0:9232 端口暴露在主机的0.0.0.0:3000 端口上)。顺便说一下,equivalent command in Docker Run 将是 -p 0.0.0.0:3000:9232 @McLawrence(评论 2/2...)如果容器在 127.0.0.1:9232 上运行进程,它不能映射到主机(它将不可见到主机,因为它是容器的本地网络接口)。相反,容器的进程必须0.0.0.0:9232上运行,如果你想将它映射到主机(不管你是映射到主机的127.0.0.1还是0.0.0.0接口),因为0.0.0.0是外网接口。【参考方案6】:

这意味着远程虚拟机没有监听当前端口,我通过在虚拟机服务器中添加端口解决了这个问题

【讨论】:

【参考方案7】:

只需将localhost 替换为127.0.0.1

(答案基于此页面上其他人的答案。)

【讨论】:

不适合我【参考方案8】:

在我的情况下,它在 linux 上运行 vncserver 后工作。

    在 linux 命令行上输入:sudo ssh -L 5901:localhost:5901 -i <ssh_private_key> <username>@<public-IP-address> 在那里输入vncserver 转到 VncViewer 应用程序并使用 localhost:5901 连接

【讨论】:

我在 Jupyter Notebook 运行 SSH 命令时遇到了同样的问题(没有 -v 标志)并从同一个终端会话启动进程,就像在这个例子中发生的那样。 【参考方案9】:

当我尝试通过 ssh 将我的mlflow ui 隧道化以远程查看时,我遇到了同样的错误。如第一个答案中所述,出现错误是因为服务器上没有任何东西在侦听端口。对我来说,这是因为我忘记在我的远程机器上启动 mlflow 应用程序!所以一般来说 - 确保您尝试远程访问的应用程序正在运行。

【讨论】:

【参考方案10】:

在我的情况下,它在检查用户凭据的正确 IP 地址后工作 之前我使用了错误的服务器IP

ssh -NfL 127.0.0.1:8084:127.0.0.1:8888 user@ip_address_of_server

改正后,效果很好。

【讨论】:

你可以使用 localhost 代替 127.0.0.1【参考方案11】:

遇到同样的错误。 就我而言,我发现问题出在 jupyter 的配置文件中。

假设有 3 台计算机,分别名为 A、B 和 C,A 可以访问 B,但不能访问 C; B 可以访问 C。

为了从A访问C的jupyter-notebook服务,首先我建立了从A通过B到C的ssh隧道,然后我通过输入localhost:port_number访问jupyter-notebook,然后我得到了错误。

最后通过在jupyter-notebook的配置文件中写入“c.NotebookApp.ip = '0.0.0.0'”解决了问题,其中'0.0.0.0'允许其他IP访问。

希望有类似情况的人能从中受益。

【讨论】:

以上是关于SSH -L 连接成功,但 localhost 端口转发不起作用“通道 3:打开失败:连接失败:连接被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用SSH登录远程服务器

如何使用SSH登录远程服务器

XShell SSH 跳板配置之jmeter连接跳板数据库

ssh远程连接客户端连不通故障排查

为啥我可以 ping 服务器但无法通过 SSH 连接? [关闭]

Mac 中ssh localhost连接失败的处理