![使用autossh从Raspberry PI到VPS进行远程端口转发,以便从互联网上的任何地方访问PI,为什么它只能工作一次?](https://linux22.com/image/163142/%E4%BD%BF%E7%94%A8autossh%E4%BB%8ERaspberry%20PI%E5%88%B0VPS%E8%BF%9B%E8%A1%8C%E8%BF%9C%E7%A8%8B%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%EF%BC%8C%E4%BB%A5%E4%BE%BF%E4%BB%8E%E4%BA%92%E8%81%94%E7%BD%91%E4%B8%8A%E7%9A%84%E4%BB%BB%E4%BD%95%E5%9C%B0%E6%96%B9%E8%AE%BF%E9%97%AEPI%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E5%AE%83%E5%8F%AA%E8%83%BD%E5%B7%A5%E4%BD%9C%E4%B8%80%E6%AC%A1%EF%BC%9F.png)
我使用 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尝试。