如何通过Google Cloud搭建SSH反向隧道跨网访问树莓派
基于Google Cloud搭建树莓派SSH反向隧道操作步骤
前置条件
- 1台绑定公网IP的Google Cloud Compute Engine(简称GCE)实例,系统选择Debian/Ubuntu即可,最低配机型足够使用
- 可正常联网的树莓派,已本地开启SSH服务
- 个人PC自带标准SSH客户端,网络与树莓派内网、GCE私有网络均不互通
一、GCE侧配置
- 先通过SSH登录GCE实例,编辑SSH服务配置文件:
sudo nano /etc/ssh/sshd_config
找到以下配置项,修改为对应值,不存在则直接新增:
GatewayPorts yes AllowTcpForwarding yes TCPKeepAlive yes ClientAliveInterval 60 ClientAliveCountMax 3
核心参数说明:
GatewayPorts yes是反向隧道可被外部访问的关键,默认配置下反向隧道仅绑定GCE本地回环地址,非GCE本机的设备无法连接。
- 保存配置后重启SSH服务生效:
sudo systemctl restart sshd - 配置防火墙放行隧道端口:
- 到GCE控制台VPC防火墙页面,新建入站规则,协议选择TCP,端口自定义为一个高位端口(示例用22222,避免使用22、2222等常用端口减少扫描风险),来源IP初期可设为0.0.0.0/0调试,稳定后建议绑定个人PC的固定公网IP提升安全性,目标选择当前GCE实例
- 如果GCE实例内部开启了ufw/iptables等系统防火墙,同步执行命令放行对应端口:
sudo ufw allow 22222/tcp
二、树莓派侧配置(建立持久反向隧道)
- 先测试临时隧道连通性,在树莓派终端执行:
ssh -NfR 22222:localhost:22 <GCE登录用户名>@<GCE公网IP>
参数说明:
-N:不执行远程命令,仅做端口转发-f:SSH进程后台运行-R:端口映射规则,格式为<GCE监听端口>:<本地目标地址>:<本地SSH端口>,树莓派默认SSH端口为22
执行后输入GCE的登录凭证,回到GCE终端执行ss -tulpn | grep 22222,如果看到sshd进程监听0.0.0.0:22222即代表临时隧道建立成功。
- 配置树莓派到GCE的SSH免密登录,避免后续持久化服务需要交互输入密码:
在树莓派终端执行ssh-keygen -t ed25519,一路回车不设置密钥密码,生成密钥后执行ssh-copy-id <GCE登录用户名>@<GCE公网IP>,按提示输入GCE密码完成公钥下发,完成后测试SSH登录GCE无需输入密码即配置成功。 - 配置systemd服务实现隧道开机自启、异常自动重连:
新建服务配置文件:sudo nano /etc/systemd/system/ssh-reverse-tunnel.service
写入以下内容,替换占位符为你的实际信息:
[Unit] Description=SSH Reverse Tunnel to GCE After=network.target [Service] User=<树莓派当前登录用户名,默认一般为pi> Restart=always RestartSec=15 ExecStart=/usr/bin/ssh -N -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R 22222:localhost:22 <GCE登录用户名>@<GCE公网IP> [Install] WantedBy=multi-user.target
保存退出后执行以下命令启动服务并设置开机自启:
sudo systemctl daemon-reload sudo systemctl enable ssh-reverse-tunnel.service sudo systemctl start ssh-reverse-tunnel.service
执行sudo systemctl status ssh-reverse-tunnel.service,看到服务状态为active (running)即代表持久化隧道配置完成。
三、个人PC侧远程连接
隧道正常运行后,在任意网络下的个人PC终端直接执行以下命令即可接入树莓派shell:ssh <树莓派登录用户名>@<GCE公网IP> -p 22222
首次连接会提示主机指纹校验,确认后输入树莓派对应用户的登录密码(或配置SSH密钥登录),即可进入树莓派的命令行界面。
常见问题排查
- 个人PC连接提示Connection refused:依次检查GCE侧
GatewayPorts配置是否生效、GCE云防火墙/系统防火墙是否放行22222端口、树莓派隧道服务是否处于运行状态 - 隧道频繁自动断开:确认GCE侧
ClientAlive相关保活参数、树莓派侧ServerAlive保活参数已正确配置,避免运营商NAT超时切断空闲连接 - 隧道服务启动失败:手动在树莓派执行隧道连接命令查看具体报错,或通过
journalctl -u ssh-reverse-tunnel.service查看服务日志定位问题
安全优化建议
- 稳定使用后将GCE防火墙22222端口的放行来源限制为个人PC的公网IP,禁止全网段访问
- GCE、树莓派的SSH服务均禁用密码登录,仅允许密钥认证
- 隧道端口选择10000以上的随机高位端口,降低被恶意扫描的概率
- 可在GCE实例部署fail2ban服务,自动封禁多次尝试登录隧道端口的恶意IP
内容的提问来源于stack exchange,提问作者MATteo Piras
相关产品推荐
相关产品推荐

