Last active 1 year ago

根据给定 IPv4 和端口生成 IP4P 格式并更新 Cloudflare AAAA 记录(用于 Lucky STUN 内网穿透脚本),关于 IP4P 格式详见:[NATMap - FAQ -域名访问是如何实现的?](https://github.com/heiher/natmap/wiki/faq#%E5%9F%9F%E5%90%8D%E8%AE%BF%E9%97%AE%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84)

Revision 26274e37db3904e3bfe84158013a1ab69fa2a44b

ip4p_cloudflare.sh Raw
1# 配置变量
2ZONE=''
3RECORD=''
4EMAIL=''
5TOKEN=''
6MAX_RETRIES=5 # 最大重试次数
7RETRY_INTERVAL_MS=1500 # 重试间隔时间(毫秒)
8SUCCESS_STRING='"success":true' # 接口调用成功时响应应包含的字符串
9
10# 代理配置
11USE_PROXY=false # 是否使用代理
12PROXY_TYPE='' # 代理类型 ('http' 或 'socks5')
13PROXY_URL='' # 代理 URL
14PROXY_USER='' # 代理用户名(如果不需要认证则留空)
15PROXY_PASS='' # 代理密码(如果不需要认证则留空)
16
17# 提取 IPv4 地址的各个八位段
18ip_oct1=$(echo "${ip}" | cut -d'.' -f1)
19ip_oct2=$(echo "${ip}" | cut -d'.' -f2)
20ip_oct3=$(echo "${ip}" | cut -d'.' -f3)
21ip_oct4=$(echo "${ip}" | cut -d'.' -f4)
22
23# 计算 IP4P 地址的各个部分
24ip_hex_hi=$(printf '%02x%02x' "$ip_oct1" "$ip_oct2")
25ip_hex_lo=$(printf '%02x%02x' "$ip_oct3" "$ip_oct4")
26port_hex=$(printf '%04x' "${port}")
27
28# 构造 IP4P 地址
29ip4p="2001::${port_hex}:${ip_hex_hi}:${ip_hex_lo}"
30echo "Generated IP4P Address: $ip4p"
31
32# 初始化重试计数器
33retry_count=0
34
35# 重试循环
36while true; do
37 # 根据 USE_PROXY 和 PROXY_TYPE 变量决定使用的代理选项
38 if [ "$USE_PROXY" = true ]; then
39 auth=""
40 if [ -n "$PROXY_USER" ]; then
41 auth="$PROXY_USER"
42 fi
43 if [ -n "$PROXY_PASS" ]; then
44 if [ -n "$auth" ]; then
45 auth="$auth:$PROXY_PASS"
46 else
47 auth="$PROXY_PASS"
48 fi
49 fi
50
51 case "$PROXY_TYPE" in
52 http)
53 proxy_option="--proxy http://$auth@$PROXY_URL"
54 ;;
55 socks5)
56 if [ -n "$auth" ]; then
57 proxy_option="--socks5 $PROXY_URL --proxy-user $auth"
58 else
59 proxy_option="--socks5 $PROXY_URL"
60 fi
61 ;;
62 *)
63 echo "Unsupported proxy type: $PROXY_TYPE"
64 exit 1
65 ;;
66 esac
67 else
68 proxy_option=""
69 fi
70
71 # 发送请求并获取响应
72 response=$(curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE}/dns_records/${RECORD}" \
73 -H "X-Auth-Email: ${EMAIL}" \
74 -H "Authorization: Bearer ${TOKEN}" \
75 -H "Content-Type:application/json" \
76 --data "{\"data\":{\"content\":\"${ip4p}\"}}" $proxy_option)
77
78 # 检查响应中是否包含成功字符串
79 if echo "$response" | grep -q "$SUCCESS_STRING"; then
80 echo "Successfully updated DNS record."
81 break
82 else
83 echo "Failed to update DNS record. Response: $response"
84 retry_count=$((retry_count + 1))
85 if [ "$retry_count" -ge "$MAX_RETRIES" ]; then
86 echo "Reached maximum retry limit. Exiting."
87 break
88 fi
89 echo "Retrying... ($retry_count/$MAX_RETRIES)"
90 sleep "$(echo "scale=3; $RETRY_INTERVAL_MS / 1000" | bc)"
91 fi
92done