我开发运行 Linux 的 IoT 集线器,希望通过互联网上的 SSH 访问它们以进行开发。它们通常放置在远程位置。除非我从不受信任的来源下载并安装某些软件,否则我使用的 E3372 调制解调器似乎无法进行端口转发。
我想知道是否有方法或服务可以让我通过 AWS 等服务器连接到互联网上不可见的设备(具有互联网连接)?
集线器可能还会定期连接到服务器以查看是否有连接请求,然后由可相互访问的服务器进行连接?
谢谢
答案1
您可以通过隧道建立出站 SSH 连接RemoteForward
返回到 IoT 设备。
做这个仅有的用于开发,永远不要用于生产;您的服务器很容易受到用户的攻击。
从 IoT 设备运行:
sleeptime=5
while sleep $sleeptime; do
start=$(date +%s)
ssh -N -i /path/to/unlocked/ssh/key \
-R 1234:localhost:22 [email protected]
if [ $(date +%s) -gt $((start + 600)) ] || [ $sleeptime -ge 81920 ]; then
sleeptime=5
else
sleeptime=$((sleeptime*2))
fi
done
当出现连接问题时,我已尽量避免无休止地循环,但您可能希望做得更多。这将休眠 5 秒,节省时间,运行 ssh(见下文),然后再次检查时间。如果超过 600 秒,则将休眠定时器重置为 5 秒。否则,将该定时器加倍至一天(5 秒、10 秒、20 秒、40 秒、80 秒、160 秒、5 分钟、10 分钟、20 分钟、40 分钟、1.5 小时、3 小时、6 小时、12 小时、1 天,重复)。
警告,此解决方案与 ssh 连接的可靠性一样变化无常。
该ssh
命令使用:
-N
:不执行远程命令,仅转发端口并保持打开状态-i KEY
:使用此密钥进行身份验证(不要用密码保护该密钥)-R 1234:localhost:22
:连接到偏僻的主机转发到 IoT 设备的 ssh 服务器
在 上phone-home.example.com
,添加phone-home-user
并锁定其外壳,使其除了连接和端口转发外无法执行任何操作(这将让精明的用户转发他们想要的任何内容 — 从服务器的 LAN — 因此要小心)。将密钥的公共端添加到该用户的~/.ssh/authorized_keys
。
现在,您可以通过 ssh 进入phone-home.example.com
,然后运行ssh -p 1234 localhost
以到达该主机。(您可以使用全局端口转发ssh
标志-g
从您的系统进行连接,而不是通过电话回拨服务器进行连接,但我不建议这样做,因为这意味着其他人也可以这样做。)
如果你想支持多种的主机,您要么需要一个系统来将端口映射到每个开发 IoT 系统,要么考虑使用远程套接字(请参阅-R remote_socket:host:hostport
)man ssh
。我认为套接字在这里会更加有用。
别忘了:开发完成后,撤销该密钥!
(从 中删除authorized_keys
)
还要监控您的电话回家服务器的 SSH 日志以查找连接/身份验证问题,并且最好有一种联系该系统运营商的方法(例如,使用比“电话回家用户”更合理的帐户)。