两台计算机:
- Desktop-Ubuntu;固定本地 IP,连接到调制解调器,端口 22 打开并转发到它。由于动态 IP,我有一个无 IP 帐户。因此 domain-Desktop-Ubuntu.com 将传入请求转发到此计算机。
- 远程 Raspberry Pi 3 连接到蜂窝网络,该网络的所有传入请求均已被 ISP 关闭。
我需要从 Desktop-Ubuntu 到 RPi 的 SSH 访问。因为无法直接访问,所以我建立了一个隧道。经过一番尝试后,我终于让它持续工作了(autossh
例如),这是我的架构:
在 RPi:
sshd_config
:
ClientAliveInterval 120
ClientAliveCountMax 720
Crontab 每 5 分钟检查一次ssh
进程 ID 是否不为空。
screen
用于保持ssh
输出是一个单独的 shell 窗口。
*/5 * * * * /bin/sh /path-to/check-ssh-tunnel.sh
check-ssh-tunnel.sh
:
COMMAND="/usr/bin/screen -dmS ssh-Ubuntu /usr/bin/ssh -R 2255:localhost:22 [email protected] -g"
COMMAND_SSH="/usr/bin/ssh -R 2255:localhost:22 domain-Desktop-Ubuntu.com -g"
PID=$(/usr/bin/pgrep -f -x "$COMMAND_SSH")
if [ "$PID" = "" ]
then
$COMMAND
fi
以下是ps aux | grep ssh
重启三小时后我得到的相关信息:
pi 2128 0.0 0.2 5396 2252 ? Ss 08:25 0:00 /usr/bin/SCREEN -dmS ssh-Desktop-Ubuntu /usr/bin/ssh -R 2255:localhost:22 [email protected] -g
pi 2130 0.0 0.5 9132 4748 pts/0 Ss+ **08:25** 0:00 /usr/bin/ssh -R 2255:localhost:22 [email protected] -g
如果我的kill 2128
cron 运行并且:
pi 4755 0.0 0.2 5396 2092 ? Ss 11:25 0:00 /usr/bin/SCREEN -dmS ssh-Desktop-Ubuntu /usr/bin/ssh -R 2255:localhost:22 [email protected] -g
pi 4756 0.0 0.5 9132 4840 pts/0 Ss+ **11:25** 0:00 /usr/bin/ssh -R 2255:localhost:22 [email protected] -g
访问 RPi从桌面-Ubuntu:
ssh -p 2255 pi@localhost
我的问题是这种连接是随机的:
- 有时它会要求输入密码,然后我才能连接
- 有时
ssh: connect to host localhost port 2255: Connection refused
- 有时候需要等很长时间才能最终输出
ssh_exchange_identification: read: Connection reset by peer
After retry:Connection refused
。
返回 RPi似乎什么都没有改变:
$ screen -r # to get the ssh window
[email protected]~$ ssh -p 2255 pi@localhost
ssh: connect to host localhost port 2255: Connection refused
目前,对于所有这些测试,我都使用 Teamviewer 远程管理 RPi。出于某些原因,除非绝对必要,否则我不想在将来使用它。这就是我需要 SSH 隧道的原因。
哪里出了问题?如何让隧道可靠地工作?