概述
将本地网络服务暴露到公网是一个常见需求。比如,你可能希望访问 qBittorrent 的管理界面,以便随时添加新的下载任务。为实现这一目标,你可以使用 Cloudflare Tunnel,这是一种几乎免费的安全解决方案(但是还是需要买域名)!本文将提供设置 Cloudflare Tunnel 的手把手教程。
前置条件
- 已注册一个域名(例如
nicklin.work)。 - 拥有一个 Cloudflare 账户。
- 域名已通过 Cloudflare 管理。
- 本地服务器已安装
docker。
指南
-
创建一个目录来存储
cloudflared所需的所有文件。cloudflared是一个用于管理部分 Cloudflare 资源的命令行工具。我们将使用它来创建和设置隧道。将/somewhere/to/place/your/files替换为你本地服务器上的实际路径。bashmkdir -p /somewhere/to/place/your/files chmod 777 /somewhere/to/place/your/files
-
接下来,使用 Docker 容器运行
cloudflared。小技巧:将cloudflared设置为 Docker 命令的别名。这非常方便,因为我们会多次使用该命令。我使用的是撰写本文时的最新版本。你可以在 这里 找到你需要的镜像。bashdocker pull cloudflare/cloudflared:1759-f9c2bd51ae24 alias cloudflared="docker run --rm -it -v /somewhere/to/place/your/files:/home/nonroot/.cloudflared cloudflare/cloudflared:1759-f9c2bd51ae24"
-
登录到你的 Cloudflare 账户:
bashcloudflared login你的终端可能会显示如下内容:
在浏览器中打开链接并登录。之后,你应该会在 cloudflared文件夹中看到一个cert.pem文件。 -
使用以下命令创建一个隧道:
bashcloudflared tunnel create YourTunnelName你应该会看到如下结果。复制 ID:
Created tunnel YourTunnelName with id some-random-id-xxxxxxxxxxxx-xxxxx
-
要从公网访问你的本地网络,你需要一个域名,并将其配置为解析到你的隧道。例如,使用
tunnel.test.com。运行以下命令,让 Cloudflare 将域名解析到特定隧道。确保你已拥有test.com的管理权限!bashcloudflared tunnel route dns YourTunnelName tunnel.test.com此命令会创建一个
CNAME记录,将tunnel.test.com指向隧道的域名,通常是:some-random-id-xxxxxxxxxxxx-xxxxx.cfargotunnel.com。 -
现在隧道和 DNS 已设置完成,配置隧道。创建一个
config.yml文件到你的cloudflared文件夹,并复制以下内容:yamltunnel: some-random-id-xxxxxxxxxxxx-xxxxx credentials-file: ~/.cloudflared/some-random-id-xxxxxxxxxxxx-xxxxx.json ingress: - hostname: tunnel.test.com service: http://192.168.1.100:8080 - service: http_status:404
此配置告诉 Cloudflare,当访问
tunnel.test.com时,将请求重定向到http://192.168.1.100:8080。确保你在最后一行包含http_status:404,这是必须的。 -
通过运行以下命令测试你的隧道。访问
tunnel.test.com以验证你是否可以访问本地 Web 服务:bashcloudflared tunnel run YourTunnelName
-
最后,为了更方便地管理隧道,创建一个 Docker Compose 文件。以下是一个示例:
yamlservices: cloudflared: container_name: cloudflare-tunnel image: cloudflare/cloudflared:1759-f9c2bd51ae24 restart: unless-stopped command: tunnel --no-autoupdate run volumes: - /host_data/cloudflared:/home/nonroot/.cloudflared networks: - web
如果你希望暴露运行在容器中的 Web 服务,确保你的隧道和容器处于同一网络。