使用autossh从Raspberry PI到VPS进行远程端口转发,以便从互联网上的任何地方访问PI,为什么它只能工作一次?

使用autossh从Raspberry PI到VPS进行远程端口转发,以便从互联网上的任何地方访问PI,为什么它只能工作一次?

我使用 autossh 和从 VPS 到 Raspberry PI 的远程端口转发,以便能够从互联网上的任何地方访问 PI,但它只能工作一次。

我的本地网络中有一个 Raspberry PI 2(Raspbian,全新安装,以确保我可以重现该问题),我想使用远程端口转发(将 VPS 的某些端口转发到 PI 端口)从互联网访问它22、这样,我就可以从 VPS ssh 到 localhost 来访问 PI)。这是可行的,但是,我几周内都无法物理或本地访问 PI,因为我将离开,并且我想使用 crontab 自动执行持久的 autossh 连接(在运行期间运行 autossh 远程端口转发命令)启动,这样即使断电我也能连接到PI)。手动使用 autossh 是可行的,但是,当使用 crontab 时,会出现问题,这些是我使用的步骤:

在crontab之前,尝试autossh命令是否有效(该命令是从PI运行的,它涉及到远程端口转发到VPS,因此VPS的7997端口转发到PI的22端口)

0) /usr/bin/autossh -4 -M 0 -N -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -i path/to/private/key -R 7997:localhost:22 username@ip-address-of-vps

(现在,我从 VPS 连接到 PI)

1) ssh pi@localhost -p 7997 

The authenticity of host 'x.x.x.x' can't be established.
ECDSA key fingerprint is x
Are you sure you want to continue connecting (yes/no)? yesa
Please type 'yes' or 'no': yes)

事实上,这是有效的,如果手动完成(如步骤 0 和 1 所示),它会成功连接。

但是,当我尝试使 ssh 连接在重新启动后保持不变时,会出现问题:

从 PI 中输入“crontab -e”,然后插入:

2) @reboot sleep 30; /usr/bin/autossh -4 -M 0 -N -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -i path/to/private/key -R 7997:localhost:22 username@ip-address-of-vps

3) sudo reboot

等待 1-2 分钟,然后从 VPS 输入:

4) ssh pi@localhost -p 7997

成功连接到 PI 后,我输入(从 PI)

5) sudo reboot (again)

6) ssh pi@localhost -p 7997 (again from the VPS, after waiting 1-2 minutes)

这次,我得到一个错误:

username@vps:~$ ssh pi@localhost -p 7997
ssh_exchange_identification: read: Connection reset by peer
username@vps:~$ ssh pi@localhost -p 7997
ssh: connect to host localhost port 7997: Connection refused
username@vps:~$ ssh pi@localhost -p 7997
ssh: connect to host localhost port 7997: Connection refused

附加观察:如果此时我在本地(从本地网络)通过 ssh 连接到 PI,然后手动运行 autossh(如步骤 0 中所示),然后从 VPS 中 ssh 到 PI(如步骤 1 中所示),它会连接,并且如果我重新启动 PI 之后,它仍然再次连接(从 VPS),但如果我之后再次重新启动,它会显示“连接由对等方重置”输出,然后是“连接被拒绝”输出。我可以无限期地重复此操作,手动运行 autossh,然后从 VPS 连接,它可以工作,重新启动,它可以工作,再次重新启动,连接由对等方重置。

附加观察 2:这是我的 VPS 的 /var/log/auth 的相关输出

Oct 30 01:27:20 vps sshd[1217]: Accepted publickey for username from x.x.x.x port 43008 ssh2: RSA SHA256:xxxxetc 
Oct 30 01:27:20 vps sshd[1217]: pam_unix(sshd:session): session opened for user username by (uid=0) 
Oct 30 01:27:20 vps sshd[1223]: error: bind: Address already in use 
Oct 30 01:27:20 vps sshd[1223]: error: channel_setup_fwd_listener_tcpip: cannot listen to port: 7997

我能做什么来解决这个问题?

更新:

有效的是编辑 /etc/ssh/sshd_config在服务器端

ClientAliveInterval 60
ClientAliveCountMax 1

具体值取决于您希望它如何表现。并重新启动服务器和客户端。您也可以考虑在此之前卸载fail2ban(如果您已安装),并在确认可以重新启动客户端计算机后重新安装它,并且即使在多次重新启动后它仍然可以工作,因为fail2ban可能已经禁止了之前的客户端计算机的IP尝试。

答案1

更新:

有效的是编辑 /etc/ssh/sshd_config在服务器端

ClientAliveInterval 60
ClientAliveCountMax 1

具体值取决于您希望它如何表现。并重新启动服务器和客户端。您也可以考虑在此之前卸载fail2ban(如果您已安装),并在确认可以重新启动客户端计算机后重新安装它,并且即使在多次重新启动后它仍然可以工作,因为fail2ban可能已经禁止了之前的客户端计算机的IP尝试。

相关内容