1) Cloudflare DDNS
目標:用最小權限的 Cloudflare API Token,定期把外網 IP 同步到指定 A(選配 AAAA)紀錄。
1.1 後台 9 步驟
- 進入 User API Tokens → Create Token。
- 選模板:Edit zone DNS(Use template)。
- 權限最小化:
Zone→DNS: Edit
+Zone→DNS: Read
;範圍鎖定 你的 Zone。 - 確認摘要 → Create Token,複製 Token(僅顯示一次)。
- 回到 Account home → 進入你的 Zone(如 fachost.cloud)。
- 在 Overview 右側複製 Zone ID。
- DNS → Records → Add record,新增 A 記錄並儲存。
1.2 Linux 部署(含排程)
sudo apt update
sudo apt install -y curl jq
sudo tee /etc/cf-ddns.env >/dev/null <<'EOF'
CF_API_TOKEN=你的_token
ZONE_ID=你的_zone_id
RECORDS="vds.fachost.cloud"
PROXIED=false
TTL=120
ENABLE_IPV6=false
LOG_FILE=/var/log/cf-ddns.log
EOF
sudo chmod 600 /etc/cf-ddns.env
sudo tee /usr/local/bin/cf-ddns.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
source /etc/cf-ddns.env
AUTH=(-H "Authorization: Bearer ${CF_API_TOKEN}" -H "Content-Type: application/json")
API="https://api.cloudflare.com/client/v4"
log(){ echo "[$(date '+%F %T')] $*"; }
get_ipv4(){ ip=$(curl -4s https://1.1.1.1/cdn-cgi/trace | awk -F= '/^ip=/{print $2}') || true; [[ -z "${ip:-}" ]] && ip=$(curl -4s https://api.ipify.org || true); echo "${ip:-}"; }
get_ipv6(){ curl -6s https://api64.ipify.org || true; }
cf_get(){ curl -s "${AUTH[@]}" "${API}/zones/${ZONE_ID}/dns_records?type=$1&name=$2"; }
cf_apply(){ local t="$1" n="$2" v="$3" rec id old data
rec="$(cf_get "$t" "$n")"; id="$(jq -r '.result[0].id // empty' <<<"$rec")"
old="$(jq -r '.result[0].content // empty' <<<"$rec")"
[[ -n "$old" && "$old" == "$v" ]] && { log "$t $n 已是 $v"; return; }
data="$(jq -nc --arg t "$t" --arg n "$n" --arg c "$v" --argjson p ${PROXIED} --argjson ttl ${TTL} '{type:$t,name:$n,content:$c,proxied:$p,ttl:$ttl}')"
[[ -n "$id" ]] && curl -s -X PUT "${AUTH[@]}" "${API}/zones/${ZONE_ID}/dns_records/$id" --data "$data" || \
curl -s -X POST "${AUTH[@]}" "${API}/zones/${ZONE_ID}/dns_records" --data "$data"
}
ip4="$(get_ipv4)"; [[ -z "$ip4" ]] && { log '取 IPv4 失敗'; exit 1; }
cf_apply A "vds.fachost.cloud" "$ip4"
echo "$(date '+%F %T') OK" >> "$LOG_FILE"
EOF
sudo chmod +x /usr/local/bin/cf-ddns.sh
# systemd 每 5 分鐘
sudo tee /etc/systemd/system/cf-ddns.timer >/dev/null <<'EOF'
[Unit] Description=CF DDNS timer
[Timer] OnBootSec=30s OnUnitActiveSec=5min Persistent=true
[Install] WantedBy=timers.target
EOF
sudo tee /etc/systemd/system/cf-ddns.service >/dev/null <<'EOF'
[Unit] Description=CF DDNS service
[Service] Type=oneshot ExecStart=/usr/local/bin/cf-ddns.sh
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now cf-ddns.timer