最近在折腾各种自建服务的时候,总能遇到一个让人头疼的问题:端口。

如果你用的是家里的宽带动静宽带,或者是没有备案的 VPS,想要把服务暴露到公网上,通常面临两大难关:一是运营商封锁 80/443 端口,二是没有公网 IP 做端口映射。以前我们可能会用 FRP 之类的内网穿透工具,但搭建服务端、维护配置实在有点麻烦。

其实,Cloudflare 早就为我们准备了一个零配置的“神级”内网穿透方案——Cloudflare Tunnel(以前叫 Argo Tunnel)。配合 Docker 部署,简直是懒人福音。今天就来以部署 Komari 为例,聊聊如何实现“零公网端口”的两步快速部署。

为什么选择 Cloudflare Tunnel?

传统的端口映射本质上是在你的防火墙上“凿洞”,把服务直接暴露在公网上,这就意味着你必须时刻注意安全防护,否则很容易被扫段攻击。而 Cloudflare Tunnel 的逻辑完全反过来了:

Cloudflare Tunnel 架构示意图,展示流量如何通过 CDN 加密隧道流入服务器

Cloudflare Tunnel 工作原理:无需开放入站端口,流量经 CDN 加密流回本地。

它不需要你开放任何入站端口。你只需要在服务器上运行一个小小的客户端(Cloudflared),它就会主动向 Cloudflare 的边缘网络发起长连接。当你通过域名访问服务时,流量先到达 Cloudflare 的 CDN,再通过这条加密隧道流回到你的服务器。

这带来的好处显而易见:

  1. 绝对安全:攻击者根本扫描不到你的服务器 IP,因为入站端口全是关闭的。
  2. 无需公网 IP:不管你在 NAT 后面还是只有内网 IP,只要能上网就能用。
  3. 自动 HTTPS:Cloudflare 的 SSL 证书全自动托管,访问起来全是小绿锁。

前置准备:域名是必须的

要玩转这套方案,你手里得有一个域名,并且把域名的 DNS 解析托管到了 Cloudflare 上。这是使用 Tunnel 的门槛。如果你还没有域名,趁现在搞个便宜的顶级域名,配合 Cloudflare 免费的 CDN 和隧道,性价比极高。

部署 Komari 的实战两步走

假设你是新手,我们直接用 Docker 来跑 Komari。如果你还没装 Docker,通常一句 curl -sSL https://get.docker.com/ | sh 就能搞定大部分 Linux 发行版。

第一步:Docker 启动 Komari

Komari 是个很轻量的服务,直接拉取镜像运行即可。为了方便管理,我们建议建立一个工作目录。

# 创建并进入目录
mkdir komari && cd komari

# 后台运行 Komari 容器
# 假设 Komari 默认监听内部的某个端口,比如 8080
docker run -d --name komari \
  -p 127.0.0.1:8080:8080 \
  --restart unless-stopped \
  your-komari-image-name:latest

注意:这里 -p 参数绑定的是 127.0.0.1:8080。这意味着 Komari 只监听本地回环地址,外面的人根本无法直接访问这个端口,即使服务器有公网 IP 也访问不到。这就在物理隔绝层面保证了安全。

Cloudflare Zero Trust 控制台的 Tunnels 配置界面截图

在 Cloudflare 控制台中快速创建 Tunnel 并获取配置 Token。

第二步:配置 Cloudflare Tunnel

这是最关键的一步,其实比想象中简单很多,甚至不需要下载复杂的配置文件。

  1. 获取 Token:登录 Cloudflare 控制台,进入你的域名 -> Zero Trust -> Networks -> Tunnels。Create a new tunnel,选择“Docker”作为安装方式,系统会给你一长串 Token 命令。

  2. 一行命令启动隧道:Cloudflare 会给你一个类似下面这样的超长命令,直接复制粘贴在你的服务器上运行。

docker run -d --name cloudflared \
  --restart unless-stopped \
  cloudflare/cloudflared:latest \
  tunnel run <你的-tunnel-Token>

这行命令会自动拉取官方的 Cloudflared 镜像,并利用 Token 完成认证和连接。

  1. 配置路由: Tunnel 跑起来还不够,你得告诉 Cloudflare 把哪个域名的流量发到这个隧道的哪个端口上。

在 Tunnels 的配置页面,点击你刚才创建的隧道,进入“Public Hostname”设置。 - Subdomain:填入你想要的前缀,比如 komari。 - Domain:选择你的域名(比如 example.com),最终访问地址就是 komari.example.com。 - Service:选择 http://localhost:8080

点击 Save。Cloudflare 会自动更新全球边缘节点的路由表,通常几秒钟内就能生效。

验证成果与排坑

搞定上面两步,打开浏览器,输入 https://komari.example.com。是不是惊喜地发现服务直接出来了?而且浏览器地址栏左上角已经是挂着 Cloudflare 证书的 HTTPS 了。

在折腾过程中,如果遇到问题,可以按以下思路检查:

  1. 容器端口冲突:确保本地没有其他服务占用了 Komari 的端口或者 Cloudflared 的临时端口。用 docker ps -a 检查容器状态,如果是 Restarting 状态,多半是配置写错或者是端口冲突了,用 docker logs container_name 查看日志。
  2. 域名 DNS:确认域名的 NS 记录确实指向了 Cloudflare。如果在 Cloudflare 面板看到 DNS 标记不是橙色云朵(代理开启状态),某些功能可能会受限。
  3. 防火墙墙头:虽说 Tunnel 不需要入站端口,但你服务器的 出站 规则得允许访问 Cloudflare 的服务器。如果公司或家里的宽带极其严格,封锁了 Cloudflare 的 IP 或 QUIC 协议,可能会导致隧道连不上。这时候可以尝试在 Docker 命令里强制切换协议到 HTTP 或添加 DNS 指定。

总结

相比于去折腾路由器的端口映射,或者为了一个内网服务去搞复杂的反向代理配置,这套“Docker 容器服务 + Cloudflare Tunnel”的组合拳简直就是现代部署的“标准化流程”。它把安全性、便捷性和成本都做到了极致,对于个人开发者或者喜欢折腾各种 Web 服务的玩家来说,绝对是目前最优解的方案之一。

有了这个思路,不仅是 Komari,你可以套用到 QBittorrent、家庭NAS、或者任何 WebUI 管理界面上,彻底告别端口烦恼。

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭