跟进:看起来与每个服务器运行几个月相吻合的一系列快速断开连接可能是巧合,只是用来揭示实际问题。它无法重新连接的原因几乎可以肯定是由于 AliveInterval 值(kasperd 的回答)。使用 ExitOnForwardFailure 选项应该允许在重新连接之前正确发生超时,这应该可以解决大多数情况下的问题。MadHatter 的建议(kill 脚本)可能是确保隧道可以重新连接的最佳方法,即使其他一切都失败了。
我在防火墙后面有一个服务器 (A),它在几个端口上启动一个反向隧道到一个小的 DigitalOcean VPS (B),所以我可以通过 B 的 IP 地址连接到 A。这条隧道已经持续工作了大约 3 个月,但在过去的 24 小时内突然发生了四次故障。不久前,另一家 VPS 提供商也发生了同样的事情——几个月的完美运营,然后突然出现多次快速故障。
我在机器 A 上有一个脚本,它自动执行隧道命令(ssh -R *:X:localhost:X address_of_B对于每个端口 X),但是当它执行时,它说Warning: remote port forwarding failed for listen port X.
进入/var/log/secure服务器上的 sshd显示以下错误:
bind: Address already in use
error: bind: Address already in use
error: channel_setup_fwd_listener: cannot listen to port: X
Run Code Online (Sandbox Code Playgroud)
解决需要重启VPS。在那之前,所有重新连接的尝试都会给出“远程端口转发失败”的消息,并且不会起作用。现在到了隧道只持续大约 4 小时才停止的地步。
VPS 上没有任何变化,它是一台一次性使用的单用户机器,仅用作反向隧道端点。它在 CentOS 6.5 上运行 OpenSSH_5.3p1。当连接丢失时,sshd 似乎没有关闭其末端的端口。我无法解释为什么,或者为什么在几个月近乎完美的操作之后会突然发生。
为了澄清,我首先需要弄清楚为什么 sshd 在隧道失败后拒绝侦听端口,这似乎是由 sshd …