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)

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