SSH:解决“远程端口转发监听端口失败”错误

SSH:解决“远程端口转发监听端口失败”错误

问题:为什么会ssh -N -R 2222:localhost:22 <bluehost_user>@<bluehost_ip>出现“监听端口的远程端口转发失败”错误?目标是建立具有端口转发的反向隧道,以便始终通过 ssh 进入具有动态私有 IP 的 NAT 路由器后面的主机。详情见图片。

已经尝试过:

  1. 研究了 Google、Stackoverflow 等网站上的现有文献。其中有关于此错误消息的主题,但是给出的解决方案解决的根本原因与此特定实例不同,因为这些解决方案不能解决此情况下的错误。
  2. 我已执行多项诊断以验证所需端口是否已打开。部分结果如下图所示。

反向 SSH 隧道

图片 1

更新

我尝试使用以下命令执行第 2 步: reduser@redhost:~ ssh greenuser@greenhost -p 2222

应该是: reduser@redhost:~ ssh greenuser@bluehost -p 2222 您想在 bluehost IP 上使用 greenuser 凭据,因为当您使用端口 2222 时登录的主机实际上是 greenhost。

答案1

为什么会ssh -N -R 2222:localhost:22 <bluehost_user>@<bluehost_ip>导致“远程端口转发监听端口失败”的错误?

当我尝试使用远程端已被占用的端口时,我收到了这个确切的警告。

netstatfrom的输出bluehost表明某个程序已经在监听2222该端口。但它没有显示它是什么。

解决方案:

  1. 2222将您的调用更改ssh为其他未使用的端口bluehost。只需将其设置为大于,1023因为普通用户无法绑定到知名端口;否则无论端口是否正在使用,您都会收到相同的警告。
  2. 或者使用 来识别监听进程(开启bluehostsudo lsof -i TCP:2222;终止或重新配置它以使端口2222可用。

编辑:

就您而言,这部分man ssh似乎很重要:

-R [bind_address:]port:host:hostport
-R [bind_address:]port:local_socket
-R remote_socket:host:hostport
-R remote_socket:local_socket

[…] 默认情况下,服务器上的 TCP 侦听套接字将仅绑定到环回接口。这可以通过指定 来覆盖bind_address。空的bind_address或地址“ ”表示远程套接字应侦听所有接口。仅当启用服务器的选项时*,指定远程才会成功(请参阅)。bind_addressGatewayPortssshd_config(5)

这意味着您应该GatewayPorts yes在 上sshd_configbluehost阅读man 5 sshd_config以了解更多信息。之后不要忘记重新加载服务。

答案2

确保 bluehost 上的 2222 端口没有挂起连接。在 bluehost 上测试lsof -t -i:2222是否有任何进程 id 正在使用 2222 端口。此外,终止此进程(例如使用kill $(lsof -t -i:2222))。

这解决了我的问题。希望这些信息对其他人有用。:)

相关内容