#!/bin/bash # 诊断 cloudflared tunnel create 报 unauthorized 的原因。 # # cert.pem 是新格式(-----BEGIN ARGO TUNNEL TOKEN-----), # 里面是个 JWT 风格的 token。解出来看看它带了什么权限。 set -u CF_DIR=/root/.cloudflared CERT="$CF_DIR/cert.pem" echo "===== 1. cert.pem 基本信息 =====" ls -la "$CF_DIR" | sed 's/^/ /' echo " 大小: $(stat -c %s "$CERT") 字节" echo " 改于: $(stat -c %y "$CERT")" echo " 现在: $(date '+%Y-%m-%d %H:%M:%S')" echo echo "===== 2. 解开 token 看内容 =====" # 去掉头尾标记,取中间那段 base64 BODY=$(sed -n '/BEGIN ARGO TUNNEL TOKEN/,/END ARGO TUNNEL TOKEN/p' "$CERT" | grep -v 'BEGIN\|END' | tr -d '\n') if [ -n "$BODY" ]; then echo " token 长度: ${#BODY}" # 补 padding PAD=$(( (4 - ${#BODY} % 4) % 4 )) for _ in $(seq 1 $PAD); do BODY="${BODY}="; done echo " 解出来的内容:" echo "$BODY" | base64 -d 2>/dev/null | sed 's/^/ /' || echo " (解不开)" else echo " 没找到 token 正文" head -3 "$CERT" | sed 's/^/ /' fi echo echo "===== 3. cloudflared 认得这个证书吗 =====" echo " tunnel list:" timeout 30 cloudflared tunnel list 2>&1 | head -6 | sed 's/^/ /' echo echo "===== 4. 直接建隧道看完整报错 =====" timeout 30 cloudflared tunnel create lanremote 2>&1 | head -8 | sed 's/^/ /' echo echo "===== 5. api.cloudflare.com 通不通(建隧道要调它)=====" echo " 解析: $(getent ahostsv4 api.cloudflare.com | head -1 | awk '{print $1}')" C=$(timeout 12 curl -4 -s -o /dev/null -w '%{http_code}' https://api.cloudflare.com/client/v4/user 2>/dev/null) echo " HTTP: ${C:-超时}" echo echo "===== 6. cloudflared 版本 =====" cloudflared --version echo echo "===== 7. cloudflared 自己的日志有没有更多线索 =====" ls -la /root/.cloudflared/*.log 2>/dev/null | sed 's/^/ /' || echo " (没有日志文件)"