在物联网开发中,我们经常需要将本地设备(如树莓派)上运行的服务暴露到公网,方便远程访问和管理。本文将详细介绍如何使用SSH反向隧道技术,通过一台公网服务器作为跳板,实现从公网访问树莓派本地服务的目的,并补充SSH配置文件的编辑细节,确保操作更清晰可落地。
SSH反向隧道(Reverse Tunnel)是基于SSH协议的端口映射技术,核心作用是将公网服务器的端口“反向绑定”到内网设备(树莓派)的端口。与正向隧道(从本地访问远程服务)不同,反向隧道能突破内网无公网IP的限制,让外部网络通过公网服务器间接访问内网中的树莓派服务,且所有数据传输均通过SSH加密,安全性较高。
实现该方案需提前准备以下环境和工具:
首先在树莓派的终端中执行命令,建立反向隧道连接。这一步会将公网服务器的指定端口映射到树莓派的本地服务端口(以80端口为例,常见于Web服务)。
在树莓派终端输入:
ssh -R 8082:localhost:80 root@203.0.113.100
-R
:核心参数,代表“反向隧道”模式。8082
80
:端口映射规则,含义是“将公网服务器的8082端口,绑定到树莓派的localhost:80端口”(即访问服务器8082端口,等同于访问树莓派80端口)。root@203.0.113.100
:公网服务器的登录用户名(此处用root仅为示例,实际建议用低权限用户)和公网IP(请替换为你的服务器真实IP)。执行后输入公网服务器的登录密码,若连接成功,树莓派终端会进入公网服务器的命令行界面,此时反向隧道已初步建立。
隧道建立后,需先在公网服务器上验证是否能正常访问树莓派的本地服务:
在公网服务器终端输入:
curl http://localhost:8082
默认情况下,SSH反向隧道仅允许公网服务器“本地”(即服务器自身)访问映射端口(如8082),外部设备(如你的电脑)直接通过“服务器IP:8082”访问会失败。需修改服务器的SSH配置,允许隧道端口对外网开放。
通过nano
或vim
编辑器修改服务器的sshd_config
文件(SSH服务的核心配置文件),二选一即可:
在公网服务器终端输入:
sudo nano /etc/ssh/sshd_config
在公网服务器终端输入:
sudo vim /etc/ssh/sshd_config
在打开的sshd_config
文件中,找到与GatewayPorts
相关的配置行:
#GatewayPorts no
(#
表示注释),需**删除#
并将no
改为yes
**,即:GatewayPorts yes
GatewayPorts
相关行,直接在文件末尾新增一行,内容同上。nano
编辑:按Ctrl+O
(保存)→ 按回车确认文件名 → 按Ctrl+X
(退出)。vim
编辑:按Esc
键 → 输入:wq
(保存并退出,若需强制保存用:wq!
)。配置修改后,必须重启SSH服务才能生效,在公网服务器终端输入:
# 适用于CentOS/RHEL系统
sudo systemctl restart sshd
# 适用于Ubuntu/Debian系统(部分版本SSH服务名是ssh)
sudo systemctl restart ssh
配置生效后,需在树莓派上重新建立反向隧道,并明确指定“监听所有网络接口”(即允许外部设备通过服务器公网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页面)。
默认情况下,树莓派的SSH隧道会随终端窗口关闭而断开。若需隧道长期运行,可添加参数让SSH在后台执行:
在树莓派终端输入:
ssh -fN -R 0.0.0.0:8082:localhost:80 root@203.0.113.100
-f
:让SSH在后台运行(执行后会自动返回树莓派终端,而非进入服务器界面)。-N
:表示“不执行远程命令”,仅用于端口转发(减少资源占用,避免意外执行服务器命令)。执行后输入服务器密码,隧道会在后台静默运行,即使关闭树莓派终端也不会断开。
若需停止已建立的隧道,需先找到对应的SSH进程,再终止进程:
在树莓派终端输入以下命令,查找隧道对应的进程:
ps aux | grep "ssh -R 0.0.0.0
localhost:80"
输出结果类似:
pi 12345 0.0 0.1 12348 5678 ? Ss 14:30 0:00 ssh -fN -R 0.0.0.0
localhost:80 root@203.0.113.100
其中12345
是进程ID(PID),需记录该数字。
执行以下命令终止进程(将12345
替换为实际PID):
kill 12345
若进程无法正常终止,可强制终止:
kill -9 12345
pi-proxy
),仅授予SSH登录权限,减少风险。# 树莓派生成密钥(一路按回车即可)
ssh-keygen
# 将公钥上传到服务器(替换用户名和IP)
ssh-copy-id pi-proxy@203.0.113.100
ufw
、firewalld
)仅允许指定IP访问8082端口,避免端口被恶意扫描。示例(Ubuntu用ufw):# 仅允许你的电脑IP访问8082端口
sudo ufw allow from 114.222.33.44 to any port 8082
/var/log/auth.log
(Ubuntu)或/var/log/secure
(CentOS)查看SSH登录记录,排查异常登录。sshd_config
中的Port
参数)。SSH反向隧道是树莓派等内网设备暴露服务到公网的“轻量级方案”,相比花生壳、FRP等工具,无需额外安装软件,仅通过系统自带的SSH即可实现,且传输加密、配置简单,适合个人开发者或小型物联网项目(如远程监控、树莓派Web控制端)。
需注意的是,该方案的稳定性依赖树莓派的网络环境(如家庭宽带断网会导致隧道断开),若需高可用,可搭配autossh
工具实现隧道自动重连(后续可单独补充该内容)。对于高流量服务,建议使用专业的CDN或云服务商的端口映射服务。
在安装之前我们先看看官方给出的依赖关系.首先是dll文件和mongodb软件的依赖关系然后是PHP文件和dll的依赖关系我的是phpstudy的集成环境PHP5.4.45 NTS+Apache+Mysql【一】.安装mongodb3.0软件对比依赖关系下载mongodb3.0.msi软件,完整名称:...
Application 对象用于存储和访问来自任意页面的变量,类似 Session 对象。不同之处在于所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。很多的书籍中介绍的Application对象都喜欢以统计在线人数来介绍Application 对象...
1.远程仓库的协作模式开发者把自己最新的版本推到线上仓库,同时把线上仓库的最新代码,拉到自己本地即可2.注册git帐号国外: http://www.github.com国内: http://git.oschina.net2.在码云创建项目,不要初始化readmegit push https://gi...
git pull https://git.oschina.net/392223903/learn.git master 换为您的git地址...
1.关机Process.Start("shutdown", "-s -t 0"); 2. 注销 Proc...
方案1.IE浏览器"无法显示此页"的解决办法(1).按下Win+R键打开运行,输入netsh winsock reset,回车;(2).重启即可. 方案2.IE浏览器"无法显示此页"的解决办法 (1).设置-连接-局域网设置-自动检测设置开...