如何将本地服务器暴露到互联网(无需端口转发)

发布: (2026年1月3日 GMT+8 01:37)
6 分钟阅读
原文: Dev.to

Source: Dev.to

TL;DR: 使用 Cloudflare Tunnel 让你的家庭服务器随时随地可访问。免费、安全,无需路由器配置。

我最近将运行在笔记本电脑上的 Web 应用部署到了真实域名——没有云托管、没有 VPS,也没有月费。只有我的笔记本、一 个域名和 Cloudflare Tunnel。下面就是我的完整操作步骤。

为什么使用隧道?

  • 无法访问路由器的管理面板
  • 动态 IP 地址
  • 端口转发不可行
  • 直接打开 80/443 端口不可用

Cloudflare Tunnel(前称 Argo Tunnel)会从你的服务器向 Cloudflare 边缘创建出站连接,无需任何入站端口。

Internet → Cloudflare (SSL) → Tunnel → Your laptop
  • 免费,自动处理 SSL
  • 兼容任何域名注册商
  • 支持 Linux、macOS 或 Windows

前置条件

项目详情
域名任意注册商(例如 Porkbun)
Cloudflare 账户免费套餐已足够
运行应用的机器Linux/macOS/Windows
时间~10 分钟

1. 将您的域名指向 Cloudflare

  1. 前往 dash.cloudflare.com添加站点
  2. 输入您的域名(例如 myapp.com)。
  3. 选择 免费 计划。
  4. Cloudflare 将显示两个名称服务器(例如 carter.ns.cloudflare.comvita.ns.cloudflare.com)。
  5. 在您的注册商控制面板中,用 Cloudflare 提供的名称服务器替换现有的名称服务器。
  6. 等待 5–30 分钟进行 DNS 传播。

2. 在 Cloudflare Zero Trust 中创建隧道

  1. 在 Cloudflare 仪表板,打开 Zero Trust(左侧边栏)。
  2. 导航至 Networks → Tunnels
  3. 点击 Create a tunnel,为其命名(例如 my-server)。
  4. Cloudflare 将显示包含一次性令牌的安装命令。

3. 安装 cloudflared 守护进程

Ubuntu / Debian

curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb

macOS

brew install cloudflared

Windows

GitHub 发布页面 下载最新发行版并手动安装。

4. 注册隧道为服务

运行步骤 2 中收到的命令,并替换为你的令牌:

sudo cloudflared service install <TOKEN>

此操作会创建一个系统服务,随系统启动自动运行。

验证其是否正在运行:

sudo systemctl status cloudflared

5. 添加公共主机名

  1. 在 Cloudflare 仪表板,前往 Tunnels → → Configure
  2. 点击 Public Hostname → Add a public hostname
  3. 填写以下字段:
字段
子域名(留空或使用 www)
域名选择你的域名 (myapp.com)
服务类型HTTP
URLlocalhost:80 (或你的应用使用的任意端口)
  1. 保存。
    如果出现 “DNS record already exists”,请先在 DNS → Records 中删除冲突的 A 记录。

现在在浏览器中打开 https://myapp.com —— 你应该能看到本地应用通过 HTTPS 提供服务。

从命令行测试

curl https://myapp.com

6. 路由多个服务

您可以通过添加更多公共主机名来公开多个本地服务:

Public HostnameLocal Service
myapp.comlocalhost:3000 (frontend)
api.myapp.comlocalhost:8080 (API)

只需对每个条目重复“添加公共主机名”的步骤。

7. 示例基于 Nginx 的设置

textstack.app          → localhost:80 → nginx → React 前端
textstack.app/api      → localhost:80 → nginx → Docker API(端口 8080)
textstack.dev          → localhost:80 → nginx → 同一应用,不同站点

所有这些都在客厅的笔记本电脑上运行。

8. 本地防火墙(可选但推荐)

sudo ufw allow 22/tcp   # SSH
sudo ufw allow 80/tcp   # Tunnel (local only)
sudo ufw enable
  • 不要将管理面板暴露到互联网;仅绑定到 localhost

9. 安全与访问控制

  • Cloudflare 自动提供 SSL —— 无需 Let’s Encrypt。
  • 使用 Access Policies(Zero Trust)来对敏感路径要求身份验证。

10. 故障排除

症状检查
站点未加载sudo systemctl status cloudflared
应用未响应curl localhost:80
DNS 未解析dig myapp.com
“Address Not Found” on mobile切换飞行模式,将 DNS 更改为 1.1.1.1,等待 15–30 分钟
502 Bad Gateway确认隧道正在运行且本地服务正在监听

11. 何时不使用 Cloudflare Tunnel

  • 高流量生产应用(家庭互联网带宽限制)
  • 需要 99.99 % 正常运行时间的应用(你的笔记本可能会崩溃)
  • 没有适当安全加固的敏感数据

对于严肃的生产工作负载,请考虑使用合适的云服务提供商。

12. 理想使用场景

  • 副项目
  • 开发 / 预发布环境
  • 自托管应用(例如,家庭自动化仪表板)
  • 个人 API

13. 收尾

它花了我大约 15 分钟,就从“本地运行的应用”变成了“全球可通过 HTTPS 访问的应用”。没有云费用,没有 DevOps 复杂性——只是在你的硬件上运行的代码,随时随地都能访问。

有问题吗? 在下方留言,或在 Twitter/X 上找我。
用这个配置在构建酷炫的东西吗? 我很想听听你的故事!

Back to Blog

相关文章

阅读更多 »

RGB LED 支线任务 💡

markdown !Jennifer Davishttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%...

Mendex:我为何构建

介绍 大家好。今天我想分享一下我是谁、我在构建什么以及为什么。 早期职业生涯与倦怠 我在 17 年前开始我的 developer 生涯……