问题:为什么会ssh -N -R 2222:localhost:22 <bluehost_user>@<bluehost_ip>
出现“监听端口的远程端口转发失败”错误?目标是建立具有端口转发的反向隧道,以便始终通过 ssh 进入具有动态私有 IP 的 NAT 路由器后面的主机。详情见图片。
已经尝试过:
- 研究了 Google、Stackoverflow 等网站上的现有文献。其中有关于此错误消息的主题,但是给出的解决方案解决的根本原因与此特定实例不同,因为这些解决方案不能解决此情况下的错误。
- 我已执行多项诊断以验证所需端口是否已打开。部分结果如下图所示。
反向 SSH 隧道
更新
我尝试使用以下命令执行第 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>
导致“远程端口转发监听端口失败”的错误?
当我尝试使用远程端已被占用的端口时,我收到了这个确切的警告。
netstat
from的输出bluehost
表明某个程序已经在监听2222
该端口。但它没有显示它是什么。
解决方案:
2222
将您的调用更改ssh
为其他未使用的端口bluehost
。只需将其设置为大于,1023
因为普通用户无法绑定到知名端口;否则无论端口是否正在使用,您都会收到相同的警告。- 或者使用 来识别监听进程(开启
bluehost
)sudo 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_address
GatewayPorts
sshd_config(5)
这意味着您应该GatewayPorts yes
在 上sshd_config
。bluehost
阅读man 5 sshd_config
以了解更多信息。之后不要忘记重新加载服务。
答案2
确保 bluehost 上的 2222 端口没有挂起连接。在 bluehost 上测试lsof -t -i:2222
是否有任何进程 id 正在使用 2222 端口。此外,终止此进程(例如使用kill $(lsof -t -i:2222)
)。
这解决了我的问题。希望这些信息对其他人有用。:)