在物联网开发中,我们经常需要将本地设备(如树莓派)上运行的服务暴露到公网,方便远程访问和管理。本文将详细介绍如何使用SSH反向隧道技术,通过一台公网服务器作为跳板,实现从公网访问树莓派本地服务的目的,并补充SSH配置文件的编辑细节,确保操作更清晰可落地。
SSH反向隧道(Reverse Tunnel)是基于SSH协议的端口映射技术,核心作用是将公网服务器的端口“反向绑定”到内网设备(树莓派)的端口。与正向隧道(从本地访问远程服务)不同,反向隧道能突破内网无公网IP的限制,让外部网络通过公网服务器间接访问内网中的树莓派服务,且所有数据传输均通过SSH加密,安全性较高。
实现该方案需提前准备以下环境和工具:
树莓派:已安装Raspbian(或其他Linux发行版),确保SSH客户端默认已安装(Raspbian通常预装)。
公网服务器:具备固定公网IP(本文以Linux系统为例,如CentOS、Ubuntu),且已开启SSH服务。
网络权限:树莓派能正常访问互联网(需通过家庭/局域网路由联网),公网服务器需开放指定端口(如8082)的入站权限。
首先在树莓派的终端中执行命令,建立反向隧道连接。这一步会将公网服务器的指定端口映射到树莓派的本地服务端口(以80端口为例,常见于Web服务)。
在树莓派终端输入:
ssh -R 8082:localhost:80 root@203.0.113.100
-R:核心参数,代表“反向隧道”模式。
8082:端口映射规则,含义是“将公网服务器的8082端口,绑定到树莓派的localhost:80端口”(即访问服务器8082端口,等同于访问树莓派80端口)。
80
root@203.0.113.100:公网服务器的登录用户名(此处用root仅为示例,实际建议用低权限用户)和公网IP(请替换为你的服务器真实IP)。
执行后输入公网服务器的登录密码,若连接成功,树莓派终端会进入公网服务器的命令行界面,此时反向隧道已初步建立。
隧道建立后,需先在公网服务器上验证是否能正常访问树莓派的本地服务:
在公网服务器终端输入:
curl http://localhost:8082
若返回树莓派80端口服务的内容(如Web页面的HTML代码、服务响应信息),说明隧道基础连通性正常;
若提示“Connection refused”,需检查树莓派80端口服务是否正常运行(如Apache、Nginx是否启动),或隧道命令是否输入错误。
默认情况下,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.0localhost:80"
输出结果类似:
pi 12345 0.0 0.1 12348 5678 ? Ss 14:30 0:00 ssh -fN -R 0.0.0.0localhost:80 root@203.0.113.100
其中12345是进程ID(PID),需记录该数字。
执行以下命令终止进程(将12345替换为实际PID):
kill 12345
若进程无法正常终止,可强制终止:
kill -9 12345
避免使用root用户登录服务器:建议在公网服务器上创建低权限用户(如pi-proxy),仅授予SSH登录权限,减少风险。
使用SSH密钥认证替代密码:在树莓派生成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登录记录,排查异常登录。
使用非标准SSH端口:修改服务器SSH默认端口(22)为其他端口(如2222),减少被暴力破解的概率(需同步修改sshd_config中的Port参数)。
autossh -fN -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 8081:localhost:80 root@160.202.251.64 > /var/log/autossh.log 2>&1
SSH反向隧道是树莓派等内网设备暴露服务到公网的“轻量级方案”,相比花生壳、FRP等工具,无需额外安装软件,仅通过系统自带的SSH即可实现,且传输加密、配置简单,适合个人开发者或小型物联网项目(如远程监控、树莓派Web控制端)。
需注意的是,该方案的稳定性依赖树莓派的网络环境(如家庭宽带断网会导致隧道断开),若需高可用,可搭配autossh工具实现隧道自动重连(后续可单独补充该内容)。对于高流量服务,建议使用专业的CDN或云服务商的端口映射服务。
c#中string和StringBuilder直接看看执行速度。(2).String类型累计赋值Test  ...
【一】.钩子文件的设置和创建(1).打开hooks目录,可以看到有一个post-commit.tmpl文件,这是一个模板文件。复制一份,重命名为post-commit,将其用户组设为www,并设置为可执行。chown www:www post-commitchmod +x post-commit(2...
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...