EasyTier+Cloudflare Tunnel 优雅20r成本个人自托管方案

NAT_VPS_零公网_IP_建站方案全指南-6924b644

背景与缘起

起因是在 Trilium 交流群中分享自己的作品,意外结识了一位朋友,对方也是个热衷于捣鼓电脑的人。更令人惊奇的是,他竟然是艺术生,而且年龄还比我小。在服务器的很多领域,我确实不如他。于是我们交流了蛮多这些关于网络的有趣知识,并互相交换了笔记。打算抽空重温一下他曾经踩过的坑。

在他的推荐下,我也买到了比较便宜的服务器:https://host.idcfx.net/

7-Blog/网络与自托管/assets/image-2c010cbd

遇到的痛点:便宜是有代价的

入手服务器后,我发现了这台“廉价”服务器(01-NAT VPS)的致命短板:

  1. 没有独立公网 IP
    • 服务器 IP 信息:103.xx.xx.85:6xx55
    • 真相:这就像几百人合租一套房,大家共用一个大门(公网 IP 103.xx.xx.85)。
  2. 端口极度受限
    • 我没有 80 (HTTP)、443 (HTTPS) 甚至标准的 22 (SSH) 端口的使用权。
    • 服务商只分给了我一个偏僻的 6xx55 端口(映射到内网 22 用于管理)。
  3. 困局
    • 想建站?没 80 端口,无法直接访问。
    • 想远程访问家里 NAS?需要复杂的转发。
    • 朋友的原始方案:用 EasyTier 组网,但需要买一台更昂贵的独立 IP 服务器做出口 —— 这违背了我“穷折腾”的初衷,让这台便宜 VPS 变得鸡肋。

破局思路:Cloudflare Tunnel + EasyTier

为了不买昂贵的服务器,我找到了一套**“白嫖”公网入口**的终极方案。

核心逻辑: 不再寻求“购买”公网 IP,而是利用 03-Cloudflare Tunnel的反向隧道能力,配合 02-EasyTier的内网穿透能力,让流量“主动”找上门。

  • Cloudflare:提供免费的全球公网入口(解决无 IP、无端口问题),作为公网大门,通过 Tunnel 将流量安全转发进 VPS,再由 VPS 转发给 Windows。
  • VPS:作为 24 小时在线的稳定中转站 & EasyTier 组网核心(Signal Server),通过 NAT 端口映射暴露,供 Windows 直连。
  • 家庭设备:通过 EasyTier 接入 VPS 的虚拟局域网,实际运行业务服务。

(只能说 非常非常非常强大 本地windows跑的项目可以安全的用一个优雅的自定义域名被公网访问 且具有极度方便的可拓展性 而成本只需要9.9一个月的服务器 + 12r一年的域名)

核心架构图解 (重点知识补全)

这套方案的精髓在于**“全链路主动出站,无视入站防火墙”**。

7-Blog/网络与自托管/assets/12c4722c40ceb5ea07785afa5fba5755-12c4722c

角色分工详解

角色 组件/环境 职责描述 网络特征
用户 浏览器 发起访问请求 (如 https://nas.example.com) 只需能上网
Cloudflare Edge Network 1. 提供 DNS 解析与 HTTPS 证书 2. 识别 Tunnel 流量并清洗攻击 (DDoS) 3. 将请求塞入隧道 公网入口
VPS cloudflared EasyTier 作为中转跳板。 1. 运行 Tunnel 接收来自 Cloudflare 的流量。 2. 组网核心:作为 EasyTier 的公共节点(Planet),保证家庭设备即使 IP 变动也能互联。 NAT/端口受限 只需能出网
家庭电脑 EasyTier Nginx/宝塔 业务服务 作为业务落地。 运行实际的 Web 服务、NAS、Docker 等。 通过 EasyTier 虚拟 IP 接收来自 VPS 的请求。 无公网 IP 防火墙全闭
7-Blog/网络与自托管/assets/image-f82a8698

第一步:VPS 环境准备与端口映射

查看vps配置:

cat /etc/os-release
uname -m
free -h
ip addr
7-Blog/网络与自托管/assets/image-0aeb981b

Ubuntu 22.04 + 4GB 内存,完全够用。

设置 NAT 端口转发

由于 VPS 只有内网 IP,我们需要在服务商后台“打个洞”供 EasyTier 通信。

  • 登录服务商后台 (host.idcfx.net)。
  • 找到买的那台nat vps 7-Blog/网络与自托管/assets/image-417e3571
  • 进入 NAT 转发 / 端口映射
  • 添加规则
    • 名称:随便填,比如 easytier
    • 协议:TCP+UDP
    • 内部端口:11010 (EasyTier 默认端口)
    • 外部端口:记下系统分配的端口 (例如 22020)
  • 记录:VPS 公网 IP (103.xx.xx.85) 和 外部端口 (22020)。
image-fbbb8a24

第二步:部署 EasyTier (组建虚拟内网)

1. VPS 端 (作为核心服务器)

(1)下载 EasyTier

cd /root
wget https://github.com/EasyTier/EasyTier/releases/download/v2.2.3/easytier-linux-x86_64-v2.2.3.zip

若失败 使用代理:

wget https://ghproxy.net/https://github.com/EasyTier/EasyTier/releases/download/v2.2.3/easytier-linux-x86_64-v2.2.3.zip
7-Blog/网络与自托管/assets/image-51cab3ba

(2)解压安装

apt update && apt install -y unzip
unzip easytier-linux-x86_64-v2.2.3.zip
mv easytier-linux-x86_64 /opt/easytier
chmod +x /opt/easytier/*
7-Blog/网络与自托管/assets/image-196bd545

(3) 验证安装

/opt/easytier/easytier-core --version
7-Blog/网络与自托管/assets/image-25d9521d

(4)配置 Systemd 服务

下载并安装 EasyTier 后,配置 Systemd 服务使其开机自启。

复制下面的命令(整段复制),粘贴到 VPS 终端执行:

⚠️ 注意:下面的命令中 root123456 是组网密码

cat > /etc/systemd/system/easytier.service <<EOF
[Unit]
Description=EasyTier Service
After=network.target

[Service]
# --ipv4 指定这台机器在虚拟网络里的IP (10.10.10.1)
# --network-secret 是你的组网密码,家里电脑也要填这个
# 注意:这里不需要 --peers,也不需要改端口,默认它就会监听 11010
ExecStart=/opt/easytier/easytier-core --ipv4 10.10.10.1 --network-secret root123456
Restart=always
User=root

[Install]
WantedBy=multi-user.target
EOF

# 启动服务并设置开机自启
systemctl daemon-reload
systemctl enable easytier
systemctl start easytier

# 查看状态
systemctl status easytier

如果看到绿色的active (running),说明 EasyTier 启动成功!

image-8ab79d3b

2. Windows 端 (加入局域网)

(1)下载EasyTier

github下载:EasyTier Windows GUI

(2)配置

配置重点

  • Virtual IPv4: 10.10.10.2 (本机虚拟IP)
  • Network Secret:root123456(必须与 VPS 一致)
  • Network Name: default (必须与 VPS 默认值一致)
  • Peers (核心): udp://103.xx.xx.85:22020 (填 VPS 公网IP + 映射端口)
    • 原理:让 Windows 通过 VPS 的公网 IP 和映射端口,直连 VPS。
  • 启动连接:
    • 点击 Connect
    • 验证成功:Peer List 中出现 10.10.10.1,且 Latency 显示数值(如 74ms)。

或者直接改左下角配置文件:

instance_name = "default"
instance_id = "64f3ab07-6cc3-4b3f-9ee2-d4f3c1270492"
ipv4 = "10.10.10.2"
dhcp = false
listeners = [
    "tcp://0.0.0.0:11010",
    "udp://0.0.0.0:11010",
    "wg://0.0.0.0:11011",
]
rpc_portal = "127.0.0.1:15888"

# 关键点1:这里指向你的 NAT VPS 公网入口
[[peer]]
uri = "udp://103.xx.xx.85:22020"

[network_identity]
# 关键点2:必须是 default,因为你 VPS 上没设置名字,默认就是 default
network_name = "default"
network_secret = "root123456"  # 关键点3:你的密码

[flags]
# 关键点4:这里配置代理,解决你的网络环境问题 如果开了代理的话
socks5 = "127.0.0.1:7890"
image-bf875e3e

点击运行 等待三秒左右 出现10.10.10.1 说明连上了vps

7-Blog/网络与自托管/assets/image-625235b5

第三步:配置 Cloudflare Tunnel (公网暴露)

1. 域名准备

  • 在 NameSilo 购买域名:https://www.namesilo.com/ (或者任意地方都可)
    • 买个top后缀的大概10来块钱一年,买完就行,不用着急解析
  • 修改 DNS 服务器 (NameServers) 指向 Cloudflare 提供的地址。(Cloudflare 添加域名)
    • 打开 https://dash.cloudflare.com/ (需要先注册 用谷歌即可)

    • 点击「添加站点」(Add a site)

    • 输入: (你自己买的域名)

    • 选择 Free(免费) 计划

      image-a4c5b4dd
    • 点继续,Cloudflare 会给你 两个 NS 服务器

      image-20b93d0f
  • 去 Namesilo 修改 DNS
    • 打开 https://www.namesilo.com/account_domains.php

    • 点击 你的域名 进入管理

      image-193a2c1a
    • 找到 「NameServers」 或 「DNS 服务器

    • 点击 Change(修改)

    • 删除原来的 NS,填入 Cloudflare 给的那两个

    • image-2ec6a530
    • 保存

2. VPS连接 Cloudflare

(1)下载并安装 cloudflared

这是连接 Cloudflare 的核心组件。由于是NAT VPS,同样使用国内加速链接下载。

依次执行:

# 1. 下载安装包 (使用加速镜像)
wget -O cloudflared-linux-amd64.deb https://gh-proxy.com/https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb

# 2. 安装
dpkg -i cloudflared-linux-amd64.deb

# 3. 验证安装
cloudflared --version
7-Blog/网络与自托管/assets/image-b924bf72

(2)获取授权令牌,建立隧道

这一步需要回到电脑浏览器操作:

  1. 进入 Cloudflare Zero Trust 面板

  2. 左侧菜单找到 Networks -> Tunnels

  3. 点击蓝色按钮 Create a tunnel

    7-Blog/网络与自托管/assets/image-7fdfd39b
  4. Select connectorCloudflared,点 Next。

    7-Blog/网络与自托管/assets/image-1347bc97
  5. Name your tunnel 随便填(比如 vps-bridge),点 Save。

    7-Blog/网络与自托管/assets/image-86bac0f3
  6. 关键一步: 在 "Install and run a connector" 页面,确保选中 Debian (64-bit)。 Ubuntu 是基于 Debian 开发的,所以在 Linux 世界里,Ubuntu 和 Debian 是“一家人”。

    7-Blog/网络与自托管/assets/image-7c5ece57 下面有一个黑色的代码框,里面有一行以 `sudo cloudflared service install ...` 开头的长命令。这是连接 Cloudflare 的“钥匙” image-7dd664ae
  7. 执行:

    systemctl status cloudflared
    
    image-42cd5668

    从日志里这句 ERR Failed to dial a quic connection 看出,你的 VPS 网络环境对 QUIC协议 (UDP) 支持不好,导致连接超时。

    解决方法很简单:强制让它走 HTTP2 协议 (TCP)。

    依次执行下面的命令来修复:

    停止当前卡住的服务:

    systemctl stop cloudflared
    

    修改配置文件(强制使用 http2)

    sed -i 's/tunnel run/tunnel run --protocol http2/g' /etc/systemd/system/cloudflared.service
    

    重载配置并重启

    systemctl daemon-reload
    systemctl start cloudflared
    

    再次查看状态

    systemctl status cloudflared
    
    7-Blog/网络与自托管/assets/image-4515e99e

3. 配置公网访问规则 (Public Hostname)

组网成功后,VPS 和 Windows 互通。现在需要 Cloudflare 把公网请求转发给内网的 Windows。

  1. 登录 Cloudflare Dash -> Zero Trust -> Networks -> Tunnels。

    https://dash.cloudflare.com/f9f6bb732c788123a0654e0b8f23873f/home/domains

    image-d8b8e4bb

    搜索Tunnels:

    7-Blog/网络与自托管/assets/image-6c66f358

    https://one.dash.cloudflare.com/f9f6bb732c788123a0654e0b8f23873f/networks/connectors

    image-5d73dc3b
  2. 配置 Tunnel (vps-bridge) -> Public Hostname

    image-b9cfd4a2 image-db94004d
  3. 添加规则 (Add a public hostname):

    • Subdomain: note (笔记访问前缀)

    • Domain: (我们一开始注册 并让Cloudeflare解析的域名)

    • Path: 空

    • Service Type: HTTP

    • URL: 10.10.10.2:37840

    • 解析:Cloudflare 收到请求 -> 发给 VPS -> VPS 通过虚拟局域网 -> 找到 Windows (10.10.10.2) 的 37840 端口。

      image-d2390049
  4. 保存。

最终效果:

手机可以正常访问Windows 上的 Trilium 笔记,且全程加密,无需公网 IP。

image-6a98cece

思考:

1、再看看做了什么?

利用 NAT VPS 作为中转跳板,结合 Cloudflare 的边缘防护,实现零公网 IP 环境下的安全服务发布。

  • VPS (核心枢纽):
    • 角色: EasyTier 组网核心 + 流量中转站。
    • 职责: 运行 cloudflared 接收公网流量,同时运行 EasyTier 将流量转发至内网虚拟 IP。
  • Windows (业务节点):
    • 角色: 纯粹的业务提供者(Payload)。
    • 职责: 运行具体服务(如 Trilium、Alist),通过 EasyTier 接入虚拟网,无需暴露任何公网端口
  • Cloudflare (安全网关):
    • 角色: 门卫与保安。
    • 职责: 处理 DNS 解析、自动 HTTPS 证书、WAF 防火墙过滤、Access 鉴权。
7-Blog/网络与自托管/assets/image-c897c216

2、数据流向

从用户访问到服务响应的完整路径:

用户 (浏览器) (公网 HTTPS) Cloudflare 边缘节点 (CDN/WAF 清洗) (加密隧道) VPS (由 cloudflared 接收) (转发至内网 IP) EasyTier 虚拟网卡 (P2P 或中转 VPN 流量) Windows (EasyTier 接收 -> 本地端口) 具体服务 (如 Trilium)

7-Blog/网络与自托管/assets/image-f9805493

3、安全性评估 (Security Analysis)

结论: 远高于传统直接穿透(FRP/端口映射),属于“企业级”零信任安全模型。

  • 🛡️ 核心防御机制:

    1. 隐身术: 攻击者无法通过扫描 IP 找到你的真实位置,因为所有入口都在 Cloudflare。
    2. 闭门谢客: Windows 和 VPS 不需要开放 80/443 等高危入站端口。
    3. Access 绝杀: 可在 CF 后台设置“仅特定邮箱验证码”通过。黑客连 Trilium 的登录框都看不到。
    7-Blog/网络与自托管/assets/image-272cb00c

4、扩展性指南 (SOP)

场景: 在 Windows 上新增一个服务(如 Alist,端口 5244)。

原则: 架构搭建完毕后,新增服务无需改动网络层(VPS/路由器)。

  1. Windows 端操作:
    • 启动新服务(Alist)。
    • 防火墙设置: 在 Windows 高级防火墙中,添加入站规则允许 5244 端口(仅限内网/本机)。
  2. Cloudflare 端操作:
    • 进入 Zero Trust -> Tunnels -> Configure

    • Public Hostname 页签 -> Add Public Hostname

    • 设置域名(如 pan.yourdomain.com)。

    • 设置 Service:Type: HTTPURL: [Windows的EasyTier IP]:5244

      image-eb2be62c
  3. 完成:
    • 直接访问域名即可。

      image-c60ae5a1
7-Blog/网络与自托管/assets/image-a99ec660

5、 瓶颈与局限 (Limitations)

  • 带宽瓶颈: 取决于 NAT VPS 的上行带宽。若 VPS 只有 10Mbps,公网访问速度上限即为 1.2MB/s 左右。
  • 延迟叠加: 流量经过 CF 节点和 VPS 转发,物理路径变长,延迟会比直连稍高(对网页服务无感,对游戏有影响)。

6、总结

这是一套低成本、高安全、易维护的完美个人自托管方案。

  • 成本: 闲置/廉价 VPS 即可利用。
  • 安全: Cloudflare 护盾 + 隧道隔离。
  • 维护: “一次铺路,终身受益”,新增服务仅需 10 秒配置。