↓ 跳过正文

Cloudflare Tunnel:内网穿透科普

·1970 字·4 分钟
作者
吾便宜
Cloudflare Tunnel 内网穿透科普

插图来源:Storyset

我第一次听说 Cloudflare Tunnel,是因为家里的 NAS 想从公司访问,但宽带没有公网 IP。传统方案是 frp 要自己搭服务器,ngrok 免费版有限速。直到我试了 Cloudflare Tunnel:免费、不用公网 IP、还自带 CDN。复盘一下这个神器。

Q1:原理是什么?
#

传统穿透是"外网主动连你"(所以要公网 IP 或中转服务器)。Tunnel 反过来:你的内网设备主动向 Cloudflare 建立一条出站长连接,外网访问时走这条隧道进来。因为是"向外连",不需要公网 IP,家庭宽带直接能用。

Q2:适合什么场景?
#

  • 家里 NAS / 树莓派的远程访问;
  • 个人博客、测试环境对外展示;
  • 异地设备的安全组网(配合 Tailscale 这类组网工具 效果更佳)。

不适合:大流量下载站、视频站——免费版有滥用政策,别挑战底线。

Q3:一小时上手步骤?
#

  1. 域名托管到 Cloudflare(免费);
  2. 内网设备装 cloudflared,一条命令登录;
  3. 建一条 Tunnel,把内网端口(如 8080)映射到子域名;
  4. 外网直接访问子域名,自动走 HTTPS。

全程不需要懂网络协议,Cloudflare 免费套餐 里有账号注册指引。

Q4:和 frp 比怎么选?
#

Cloudflare Tunnelfrp
费用免费要一台公网服务器
速度走 CF 网络,国内一般看服务器线路
隐私流量经 CF自己可控
门槛低中

要省心选 Tunnel,要可控选 frp。小孩子才做选择?成年人看场景:个人用 Tunnel,生产用 frp。

进阶:Tunnel 的隐藏玩法
#

  • Access 零信任:给 Tunnel 加 Cloudflare Access,访问要先过身份验证,家庭 NAS 秒变"私有云",免费 50 席;
  • 多服务映射:一条 Tunnel 挂多个子域名,NAS、博客、HomeAssistant 各走各的;
  • SSH 穿透:不只是 HTTP,SSH 也能走 Tunnel 出门在外连家里服务器;
  • 配合 frp:内网服务先用 frp 汇聚,再统一走 Tunnel 出口,架构清晰。

cloudflared 安装:Linux 与群晖
#

Linux(二进制,最省事):

curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared
chmod +x cloudflared && sudo mv cloudflared /usr/local/bin/
cloudflared --version   # 有版本号输出即成功
cloudflared tunnel login  # 浏览器打开授权,选你的域名
cloudflared tunnel create my-tunnel  # 建隧道,记下 ID

群晖(Docker 版,推荐):

  1. 套件中心装 Docker;
  2. 注册表搜 cloudflare/cloudflared,下载 latest;
  3. 去 Cloudflare Zero Trust 后台 → Networks → Tunnels → 新建,拿到 Token;
  4. 容器高级设置 → 命令填 tunnel --no-autoupdate run --token 你的Token,启动。

群晖用户别折腾命令行版,Docker 版升级、重启都省心。

多域名/多服务配置:一条隧道全家桶
#

一条 Tunnel 可以挂多个子域名,配置文件 ~/.cloudflared/config.yml:

tunnel: <你的隧道ID>
credentials-file: /root/.cloudflared/<隧道ID>.json
ingress:
  - hostname: nas.example.com
    service: http://192.168.1.10:5000
  - hostname: blog.example.com
    service: http://192.168.1.10:8080
  - hostname: ssh.example.com
    service: ssh://192.168.1.10:22
  - service: http_status:404  # 兜底,其他域名一律 404

每条 hostname 要在 Cloudflare 后台(或用 cloudflared tunnel route dns 命令)做 DNS 绑定。NAS、博客、HomeAssistant 各走各的子域名,一条隧道全搞定。

常见排错:90% 的问题是这四个
#

  1. 隧道显示 unhealthy:先看 cloudflared 进程活着没,systemctl restart cloudflared 重启;再看日志 journalctl -u cloudflared 找报错;
  2. 域名打不开 / 502:先确认内网服务本机能访问(curl localhost:8080),再查 ingress 规则的 IP 端口写对没;
  3. login 授权失败:tunnel login 的链接必须在浏览器里点完授权;无头服务器先在本地电脑 login,再把证书文件拷过去;
  4. 速度慢:免费版走 Cloudflare 公共网络,国内晚高峰抽风是常态,换个时间段试试;真要稳定,考虑付费线路或换 frp 自建。

图形化建隧道:Zero Trust 后台流程
#

不想敲命令,全程网页点鼠标也行:

  1. 登录 Cloudflare 后台 → 左侧 Zero Trust → Networks → Tunnels → Create;
  2. 选 Cloudflared 类型,起个名字,复制页面给出的 Token;
  3. 按上面的群晖 Docker 步骤(或 Linux 二进制),用 Token 把连接器跑起来;
  4. 回到 Tunnels 页面 → Public Hostname → Add:填子域名,Service 填内网地址(如 http://192.168.1.10:5000);
  5. 保存后等 1~2 分钟,浏览器打开子域名,能访问即成功。

命令行和图形化只是两种入口,隧道本身是一样的。新手建议先走图形化,跑通了再研究配置文件。

进阶:让 Tunnel 开机自启(Linux)
#

手动跑 cloudflared tunnel run,关了终端隧道就断。用 systemd 托管,一劳永逸:

sudo nano /etc/systemd/system/cloudflared.service
[Unit]
Description=Cloudflare Tunnel
After=network.target

[Service]
ExecStart=/usr/local/bin/cloudflared tunnel --config /root/.cloudflared/config.yml run
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now cloudflared
sudo systemctl status cloudflared  # 看到 active 即成功

断线自动重连、开机自动启动,家里的服务从此"永远在线"。

安全注意事项
#

  1. 别暴露管理后台:路由器的管理界面、NAS 的 admin,别直接映射公网,加 Access 保护;
  2. 子域名别用真名:nas-zhangsan.example.com 等于告诉全世界这是你的 NAS;
  3. 定期看日志:Cloudflare 后台有访问日志,异常 IP 及时拉黑;
  4. 免费版限制:遵守 ToS,别跑大流量下载,号没了哭都来不及。

一句话:2024 年了,内网穿透早就不只有"买云服务器"一条路。Cloudflare Tunnel 把门槛打到地板,家里有 NAS 的都值得试一次。