当前位置:首页 > 大杂烩 > 正文内容

利用 SSH 反向隧道实现树莓派本地服务的公网访问

高老师1周前 (09-26)大杂烩33

利用SSH反向隧道实现树莓派本地服务的公网访问(补充版)

在物联网开发中,我们经常需要将本地设备(如树莓派)上运行的服务暴露到公网,方便远程访问和管理。本文将详细介绍如何使用SSH反向隧道技术,通过一台公网服务器作为跳板,实现从公网访问树莓派本地服务的目的,并补充SSH配置文件的编辑细节,确保操作更清晰可落地。

什么是SSH反向隧道?

SSH反向隧道(Reverse Tunnel)是基于SSH协议的端口映射技术,核心作用是将公网服务器的端口“反向绑定”到内网设备(树莓派)的端口。与正向隧道(从本地访问远程服务)不同,反向隧道能突破内网无公网IP的限制,让外部网络通过公网服务器间接访问内网中的树莓派服务,且所有数据传输均通过SSH加密,安全性较高。

准备工作

实现该方案需提前准备以下环境和工具:

  1. 树莓派:已安装Raspbian(或其他Linux发行版),确保SSH客户端默认已安装(Raspbian通常预装)。
  2. 公网服务器:具备固定公网IP(本文以Linux系统为例,如CentOS、Ubuntu),且已开启SSH服务。
  3. 网络权限:树莓派能正常访问互联网(需通过家庭/局域网路由联网),公网服务器需开放指定端口(如8082)的入站权限。

实现步骤

1. 建立基础SSH反向隧道

首先在树莓派的终端中执行命令,建立反向隧道连接。这一步会将公网服务器的指定端口映射到树莓派的本地服务端口(以80端口为例,常见于Web服务)。

在树莓派终端输入:

ssh -R 8082:localhost:80 root@203.0.113.100
  • -R:核心参数,代表“反向隧道”模式。
  • 8082:localhost:80:端口映射规则,含义是“将公网服务器的8082端口,绑定到树莓派的localhost:80端口”(即访问服务器8082端口,等同于访问树莓派80端口)。
  • root@203.0.113.100:公网服务器的登录用户名(此处用root仅为示例,实际建议用低权限用户)和公网IP(请替换为你的服务器真实IP)。

执行后输入公网服务器的登录密码,若连接成功,树莓派终端会进入公网服务器的命令行界面,此时反向隧道已初步建立。

2. 测试隧道连通性(服务器端验证)

隧道建立后,需先在公网服务器上验证是否能正常访问树莓派的本地服务:

在公网服务器终端输入:

curl http://localhost:8082
  • 若返回树莓派80端口服务的内容(如Web页面的HTML代码、服务响应信息),说明隧道基础连通性正常;
  • 若提示“Connection refused”,需检查树莓派80端口服务是否正常运行(如Apache、Nginx是否启动),或隧道命令是否输入错误。

3. 配置公网服务器SSH,允许外部访问隧道

默认情况下,SSH反向隧道仅允许公网服务器“本地”(即服务器自身)访问映射端口(如8082),外部设备(如你的电脑)直接通过“服务器IP:8082”访问会失败。需修改服务器的SSH配置,允许隧道端口对外网开放。

步骤3.1:编辑SSH服务配置文件

通过nanovim编辑器修改服务器的sshd_config文件(SSH服务的核心配置文件),二选一即可:

方式1:用nano编辑(操作更简单,适合新手)

在公网服务器终端输入:

sudo nano /etc/ssh/sshd_config
方式2:用vim编辑(需掌握基础vim操作)

在公网服务器终端输入:

sudo vim /etc/ssh/sshd_config

步骤3.2:设置GatewayPorts参数

在打开的sshd_config文件中,找到与GatewayPorts相关的配置行:

  • 若文件中存在#GatewayPorts no#表示注释),需**删除#并将no改为yes**,即:
    GatewayPorts yes
    
  • 若文件中没有GatewayPorts相关行,直接在文件末尾新增一行,内容同上。

步骤3.3:保存配置并重启SSH服务

  • 若用nano编辑:按Ctrl+O(保存)→ 按回车确认文件名 → 按Ctrl+X(退出)。
  • 若用vim编辑:按Esc键 → 输入:wq(保存并退出,若需强制保存用:wq!)。

配置修改后,必须重启SSH服务才能生效,在公网服务器终端输入:

# 适用于CentOS/RHEL系统
sudo systemctl restart sshd

# 适用于Ubuntu/Debian系统(部分版本SSH服务名是ssh)
sudo systemctl restart ssh

4. 重建隧道,允许公网访问

配置生效后,需在树莓派上重新建立反向隧道,并明确指定“监听所有网络接口”(即允许外部设备通过服务器公网IP访问):

在树莓派终端输入:

ssh -R 0.0.0.0:8082:localhost:80 root@203.0.113.100
  • 新增的0.0.0.0:表示“让公网服务器的8082端口监听所有网络接口”(包括公网IP、内网IP),而非仅监听服务器本地(127.0.0.1)。

此时,你在外部设备(如电脑)的浏览器中输入http://203.0.113.100:8082,即可访问树莓派80端口上的服务(如Web页面)。

5. 后台运行隧道(避免终端关闭后断开)

默认情况下,树莓派的SSH隧道会随终端窗口关闭而断开。若需隧道长期运行,可添加参数让SSH在后台执行:

在树莓派终端输入:

ssh -fN -R 0.0.0.0:8082:localhost:80 root@203.0.113.100
  • -f:让SSH在后台运行(执行后会自动返回树莓派终端,而非进入服务器界面)。
  • -N:表示“不执行远程命令”,仅用于端口转发(减少资源占用,避免意外执行服务器命令)。

执行后输入服务器密码,隧道会在后台静默运行,即使关闭树莓派终端也不会断开。

终止SSH隧道(如需关闭)

若需停止已建立的隧道,需先找到对应的SSH进程,再终止进程:

  1. 在树莓派终端输入以下命令,查找隧道对应的进程:

    ps aux | grep "ssh -R 0.0.0.0:8082:localhost:80"
    

    输出结果类似:

    pi       12345  0.0  0.1  12348  5678 ?        Ss   14:30   0:00 ssh -fN -R 0.0.0.0:8082:localhost:80 root@203.0.113.100
    

    其中12345是进程ID(PID),需记录该数字。

  2. 执行以下命令终止进程(将12345替换为实际PID):

    kill 12345
    

    若进程无法正常终止,可强制终止:

    kill -9 12345
    

安全注意事项

  1. 避免使用root用户登录服务器:建议在公网服务器上创建低权限用户(如pi-proxy),仅授予SSH登录权限,减少风险。
  2. 使用SSH密钥认证替代密码:在树莓派生成SSH密钥,将公钥上传到公网服务器,避免每次输入密码,且安全性更高。操作参考:
    # 树莓派生成密钥(一路按回车即可)
    ssh-keygen
    # 将公钥上传到服务器(替换用户名和IP)
    ssh-copy-id pi-proxy@203.0.113.100
    
  3. 限制服务器端口访问范围:通过服务器防火墙(如ufwfirewalld)仅允许指定IP访问8082端口,避免端口被恶意扫描。示例(Ubuntu用ufw):
    # 仅允许你的电脑IP访问8082端口
    sudo ufw allow from 114.222.33.44 to any port 8082
    
  4. 定期检查登录日志:通过服务器的/var/log/auth.log(Ubuntu)或/var/log/secure(CentOS)查看SSH登录记录,排查异常登录。
  5. 使用非标准SSH端口:修改服务器SSH默认端口(22)为其他端口(如2222),减少被暴力破解的概率(需同步修改sshd_config中的Port参数)。

总结

SSH反向隧道是树莓派等内网设备暴露服务到公网的“轻量级方案”,相比花生壳、FRP等工具,无需额外安装软件,仅通过系统自带的SSH即可实现,且传输加密、配置简单,适合个人开发者或小型物联网项目(如远程监控、树莓派Web控制端)。

需注意的是,该方案的稳定性依赖树莓派的网络环境(如家庭宽带断网会导致隧道断开),若需高可用,可搭配autossh工具实现隧道自动重连(后续可单独补充该内容)。对于高流量服务,建议使用专业的CDN或云服务商的端口映射服务。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/909.html

分享给朋友:

“利用 SSH 反向隧道实现树莓派本地服务的公网访问” 的相关文章

PHP安装mongodb扩展

PHP安装mongodb扩展

在安装之前我们先看看官方给出的依赖关系.首先是dll文件和mongodb软件的依赖关系然后是PHP文件和dll的依赖关系我的是phpstudy的集成环境PHP5.4.45 NTS+Apache+Mysql【一】.安装mongodb3.0软件对比依赖关系下载mongodb3.0.msi软件,完整名称:...

Application的错误使用

Application的错误使用

Application 对象用于存储和访问来自任意页面的变量,类似 Session 对象。不同之处在于所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。很多的书籍中介绍的Application对象都喜欢以统计在线人数来介绍Application 对象...

Git推送文件到远程仓库

Git推送文件到远程仓库

1.远程仓库的协作模式开发者把自己最新的版本推到线上仓库,同时把线上仓库的最新代码,拉到自己本地即可2.注册git帐号国外: http://www.github.com国内: http://git.oschina.net2.在码云创建项目,不要初始化readmegit push https://gi...

Git从远程仓库更新文件

Git从远程仓库更新文件

 git   pull  https://git.oschina.net/392223903/learn.git   master   换为您的git地址...

c#关闭计算机的代码

c#关闭计算机的代码

    1.关机Process.Start("shutdown", "-s -t 0");    2. 注销  Proc...

IE浏览器无法显示此页解决方案

IE浏览器无法显示此页解决方案

方案1.IE浏览器"无法显示此页"的解决办法(1).按下Win+R键打开运行,输入netsh winsock reset,回车;(2).重启即可. 方案2.IE浏览器"无法显示此页"的解决办法 (1).设置-连接-局域网设置-自动检测设置开...