当前位置: 首页 > news >正文

不开端口,不配 DNS,用树莓派在家搭一个公网可访问的 Web 服务

原文:Cloudflare Argo Tunnel with Rust+Raspberry Pi,作者 Steven Pack

家里有一块吃灰的树莓派,一直想用来跑点什么,但总绕不开两个问题:家庭宽带没有固定 IP,路由器也不想随便开放端口。

这篇文章记录的,就是 Cloudflare 一位工程师的实验:把树莓派、Rust 异步 Web 框架和 Cloudflare Tunnel 三者结合起来,在完全不动路由器、不配 DNS 记录的前提下,把树莓派上的 Web 服务暴露到公网。

整个过程出乎意料地顺滑。


问题在哪里

想让家里的机器对外提供服务,传统方式大概有这几条路:

  • 动态域名解析(DDNS):家庭宽带 IP 会变,得在路由器上跑一个 DDNS 客户端,不稳定,配置也烦琐
  • 端口映射:在路由器上开放指定端口转发到内网机器,等于把内网暴露了一个口子,有安全风险
  • 租云服务器:花钱,而且家里的树莓派就成了摆设

Cloudflare Tunnel(原名 Argo Tunnel)的思路完全不同:让内网机器主动向外建立一条持久连接,流量通过这条连接进来,不需要任何入站规则。


原理:反向隧道

整个架构用一句话描述就是:

树莓派上的cloudflared客户端,向最近的 Cloudflare 节点建立一条出站的 HTTP/2 长连接;当外网用户请求你的域名时,Cloudflare 把请求通过这条连接反向推送给树莓派,树莓派处理后再原路返回。

几个关键点:

  • 流量方向是"出站"的。树莓派只需要能访问外网,不需要任何端口对外开放
  • 安全性由证书保证cloudflared登录时会生成一个证书文件(cert.pem),隧道连接用它来做身份验证
  • Cloudflare 负责域名解析和 HTTPS。你只需要有一个托管在 Cloudflare 上的域名,其余的它帮你搞定

准备工作

需要以下几样东西:

  • 一块树莓派(作者用的是 Raspberry Pi 3 Model B),已安装 Raspbian
  • 一个托管在 Cloudflare 的域名
  • 树莓派能正常访问外网

确认树莓派联网正常,最简单的方法是 curl 一下:

curl-Ihttps://www.cloudflare.com

看到HTTP/2 200就说明出站连接没问题。


第一步:安装 cloudflared

cloudflared是 Cloudflare 提供的隧道客户端。树莓派是 ARM 架构,需要下载对应版本:

wgethttps://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-arm.tgzmkdirargo-tunneltar-xvzfcloudflared-stable-linux-arm.tgz-C./argo-tunnelcdargo-tunnel ./cloudflared--version

如果看到版本号输出,就说明可以正常运行了。


第二步:登录并授权域名

运行登录命令:

./cloudflared login

它会输出一个 URL,让你在浏览器里打开(因为树莓派是无头环境,复制到自己的电脑浏览器里打开就行)。登录 Cloudflare 账号后,选择你想用来建隧道的域名,点击授权。

授权成功后,树莓派控制台会显示:

You have successfully logged in. If you wish to copy your credentials to a server, they have been saved to: /home/pi/.cloudflared/cert.pem

这个cert.pem就是隧道的凭证文件,后续都会用到它。


第三步:用内置 Hello World 验证隧道

在正式部署自己的服务之前,先用cloudflared自带的 Hello World 模式验证隧道是否通:

./cloudflared--hostnametunnel.yourdomain.com --hello-world

tunnel.yourdomain.com换成你自己的子域名。启动后会看到类似这样的日志:

INFO[0005] Connected to LAX INFO[0010] Connected to SFO-DOG

这说明客户端已经连上了 Cloudflare 节点。此时在浏览器里访问https://tunnel.yourdomain.com,应该能看到一个 Hello World 页面。

路由器没动,防火墙没动,DNS 没手动配置,就这样通了。


第四步:用 Rust 跑一个真正的 Web 服务

Hello World 验证完隧道没问题,下一步换成一个真实的 Rust Web 服务。原博客作者选择了 Gotham,一个基于异步 I/O 的 Rust Web 框架。

首先安装 Rust 工具链:

curlhttps://sh.rustup.rs-sSf|sh# 安装完成后刷新环境变量source$HOME/.cargo/env

克隆 Gotham 并编译 hello_world 示例:

gitclone https://github.com/gotham-rs/gothamcdgotham/examples/hello_worldcargobuild

树莓派编译比较慢,cargo build花了将近 8 分钟。编译完成后运行:

cd../../target/debug ./gotham_examples_hello_world# Listening for requests at http://127.0.0.1:7878

Web 服务现在监听在本地 7878 端口。把隧道指向它:

./cloudflared--hostnamegotham.yourdomain.com http://127.0.0.1:7878

访问https://gotham.yourdomain.com,Rust 服务的响应就出来了。


第五步:配置开机自启

每次 SSH 进去手动启动太麻烦,需要让两个进程在系统启动时自动运行。

配置 cloudflared 自启

先把证书和配置文件放到系统目录:

sudocp~/.cloudflared/cert.pem /etc/cloudflaredsudonano/etc/cloudflared/config.yml

config.yml内容:

hostname:gotham.yourdomain.comurl:http://127.0.0.1:7878

然后安装为系统服务:

sudo./cloudflaredserviceinstall

cloudflared会自动注册成 systemd 服务,开机自启。

配置 Rust Web 服务自启

把编译好的二进制文件复制到一个稳定的位置:

cptarget/debug/gotham_examples_hello_world /home/pi/argo-tunnel/server/bin/

编辑/etc/rc.local,在exit 0之前加一行:

/home/pi/argo-tunnel/server/bin/gotham_examples_hello_world&

重启树莓派,SSH 回来后检查两个进程是否都在运行:

sudops-aux|grepcloudflaredsudops-aux|grepgotham

看到进程就说明配置成功了。


这件事有意思在哪

纯粹的技术实现层面,这个方案并不复杂,每一步都很直白。但把这几样东西组合在一起,解决的问题其实很实际:

家宽没有固定 IP 不再是障碍。Cloudflare Tunnel 的连接是从内网发起的,IP 怎么变都无所谓,隧道会自动重连。

不需要开防火墙端口。对家庭网络来说,不在路由器上开洞,安全性本质上好了一个层次。所有流量都经过 Cloudflare,还能顺带享受 DDoS 防护和 HTTPS。

Rust 在资源受限设备上表现不错。Gotham 是异步框架,内存占用低,这一点在只有 1GB 内存的树莓派上很重要。编译慢是确实慢,但一次编译、长期运行,是嵌入式类场景的合理取舍。

当然,这个方案也有局限。Cloudflare Tunnel 需要你有一个托管在 Cloudflare 上的域名,流量也会经过 Cloudflare 的节点,如果对数据经过第三方有顾虑,就需要另想办法。


小结

这个实验的路径是这样的:

  1. 树莓派联网,安装cloudflared
  2. cloudflared login授权域名,获取证书
  3. 先用内置 Hello World 验证隧道通路
  4. 安装 Rust,编译 Gotham 示例,把隧道指向本地 Web 服务
  5. 配置 systemd 和 rc.local 实现两个进程的开机自启

整个过程没有动过路由器,没有手动配过 DNS,家里的树莓派就这样对外提供了一个有正经域名和 HTTPS 的 Web 服务。

对于那些一直想折腾树莓派但被网络配置挡在门外的人来说,这条路值得一试。


http://www.jsqmd.com/news/698743/

相关文章:

  • 从交通灯故障检测到智能家居:组合逻辑电路在FPGA上的两个趣味实践项目
  • 2026年天津新能源汽车推荐去哪里?一站式汽车文化广场深度评测指南 - 优质企业观察收录
  • 你的微信聊天记录还在吗?这个开源工具帮你永久保存珍贵对话
  • 算法训练营第十二天| 169.多数元素
  • 如何用Fay数字人框架3步打造你的智能虚拟助手:从零到一的实践指南
  • 广州值得信赖的靠谱除甲醛机构 TOP5 推荐 - GrowthUME
  • 智能基线校正终极指南:如何用airPLS算法解决光谱分析中的基线漂移问题
  • 慧科讯业:2026年北京车展前瞻报告
  • 2026年天津新能源汽车推荐去哪里买?101汽车文化广场一站式体验深度指南 - 优质企业观察收录
  • 开源音乐格式转换工具实战:5步解锁网易云音乐加密文件
  • 3分钟掌握机构级金融数据:Finnhub Python客户端的终极指南
  • jcifs-ng终极指南:5分钟掌握Java SMB客户端开发
  • 把数百个软件包迁移到 ARM64,Cloudflare 踩了哪些坑
  • 【Kubernetes专项】温故而知新,重温技术原理(1)
  • Ubuntu 22.04 系统上完整安装 ROS 2 Humble
  • 告别Express?用Hono在Cloudflare Workers上5分钟搭建一个超快API
  • 2026年天津新能源汽车推荐去哪里买?101汽车文化广场一站式选车体验深度评测 - 优质企业观察收录
  • 苹果触控板在Windows上的完美重生:mac-precision-touchpad开源驱动深度解析
  • 缠论分析太复杂?ChanlunX:3分钟让你从新手变高手!
  • 终极指南:Switch大气层系统1.7.1完整安装与功能解锁
  • 基于SSH的多跳远程访问工具PKURemote:原理、实现与配置管理
  • Klipper共振补偿:彻底解决3D打印“幽灵纹路“的专业指南
  • D6.2.熟练使用kubernetes的高级调度策略实战(nodeSelector、Pod亲和反亲和、污点及容忍)
  • 2026年天津新能源汽车推荐去哪里?101汽车文化广场一站式选购指南 - 优质企业观察收录
  • 3分钟精通TrollInstallerX:iOS 14-16.6.1设备安全安装TrollStore终极指南
  • InkOS:基于多Agent协作与长期记忆的AI小说创作系统深度解析
  • real-anime-z创意拓展:结合‘雨景’‘霓虹’‘樱花’等氛围词激发新构图
  • Botty:暗黑2重制版自动化助手,解放双手的智能刷宝方案
  • 从 IP 包到 HTTP 请求,Cloudflare 的 Oxy 代理框架是怎么做到
  • 终极指南:让Apple触控板在Windows上完美运行