之前通过docker部署 cloudflared tunnle 主要问题是无法进行正确的映射,主要原因是docker 使用了bridge 桥接的方式,让docker内部ip 与内网其他应用的网段不同导致无法映射,这是之前视频中没有使用docker 部署的原因,ubuntu原生系统部署其实相对来说会更简单,问题更少更稳定,但使用docker来说,可以使用的设备更广泛,没有本地linux服务器也能 很普片的使用docker,这次主要就是通过本地非常轻量的 openwrt和群晖 中的docker 来实现映射。
群晖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),同时会在你的目录 /
中生成一个 JSON 凭证文件volume1
/docker/cloudflared
直接用命令重写 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