用CloudFlare Mesh搭建私有局域网
原始需求
现在有3个常用办公地点:家,宿舍,实验室。每个办公地点都有若干设备,也都有自己的局域网,也都没有固定的对外ipv4地址。 我现在想要实现各个设备跨域自由访问,类似虚拟局域网。 使用CloudFlare Mesh是否合适?如果合适?请详细具体知道我如何搭建和使用?
方案
Cloudflare Mesh 非常适合这样的场景。 它就是为"无公网 IP 的多地点设备互联"设计的,所有流量经 Cloudflare 全球网络加密转发(后量子加密),支持 TCP/UDP/ICMP,相当于一个跨地域的虚拟局域网。
两种组网模式
| 模式 | 适用场景 | 是否需要服务器 |
|---|---|---|
| A. 纯客户端互联 | 每台设备都装客户端,设备间用 Mesh IP 互访 | ❌ 不需要 |
| B. 站点到站点(Site-to-Site) | 每个地点部署一台 Linux 做 Mesh 节点,该地点整段子网互通 | ✅ 每地点一台 |
推荐方案
- 如果你每台设备都能装客户端(Windows/macOS/Linux/iOS/Android)→ 方案 A,最简单,零基础设施
- 如果某些设备不能装客户端(如打印机、NAS、IoT)→ 方案 B,让整段子网可达
- 两者可以混合使用:既部署节点打通子网,又在常用设备上装客户端
方案 A:纯客户端互联(最简方案)
每个地点的每台设备安装 Cloudflare One Client 并注册,即可获得一个 100.96.0.0/12 范围内的 Mesh IP,任意两台设备直接用 Mesh IP 互访。
步骤 1:运行 Mesh 设置向导
- 打开 Mesh 页面
- 首次使用会弹出 Setup Wizard,按向导完成账户配置
- 当向导问到是否部署 Mesh 节点时,选 “I’ll connect later”(方案 A 不需要节点)
步骤 2:配置 Split Tunnel(关键)
客户端必须让 Mesh IP 范围走 Cloudflare 隧道,否则设备间无法互通。
- 进入 Zero Trust → Team & Resources → Devices → Device profiles → General profiles
- 找到客户端使用的设备配置文件,点 Configure
- 在 Split Tunnels 中:
- 如果是 Exclude 模式(默认):确保排除列表中没有
100.64.0.0/10(它包含100.96.0.0/12)。如果有,删除它 - 如果是 Include 模式:在 Include 列表中添加
100.96.0.0/12
- 如果是 Exclude 模式(默认):确保排除列表中没有
步骤 3:在每台设备上安装并注册客户端
Windows / macOS / Linux:
- 下载 并安装 Cloudflare One Client
- 启动客户端 → 选择 Zero Trust security
- 输入你的 team name(在 Zero Trust 设置中可看到)
- 完成认证(可用邮箱 OTP 等简单方式)
iOS / Android:
- 安装 Cloudflare One Agent app
- 输入 team name → 认证 → 安装 VPN Profile
步骤 4:验证连通性
每台设备注册后在 Mesh 页面 可看到其 Mesh IP。在任一设备上:
| |
方案 B:站点到站点(打通整段子网)
适合需要让子网内未装客户端的设备(NAS、打印机等)也能被跨地点访问。
架构示意
家 (192.168.1.0/24) 宿舍 (192.168.2.0/24) 实验室 (192.168.3.0/24)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 各设备 │ │ 各设备 │ │ 各设备 │
│ 192.168.1.x │ │ 192.168.2.x │ │ 192.168.3.x │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
Mesh 节点 Mesh 节点 Mesh 节点
(Linux, 常驻) (Linux, 常驻) (Linux, 常驻)
│ │ │
└──────────── Cloudflare 全球网络 ────────────────────────┘
前提:三个地点的局域网网段不能重叠。如果都用的
192.168.1.0/24,需要先改路由器把不同地点设成不同网段。
步骤 1:运行 Mesh 设置向导
同方案 A 步骤 1,打开 Mesh 页面 完成向导。
步骤 2:在每个地点创建一个 Mesh 节点
- 在 Mesh 页面 点 Add → 创建节点
- 重复 3 次,分别命名为如
mesh-home、mesh-dorm、mesh-lab - 每个节点会生成一个 Token
步骤 3:在每个地点的 Linux 服务器上安装并注册
在每个地点选一台常开的 Linux 机器(可以是树莓派、小主机、NAS 上的虚拟机等),依次执行:
Debian/Ubuntu:
| |
RHEL/CentOS 9+:
| |
注册节点(用对应节点的 Token):
| |
回到 Mesh 页面,节点应显示为 Online 并分配了 Mesh IP。
步骤 4:为每个节点添加 CIDR 路由
让 Cloudflare 知道哪个节点负责哪个子网:
- 进入 Networking → Mesh → 选中节点 → Routes 标签
- 点 Add route
- 输入该地点的子网 CIDR,例如:
mesh-home→192.168.1.0/24mesh-dorm→192.168.2.0/24mesh-lab→192.168.3.0/24
- 保存
步骤 5:配置 Split Tunnel(确保流量走 Cloudflare)
在节点的设备配置文件和客户端的设备配置文件中,确保远程子网 CIDR 走 Cloudflare:
- Include 模式(推荐):在 Include 列表中加入:
100.96.0.0/12(Mesh IP 范围)192.168.1.0/24、192.168.2.0/24、192.168.3.0/24(三个子网)
- Exclude 模式:确保这些 CIDR 不在排除列表中
路径:Zero Trust → Team & Resources → Devices → Device profiles → General profiles → Configure → Split Tunnels → Manage
步骤 6:配置本地路由器(让子网设备回包走 Mesh 节点)
子网内的设备收到来自远端的请求后,回包需要能路由到 Mesh 节点。有两种方式:
方式 1:Mesh 节点就是默认网关(如在路由器上跑)→ 无需额外配置
方式 2:Mesh 节点是子网内普通主机(更常见)→ 在路由器上加静态路由:
| 地点 | 目的地 | 下一跳 |
|---|---|---|
| 家 | 192.168.2.0/24 | 家的 Mesh 节点 IP(如 192.168.1.10) |
| 家 | 192.168.3.0/24 | 家的 Mesh 节点 IP |
| 家 | 100.96.0.0/12 | 家的 Mesh 节点 IP |
| 宿舍 | 192.168.1.0/24 | 宿舍的 Mesh 节点 IP |
| 宿舍 | 192.168.3.0/24 | 宿舍的 Mesh 节点 IP |
| 宿舍 | 100.96.0.0/12 | 宿舍的 Mesh 节点 IP |
| 实验室 | 192.168.1.0/24 | 实验室的 Mesh 节点 IP |
| 实验室 | 192.168.2.0/24 | 实验室的 Mesh 节点 IP |
| 实验室 | 100.96.0.0/12 | 实验室的 Mesh 节点 IP |
如果觉得静态路由麻烦,Mesh 节点默认开启了 Source NAT(SNAT),远端设备看到的源 IP 是 Mesh 节点的本地 IP,回包自然回到节点,不需要静态路由。只有当你关闭了 SNAT 时才需要配静态路由。
步骤 7:验证
在家的设备上 ping 实验室的设备:
| |
在装了客户端的笔记本上 ping 任何地点的 Mesh 节点:
| |
方案 A + B 混合(推荐)
最灵活的做法:
- 每个地点部署一台 Mesh 节点(方案 B),打通整段子网
- 常用设备(笔记本、手机)再装 Cloudflare One Client(方案 A),出门也能直接用 Mesh IP 访问任意地点的设备
注意事项
- 网段不能重叠:三个地点的 LAN 网段必须不同,否则需要用 Virtual Networks 功能隔离
- Mesh 节点需常开:方案 B 中节点关机则该地点不可达
- 协议要求:Mesh 节点的设备配置文件需使用 MASQUE 协议(默认即是),不要改成 WireGuard
- 节点上限:每账户最多 50 个 Mesh 节点
- 免费计划:Cloudflare Zero Trust Free 计划支持最多 50 个用户,足够个人使用