群晖 openwrt 的docker 部署cloudflared tunnle 实现一个域名可世界访问本地应用

之前通过docker部署 cloudflared tunnle 主要问题是无法进行正确的映射,主要原因是docker 使用了bridge 桥接的方式,让docker内部ip 与内网其他应用的网段不同导致无法映射,这是之前视频中没有使用docker 部署的原因,ubuntu原生系统部署其实相对来说会更简单,问题更少更稳定,但使用docker来说,可以使用的设备更广泛,没有本地linux服务器也能 很普片的使用docker,这次主要就是通过本地非常轻量的 openwrt和群晖 中的docker 来实现映射。

前期准备工作

cloudflare账号 :https://dash.cloudflare.com/

域名:https://www.namesilo.com

finalshell:https://www.hostbuf.com/

优质专线机场:https://jdssl.top/index.php/bluebeiyong/

群晖nas 上的docker部署

第一步:创建配置目录

mkdir -v /volume1/docker/cloudflared
第二步:
获取 cloudflared 授权证书

通过 docker 运行 tunnel login

docker run -it --rm \
-v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest tunnel login
下一步:创建 Cloudflare Tunnel
docker run -it --rm \
-v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest tunnel create myhome

执行后它会返回一个 Tunnel ID(UUID),同时会在你的目录 /volume1/docker/cloudflared 中生成一个 JSON 凭证文件

直接用命令重写 config.yml 内容

下面这个命令会一次性将配置写入正确路径 /volume1/docker/cloudflared/config.yml

cat > /volume1/docker/cloudflared/config.yml <<EOF
tunnel: xxxx-xxxx-xxxx-xxxx-xxxx3026 #填id
credentials-file: /home/nonroot/.cloudflared/xxxx-xxxx-xxxx-xxxx-xxxx3026.json #填写对应的json

ingress:
  - hostname: xxxx.xxx.com #填自己域名
    service: http://192.168.123.3:80 # 替换为你本地服务,例如openwrt

  - hostname: qunhui.xxx.com   # 替换成你实际在 Cloudflare 上管理的域名
    service: http://192.168.123.50:5001  # 替换为你本地服务,例如 群晖
    originRequest:
      noTLSVerify: true  # 群晖自签证书需要跳过验证
  
  - service: http_status:404
EOF
不改属主,仅增加读权限

chmod 644 /volume1/docker/cloudflared/config.yml

你可以给整个目录修改属主:


chown -R 65532:65532 /volume1/docker/cloudflared

运行 cloudflared 容器(使用 host 网络)

docker run -d \
  --name cloudflared \
  --restart unless-stopped \
  --network host \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --config /home/nonroot/.cloudflared/config.yml run

绑定子域名到 tunnel(自动创建 DNS 记录)–多个域名需修改后分别执行

docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel route dns myhome laomaozi1.jdssl.top

清理多余 Tunnel

列出:


docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel list

删除:


docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel delete <tunnel-name>

 

群晖中若以上命令无法删除

执行下方命令

 docker run -d --name cloudflared-temp \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate --origincert /home/nonroot/.cloudflared/cert.pem run myhome

然后等待10秒,执行下方命令

docker rm -f cloudflared-temp

继续执行下方命令

docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --origincert /home/nonroot/.cloudflared/cert.pem cleanup myhome

继续执行下方命令

docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --origincert /home/nonroot/.cloudflared/cert.pem delete myhome

执行下方命令查看是否还有多余的,并检查id是否匹配

docker run -it --rm \
-v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest \
tunnel --origincert /home/nonroot/.cloudflared/cert.pem list
重启容器命令:
docker restart cloudflared
验证是否成功
查看容器日志:
docker logs -f cloudflared
 docker ps | grep cloudflared

如果看到如下类似输出,说明容器已成功后台运行:

e8d945a7573d cloudflare/cloudflared:latest "cloudflared --no-au…" 2 hours ago Up 2 hours cloudflared

openwrt docker安装cloudflare

第一步:准备配置目录

mkdir -p /root/docker/cloudflared

修改宿主机目录权限

chmod 777 /root/docker/cloudflared

或者更安全的做法:


chown -R 65532:65532 /root/docker/cloudflared

65532 是 cloudflared 容器中 nonroot 用户的 UID/GID

第二步:登录 Cloudflare 获取凭证
docker run -it --rm \
-v /root/docker/cloudflared:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest tunnel login

复制并打开 CLI 中给出的 URL,在浏览器中登录并授权你的域名。

第三步:创建 tunnel

docker run -it --rm \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel create myhome

输出中会显示创建成功,并生成一个 .json 凭证文件,注意该 Tunnel ID。


第四步:创建 config.yml 文件
cat > /root/docker/cloudflared/config.yml <<EOF
tunnel: xxxx-xxxx-xxxx-xxxx-xxxx3026 #填id
credentials-file: /home/nonroot/.cloudflared/xxxx-xxxx-xxxx-xxxx-xxxx3026.json #填写对应的json

ingress:
  - hostname: xxxx.xxx.com #填自己域名
    service: <http://192.168.123.3:80> # 替换为你本地服务,例如openwrt

  - hostname: qunhui.xxx.com   # 替换成你实际在 Cloudflare 上管理的域名
    service: <http://192.168.123.50:5001>  # 替换为你本地服务,例如 群晖
    originRequest:
      noTLSVerify: true  # 群晖自签证书需要跳过验证
  
  - service: http_status:404
EOF

第五步:运行 cloudflared 容器(使用 host 网络)

docker run -d \
  --name cloudflared \
  --restart unless-stopped \
  --network host \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --config /home/nonroot/.cloudflared/config.yml run


第六步:绑定子域名到 tunnel(多个域名需修改后分别执行)

docker run -it --rm \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel route dns myhome xxxx.xxxxx.com


验证是否成功

nslookup xxxx.xxxx.com

然后浏览器访问:

openwrt 中多余tunnle 如何查看和删除

一、查看已有 Tunnel 列表

docker run -it --rm \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel list

删除某个多余 Tunnel

<name> 替换为你不需要的 tunnel 名称:


docker run -it --rm \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel delete <name>

例如删除名为 old-tunnel 的:


docker run -it --rm \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel delete old-tunnel

重启容器的方法(SSH 命令行):
docker restart cloudflared

如何删除干净 所有相关 cloudflare

一键删除 Cloudflared 所有内容(适用于 Docker 环境)
假设你使用的是如下路径:

配置与凭证目录:/root/docker/cloudflared 或 /volume1/docker/cloudflared
容器名:cloudflared


步骤一:停止并删除容器

docker rm -f cloudflared


 

步骤二:删除所有 tunnel
检查是否有 cloudflared 的 Docker 容器在运行:
docker ps | grep cloudflared

如果看到如下类似输出:

abc1234567  cloudflare/cloudflared:latest  ...  Up 5 minutes

说明你确实有 tunnel 在运行,使用以下命令停止并删除容器:

docker rm -f abc1234567

或者全部强制杀掉 cloudflared 相关容器:

docker ps -q --filter ancestor=cloudflare/cloudflared | xargs -r docker rm -f

临时运行一次 tunnel,立刻关闭(群晖将下方root改为自己的:volume1)
docker run -d --name cloudflared-temp \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate --origincert /home/nonroot/.cloudflared/cert.pem run myhome

等待 5~10秒 让 Cloudflare 检测到连接,再停止它:

docker rm -f cloudflared-temp


再清理一次(群晖需修改root为volume1)
docker run -it --rm \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --origincert /home/nonroot/.cloudflared/cert.pem cleanup myhome


再次尝试删除(群晖需修改root为volume1)
docker run -it --rm \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --origincert /home/nonroot/.cloudflared/cert.pem delete myhome

运行:(群晖需修改root为volume1)

docker run -it --rm \
-v /root/docker/cloudflared:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest \
tunnel --origincert /home/nonroot/.cloudflared/cert.pem list

然后对每个 tunnel 名执行删除:(群晖需修改root为volume1)


docker run -it --rm \
  -v /root/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel --origincert /home/nonroot/.cloudflared/cert.pem delete myhome

 
步骤三:删除本地配置、凭证、日志文件

opwnwrt执行下方


rm -rf /root/docker/cloudflared

或群晖执行下方:


rm -rf /volume1/docker/cloudflared


步骤四:删除镜像

docker rmi cloudflare/cloudflared:latest


步骤五:登录 Cloudflare 后台,手动删除 DNS 中的 CNAME / AAAA / A 记录

路径:

进入 Cloudflare Dashboard → 选择你的域名 → DNS → 删除 tunnel 对应的 CNAME 子域名,如:


openwrt.yourdomain.com → tunnel.xxx.cfargotunnel.com


 删除验证

可以用以下命令验证是否干净:


docker ps -a | grep cloudflared
docker images | grep cloudflared
ls /root/docker/cloudflared


 

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to Top