赛博堡垒的隐形跨海大桥:Cloudflare Tunnel 内网穿透实战
This content is not available in your language yet.
🌉 认识隐形跨海大桥:为什么放弃传统 DDNS?
Section titled “🌉 认识隐形跨海大桥:为什么放弃传统 DDNS?”在赛博堡垒的建设中,我们需要一种优雅且绝对安全的方式,从外部公网直接访问内部的核心服务(如数据总控台 pgAdmin 或 Servarr 影音全家桶)。作为首席架构师,我们部署的网络核心组件是:Cloudflare Tunnel (CF 隧道)。
它的核心逻辑是“由内而外”的:由集群内部的“隧道兵”(Cloudflared)主动向外呼叫,与 Cloudflare 的全球边缘节点建立加密长连接。这种架构为赛博堡垒带来了三大杀手锏级别的优势:
- 物理级隐身:无需在物理路由器或防火墙上开放任何入站(Inbound)端口。内网服务完全隐藏在暗处,彻底让全网扫描器和恶意嗅探无从下手。
- 无视网络环境:完全不依赖公网 IPv4/IPv6 资源,无视各类运营商的复杂 NAT 封锁。只要集群本身具备访问公网的能力,这条加密专线就能瞬间打通。
- 前置清洗盾牌:所有的外部访问流量,都必须先经过 Cloudflare 的 CDN 节点进行规则过滤与 DDoS 清洗,只有纯净且合法的请求,才能顺着加密隧道悄无声息地流入集群内部。
👉 情报中心:besthomelab/k3s-homelab-gitops 图纸库
🎬 施工演示录像 (Video Walk-through)
Section titled “🎬 施工演示录像 (Video Walk-through)”🔐 施工准备:绝密 Token 加密入库
Section titled “🔐 施工准备:绝密 Token 加密入库”隧道兵(Cloudflared)需要一把“钥匙”(Token)才能与云端取得联系。这把钥匙是绝对的机密,绝不能明文提交到公开的 GitHub 仓库中。我们继续沿用堡垒的非对称加密护盾:Sealed Secrets。
第一步:潜入 CF 控制台提取真实 Token (绝不提交!) 为了让“隧道兵”能与云端接头,我们需要去获取最高权限的接头暗号:
- 登录 Cloudflare 控制台,进入左侧菜单的 Zero Trust 面板。
- 展开 Networks(网络) -> 点击 Tunnels(连接器) -> Create a tunnel(创建隧道)。
- 选择 Cloudflared 连接器类型,点击 Next。
- 为你的隧道命名(例如:
k3s-homelab),点击 Save tunnel。 - 在接下来的环境选择页面(随便选一个如 Docker),在底部的自动生成命令中,找到
--token后面跟着的那一长串字符,这就是你的绝密 Token。
拿到 Token 后,在本地提取图纸模版并将其填入 TUNNEL_TOKEN 字段。
👉 获取密码模版图纸:apps/cloudflared/secret.template.yaml
第二步:本地加密封壳
在终端执行加密,生成集群可读的安全密文 secret.yaml:
kubeseal --format yaml < apps/cloudflared/secret.template.yaml > apps/cloudflared/secret.yaml⚠️ 包工头致命警告: 生成
secret.yaml后,立刻将secret.template.yaml销毁或还原或加入.gitignore!
🔨 部署隧道兵阵地 (Deployment)
Section titled “🔨 部署隧道兵阵地 (Deployment)”我们将 cloudflared 容器直接部署在 traefik 命名空间。这是一个经过深思熟虑的架构设计:让“隧道兵”与“赛博海关 (Traefik)”并肩作战,确保外部流量进入隧道后,能以最短的路径直接转交给 Traefik 进行内部路由分发。
在这里,我们抛弃了繁琐的本地配置文件,直接采用 Token 模式无状态运行,并开启 2 个副本保障高可用,防止单节点故障导致隧道中断。
👉 获取隧道兵部署图纸:apps/cloudflared/deployment.yaml
🚀 启动 GitOps 总监工 (ArgoCD Application)
Section titled “🚀 启动 GitOps 总监工 (ArgoCD Application)”万事俱备,将加密后的 Secret 和 Deployment 图纸推送到 GitHub,然后通过 ArgoCD 触发器接管部署。
在这份配置中,我们不仅开启了自动重试机制(防抖动),还使用了一个极其优雅的 GitOps 技巧:在 directory 字段中加入了 exclude: '*template*' 过滤网。这样就算你本地不小心把明文模版推送上去了,ArgoCD 也绝对不会将它下发到集群中,完美避开安全雷区。
👉 获取 ArgoCD 触发器指令:bootstrap/cloudflared-app.yaml
🎛️ 云端中枢调度:配置边缘节点路由规则
Section titled “🎛️ 云端中枢调度:配置边缘节点路由规则”当 ArgoCD 成功拉起 cloudflared 容器后,隧道兵就已经在暗中与 Cloudflare 边缘节点完成了加密握手。此时,我们需要回到云端控制台,为这条隧道下达具体的“通车指令”。
第一步:确认隧道连通状态
回到 Cloudflare Zero Trust 控制台,在 Tunnels 列表中,你会看到刚才创建的 k3s-homelab 隧道的 Status 已经由黄色的 INACTIVE 变成了耀眼的绿色 HEALTHY。这标志着物理底层的隐形大桥已成功合拢!
第二步:下发公网域名 (Public Hostname) 直达映射规则 为了兼顾 Cloudflare 免费版 SSL 的限制与优雅的外网访问体验,我们采取单点直达映射的策略。点击该隧道,选择 Configure,切换到 Public Hostname 标签页,点击 Add a public hostname。
以发布影音需求总控 Seerr 为例,填写如下规则:
- Subdomain: 填入纯粹的应用前缀
seerr(同理,发布 Jellyfin 就写jellyfin,Headlamp 就写headlamp,切记不要叠加多余的后缀) - Domain: 永远选择你的主域名
besthomelab.tech - Service Type: 永远选择
HTTP - Service URL: 填入 K3s 集群内部真实的 DNS 地址,格式为
服务名.命名空间.svc.cluster.local:内部端口。例如 Seerr 填入:seerr-service.media.svc.cluster.local:5055
💡 首席架构师笔记:为什么绕过 Traefik 选择直连后端 Pod? 你可能会好奇:为什么不把外部流量统一交给集群内部的 Traefik 网关去处理? 这是向 Cloudflare 免费版 SSL 证书机制做出的“实用主义让步”。CF 免费泛域名证书不支持四级域名(如
seerr.k3s.besthomelab.tech)。为了白嫖企业级 CDN 的安全盾牌,我们将外网访问降维至三级域名(seerr.besthomelab.tech)。 在这种架构下,让 Cloudflared 隧道兵直接客串“微型网关”,将流量点对点精准投递给集群内部的具体服务,不仅完美避开了证书层级的报错,还减少了一层内部代理的周转,实现了极致的“穿透直通车”体验!
🚨 赛博安全红线警告: 绝对不要将没有任何身份验证(无密码保护)的底层核心组件通过隧道暴露到公网!例如 Longhorn 分布式存储面板、Cilium Hubble 网络雷达等。 即便 Cloudflare 提供了前置盾牌,将内部的“裸奔”高权组件直接对外开放也是极其致命的。这类服务应仅限局域网直连,或通过更为严苛的强认证中间件访问。
🚦 流量路由逻辑推演
Section titled “🚦 流量路由逻辑推演”部署完成后,这套内网穿透架构的完整数据流向如下:
- 你在外网访问
https://seerr.k3s.besthomelab.tech。 - 流量抵达 Cloudflare 的全球边缘节点。
- CF 节点通过建立好的隐形隧道,将流量安全输送到我们刚才部署的
cloudflaredPod 中。 cloudflared接收到流量后,在 CF 控制台的路由规则指引下,将请求转发给本地的集群服务。
至此,整座堡垒从“与世隔绝”进入了“隐形接入”的全新时代!
⚡ 进阶联动:唤醒赛博监工的实时响应
Section titled “⚡ 进阶联动:唤醒赛博监工的实时响应”现在我们的赛博堡垒已经拥有了安全且隐形的外部访问通道。这意味着,外部的合规互联网服务终于可以“主动敲门”了!
还记得我们在建设 GitOps 流水线时部署的“赛博总监工” ArgoCD 吗?默认情况下,它像个尽职但古板的巡逻员,每隔 3 分钟才去 GitHub 图纸库看一眼有没有新改动。对于追求极致效率的首席架构师来说,这 3 分钟的延迟是不可接受的。
利用刚刚建好的 CF 隧道,我们可以配置 GitHub Webhook。在代码 git push 的瞬间,让 GitHub 顺着这条隐形隧道直接“刺透”内网,精准唤醒 ArgoCD 进行构建,实现真正的毫秒级全自动交付!