我有两个系统:互联网上的 Ubuntu 20.04 服务器和本地 LAN 中的 Raspberry Pi 2B (Ubuntu 18.04)(位于 NAT 路由器后面)。我正在打开从 Raspberry Pi 到服务器的反向隧道,如下所示:
ssh -f -N -R 13333:127.0.0.1:22 server
配置文件如下所示:
Host server
Hostname <public IP>
User serveruser
IdentityFile /home/piuser/.ssh/serverkey
然后在服务器上我运行以下命令:
ssh -p13333 -i ~/.ssh/pikey [email protected]
对于 pikey,在 Raspberry 上执行一个命令(在 authorized_keys 文件中设置)。
昨天我尝试了几次这个设置,但今天(大约 24 小时后)我无法再使用隧道了。ss
向我显示了开放的端口,我能够在服务器上执行该命令,但没有响应 - 命令只是“挂起”。
然后,我杀死了隧道并重新建立了它,没有任何问题。为了进一步解决问题,我在服务器发送的命令中添加了 -vvv :
ssh -vvv -p13333 -i ~/.ssh/pikey [email protected]
这向我展示了以下点的连接卡住:
OpenSSH_8.2p1 Ubuntu-4ubuntu0.2, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /home/serveruser/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug2: resolve_canonicalize: hostname 127.0.0.1 is address
debug2: ssh_connect_direct
debug1: Connecting to 127.0.0.1 [127.0.0.1] port 13333.
debug1: Connection established.
debug1: identity file /home/serveruser/.ssh/pikey type 0
debug1: identity file /home/serveruser/.ssh/pikey-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.2
这次,在Raspberry Pi的网站上我看到:
$ Warning: remote port forwarding failed for listen port
所以我的最后一次尝试是重新启动 Raspberry,瞧,在再次建立隧道后,它按预期工作了。
最后,我的问题是:我如何确定出了什么问题?我在国外时依赖这种连接,所以我真的需要弄清楚出了什么问题以及如何解决这个问题...
顺便说一句,我在谷歌上搜索了一下,但没有一个建议/解决方案适合我的情况,因为我能够一开始就建立了连接,但一些小问题使其进入了一种奇怪的状态。
如果您需要更多信息,请告诉我:)
答案1
看起来您可能需要启用 keepalive 功能。 .ssh/config 中类似以下内容可能会起作用:
Host *
ServerAliveInterval 300
ServerAliveCountMax 2
答案2
Warning: remote port forwarding failed for listen port
当指定端口上已经有某些东西正在侦听时,您将会收到消息。您可以使用sudo netstat -lnp | grep 13333
是否再次发生这种情况来检查该端口是否仍在侦听。 netstat 上的 p 标志应该显示正在该端口上侦听的任何内容的 pid。
如果长时间没有任何东西使用,您的 ssh 隧道很可能会超时。您可以尝试使用autossh
作为实用程序来监视隧道并在隧道失败时重新建立它。这篇超级用户帖子展示了如何执行此操作。