后续行动:看起来像是一系列快速断开连接,同时每台服务器都运行了几个月,这可能是偶然的,只是用来揭示实际问题。未能重新连接的原因几乎可以肯定是由于AliveInterval值(卡巴斯德的回答)。使用ExitOnForwardFailure选项应该允许超时在重新连接之前正确发生,这在大多数情况下应该可以解决问题。MadHatter的建议(kill脚本)可能是确保隧道可以重新连接的最佳方法,即使其他一切都失败了。
我在防火墙后面有一个服务器(A),该服务器在多个端口上启动了到小型DigitalOcean VPS(B)的反向隧道,因此我可以通过B的IP地址连接到A。隧道已经连续工作了大约3个月,但在过去的24小时内突然发生了四次故障。同一件事发生在另一家VPS提供商身上-几个月的完美运行,然后突然出现了多次快速故障。
我在机器A上有一个脚本,该脚本会自动执行tunnel命令(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
解决方法是重新启动VPS。在此之前,所有尝试重新连接的消息都会显示“远程端口转发失败”消息,并且将无法正常工作。现在到了隧道仅持续约4个小时才停止的地步。
VPS上没有任何变化,它是一次性使用的单用户计算机,仅充当反向隧道终结点。它在CentOS 6.5上运行OpenSSH_5.3p1。似乎当连接断开时,sshd不会关闭其末端的端口。我无所适从地解释了为什么,或者为什么经过数月近乎完美的运行现在突然会发生这种情况。
为了澄清,我首先需要弄清楚为什么sshd在隧道故障后拒绝侦听端口,这似乎是sshd使端口保持打开状态并且从不关闭它们引起的。这似乎是主要问题。我只是不确定在经过数月的预期运行后会导致这种行为的原因(即立即关闭端口并允许脚本重新连接)。