如何将本地服务器暴露到互联网(无需端口转发)
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
- 前往 dash.cloudflare.com → 添加站点。
- 输入您的域名(例如
myapp.com)。 - 选择 免费 计划。
- Cloudflare 将显示两个名称服务器(例如
carter.ns.cloudflare.com、vita.ns.cloudflare.com)。 - 在您的注册商控制面板中,用 Cloudflare 提供的名称服务器替换现有的名称服务器。
- 等待 5–30 分钟进行 DNS 传播。
2. 在 Cloudflare Zero Trust 中创建隧道
- 在 Cloudflare 仪表板,打开 Zero Trust(左侧边栏)。
- 导航至 Networks → Tunnels。
- 点击 Create a tunnel,为其命名(例如
my-server)。 - 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. 添加公共主机名
- 在 Cloudflare 仪表板,前往 Tunnels →
→ Configure 。 - 点击 Public Hostname → Add a public hostname。
- 填写以下字段:
| 字段 | 值 |
|---|---|
| 子域名 | (留空或使用 www) |
| 域名 | 选择你的域名 (myapp.com) |
| 服务类型 | HTTP |
| URL | localhost:80 (或你的应用使用的任意端口) |
- 保存。
如果出现 “DNS record already exists”,请先在 DNS → Records 中删除冲突的 A 记录。
现在在浏览器中打开 https://myapp.com —— 你应该能看到本地应用通过 HTTPS 提供服务。
从命令行测试
curl https://myapp.com
6. 路由多个服务
您可以通过添加更多公共主机名来公开多个本地服务:
| Public Hostname | Local Service |
|---|---|
myapp.com | localhost:3000 (frontend) |
api.myapp.com | localhost: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 上找我。
用这个配置在构建酷炫的东西吗? 我很想听听你的故事!