我在远程服务器(CentOS)的终端上运行这个 ssh 隧道脚本来访问我的家用电脑(Ubuntu):
while true
do
ssh -R 49666:localhost:22 (my name@ my home ip) -N
sleep 15
done
我让它循环(睡眠 15 部分),因为隧道偶尔会崩溃,当它崩溃时,需要有人亲自在场重新启动它。循环是一种解决方法,尽管可能不是一个很好的方法……
然后从家里,我可以通过 ssh 到本地主机的 49666 端口来 ssh 到服务器。
不过,偶尔我也会随机断线,断线时间恰好是 2 小时 15 秒。我在 auth.log 中看到以下内容:
Accepted publickey from (work ip)
error: bind: Address already in use
error: channel_setup_fwd_listener_tcpip: cannot listen to port: 49666
我原本以为我不应该循环运行 SSH -R,因为它显然会继续尝试绑定到同一端口。但问题是,上述失败可能每 14 小时发生一次,而不是循环所暗示的每 15 秒发生一次。我怀疑如果您尝试 SSH -R 一个已经存在的连接,它什么也不做?
我的下一个想法是,也许其他服务有时会在端口 49666 上弹出并扰乱隧道,然后当脚本在 15 秒后尝试绑定到它时,它无法绑定,因为其他服务正在使用它。但我不知道其他服务(如果存在)可能是什么。我使用 netstat、lsof 等,但我从未看到该端口上运行任何内容。我不确定是否有办法查看端口的历史记录,或者您是否只能看到在活动时使用它的东西。但我怀疑没有任何东西试图使用它,但这是可能的……
收到“已在使用”失败信息后,我无法使用 ssh。但之后,每次,恰好 2 小时 15 秒后,我都会收到以下信息:
Accepted publickey from (same work ip)
但没有后续故障,我可以再次正常使用 ssh。下一次故障发生的时间似乎是随机的,但从故障到下一次重新建立隧道,正好是 2 小时 15 秒。我假设有某种 2 小时冷却时间的防火墙,然后脚本说要等待 15 秒,所以这加起来就是时间。这里的模式让我认为有某种方法可以配置它。问题是我不知道为什么“地址已被使用”的事情会发生,我不知道两小时的冷却时间发生在哪一侧(客户端或远程服务器)。我家里的电脑上几乎所有的设置都是默认的。我在工作时没有 sudo(但有时我可以让 sudo 帮我检查一些东西),所以我不知道他们的 sshd_config 是什么样的,但我想没有什么奇怪的。
有人能帮我识别一下:1:为什么会出现“地址已被使用”的故障以及该怎么办?2:为什么会有正好 2 小时 15 秒的差距以及该怎么办?
答案1
使用autossh
它会定期检查隧道,一旦中断,它会自动重新连接:
autossh -M 2000 -R 49666:localhost:22 (my name@ my home ip) -N