SSH:对“侦听端口的远程端口转发失败”错误进行故障排除

ngm*_*ode 18 networking linux ssh port port-forwarding

问题:为什么会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。

Kam*_*ski 27

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

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

netstatfrom的输出bluehost表明某些东西已经在2222那里监听端口。它没有显示它是什么。

解决方案:

  1. 2222将您的ssh调用更改为在 上未使用的某个其他端口bluehost。只是让它更大,1023因为普通用户无法绑定到众所周知的端口;否则,无论端口是否在使用中,您都会收到相同的警告。
  2. 或者bluehostsudo lsof -i TCP:2222;标识收听过程 (on ) 终止或重新配置它以使端口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
Run Code Online (Sandbox Code Playgroud)

[…] 默认情况下,服务器上的 TCP 侦听套接字将仅绑定到环回接口。这可以通过指定一个bind_address. 空值bind_address或地址“ *”表示远程套接字应侦听所有接口。bind_address只有GatewayPorts启用了服务器的选项(请参阅参考资料),指定远程才会成功sshd_config(5)

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


小智 7

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

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