通过公共服务器 SSH 连接到私有主机

通过公共服务器 SSH 连接到私有主机

我开发运行 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:hostportman ssh。我认为套接字在这里会更加有用。

⚠别忘了:开发完成后,撤销该密钥!
(从 中删除authorized_keys

还要监控您的电话回家服务器的 SSH 日志以查找连接/身份验证问题,并且最好有一种联系该系统运营商的方法(例如,使用比“电话回家用户”更合理的帐户)。

相关内容