
Twitter API Key 的 OAuth 認證與授權(quán)機制
example.com
設(shè)置權(quán)限:
CF_API_TOKEN
> 長尾關(guān)鍵詞:Cloudflare API Token 最小權(quán)限、Cloudflare DNS 權(quán)限配置
在 Cloudflare 的 API 調(diào)用中,管理 DNS 記錄需要兩個重要參數(shù):
zone_id
:你的域名在 Cloudflare 的唯一標識record_id
:DNS 記錄的唯一 IDcurl -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json"
curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?name=sub.example.com" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json"
> 相關(guān)關(guān)鍵詞:Cloudflare DNS record ID 獲取、zone id 查詢方式
以下 Bash 腳本支持自動檢測公網(wǎng) IP 并更新 DNS A 記錄,適合用于 DDNS 或開發(fā)測試環(huán)境的動態(tài)綁定。
#!/bin/bash
CF_API_TOKEN="your_api_token"
ZONE_ID="your_zone_id"
RECORD_NAME="home.example.com"
RECORD_TYPE="A"
# 獲取當前公網(wǎng) IP
IP=$(curl -s https://api.ipify.org)
# 獲取 record ID
RECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?type=$RECORD_TYPE&name=$RECORD_NAME" \
-H "Authorization: Bearer $CF_API_TOKEN" | jq -r '.result[0].id')
# 獲取記錄當前值
OLD_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $CF_API_TOKEN" | jq -r '.result.content')
# 判斷是否需要更新
if [ "$IP" != "$OLD_IP" ]; then
echo "Updating $RECORD_NAME: $OLD_IP → $IP"
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"$RECORD_TYPE\",\"name\":\"$RECORD_NAME\",\"content\":\"$IP\",\"ttl\":120}"
else
echo "IP address unchanged."
fi
> 長尾關(guān)鍵詞:Cloudflare DDNS 腳本、動態(tài) A 記錄更新、Shell 自動同步 DNS
如果需要更好的結(jié)構(gòu)與異常處理,可以使用 Python 腳本:
import os, requests
API_TOKEN = os.getenv("CF_API_TOKEN")
ZONE_ID = os.getenv("CF_ZONE_ID")
RECORD_NAME = "dev.example.com"
def get_public_ip():
return requests.get("https://api.ipify.org").text.strip()
def get_record_id():
url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records?name={RECORD_NAME}"
headers = {"Authorization": f"Bearer {API_TOKEN}"}
response = requests.get(url, headers=headers).json()
return response["result"][0]["id"], response["result"][0]["content"]
def update_record(record_id, new_ip):
url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{record_id}"
data = {
"type": "A",
"name": RECORD_NAME,
"content": new_ip,
"ttl": 120
}
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
response = requests.put(url, headers=headers, json=data)
return response.json()
if __name__ == "__main__":
ip = get_public_ip()
record_id, old_ip = get_record_id()
if ip != old_ip:
print(f"IP changed: {old_ip} → {ip}")
update_record(record_id, ip)
else:
print("No IP change.")
> 關(guān)鍵詞擴展:Python 自動化 DNS 管理、Cloudflare Python API 示例、動態(tài) DNS 實現(xiàn)方式
結(jié)合 GitOps 與 Infrastructure as Code,我們可以在代碼變更時自動修改 DNS 配置:
name: Update Cloudflare DNS
on:
push:
branches:
- main
jobs:
update_dns:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Update DNS record
run: |
curl -X PUT "https://api.cloudflare.com/client/v4/zones/${{ secrets.CF_ZONE_ID }}/dns_records/${{ secrets.CF_RECORD_ID }}" \
-H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" \
-H "Content-Type: application/json" \
--data '{"type":"A","name":"prod.example.com","content":"1.2.3.4","ttl":120}'
> 長尾關(guān)鍵詞:GitHub Actions 自動修改 DNS、Cloudflare CI 自動化、DNS 記錄 GitOps 管理
Terraform 支持 Cloudflare Provider,推薦用于管理多個域名與環(huán)境的 DNS 配置:
provider "cloudflare" {
api_token = var.cf_api_token
}
resource "cloudflare_record" "dev_a" {
zone_id = var.zone_id
name = "dev"
value = var.ip
type = "A"
ttl = 120
}
執(zhí)行:
terraform init
terraform apply
> 擴展關(guān)鍵詞:Terraform Cloudflare DNS 配置、IaC 自動化 DNS 管理、Cloudflare DevOps 工具集成
問題 | 解決方式 |
---|---|
403 Forbidden,API 無權(quán)限 | 檢查 Token 權(quán)限是否包含 DNS Edit |
API 調(diào)用成功但記錄未更新 | 檢查是否使用了正確的 record_id |
TTL 設(shè)置后無效 | 最低 120 秒,無法設(shè)置為 0 |
多記錄沖突 | 指定唯一的 name 和 type |
動態(tài) IP 變更后未同步 | 腳本未設(shè)置定時任務(wù),請結(jié)合 cron 或 systemd 定時運行 |
通過本文你已掌握:
?? 推薦實踐:
原文引自YouTube視頻: