给linux设备ipv6公网地址做cloudflare ddns 作者: 毕世平 时间: 2024-10-07 分类: 默认分类 前言:关于`cloudflare ddns`的教程,网上大多是直接使用`global api key`这一权限较大的令牌,虽然说这个令牌可以随时更改,但用起来总有那么点不顺手。 于是,在求助群友,搜阅教程,然后多番尝试后,脚本内使用`api_token`区域令牌来更新设备公网IPv6地址到cloudflare解析后台设置成功。这里记录下使用方法,以备后续查用。 条件准备: - 注册好cloudflare邮箱,并正确添加好域名 - 创建了区域API令牌,参考这里: https://shiping.date/82.html ## 1. 准备必要数据 具体准备过程不再赘述。假定你已经准备好了上述所有必要条件,那么现在可以开始了,假如你准备好的数据如下: # cloudflare邮箱地址如下: X-Auth-Email信息:"abc@gmail.com" # 域名信息如下: MY_DOMAIN="ddnsv6.example.com" # 域名,区域ID信息如下: ZONE_ID="aaaaaaaaaa" # 自定义添加的api token令牌信息如下: API_TOKEN="bbbbbbbbbb" ## 2. 获取RECORD_ID值 操作前,需要先在cloudflare控制台手动添加一条记录,比如是一条`AAAA`记录,然后名称是`ddnsv6`,对应完整的域名就是`ddnsv6.example.com`,记录值是`abcd::1234`,不要打开网站代理,保持云朵灰色,然后点击保存。 然后执行下面命令,获取你手动添加的这条记录对应的ID(只要你不主动删除这条解析记录,更改名称或者记录值都不会更改这个ID): # 上面第一步已经获取了区域ID,邮箱地址,还有自己添加的api_token地址 ZONE_ID="aaaaaaaaaa" X-Auth-Email信息:"abc@gmail.com" API_TOKEN="bbbbbbbbbb" # 执行下面命令,代入上面三个数据,进行查询 curl -w "\n" --request GET \ --url https://api.cloudflare.com/client/v4/zones/这里填ZONE_ID信息/dns_records \ --header 'Content-Type: application/json' \ --header 'X-Auth-Email: 这里填你的cloudflare注册邮箱地址' \ --header "Authorization: Bearer 这里填自己添加的API_TOKEN" 然后,从返回值里找到你添加的那条`AAAA`记录,也就是`ddnsv6.example.com`对应的`id`值,记录下来,假定是`RECORD_ID="ccccccccccc"`,方便第三步脚本使用。 ## 3. 配置ddns脚本 上面必要的数据已经准备好,下面就是把他们添加进脚本里,可给脚本取名`update_ip.sh`: #!/bin/bash # 更新するドメイン # 要更新的域名,比如ddnsv6.example.com MY_DOMAIN="ddnsv6.example.com" # API アクセス情報 # 这里填写你的API相关信息,RECORD_ID需要先在cloudflare控制后台添加一条ipv4/ipv6的记录,然后用第2步的命令获取 ZONE_ID="aaaaaaaaaa" RECORD_ID="ccccccccccc" AUTH_EMAIL="abc@gmail.com" API_TOKEN="bbbbbbbbbb" # IPアドレス取得サービスのリスト # IP地址获取服务列表 services=( "https://ifconfig.co" "http://ip.sb" "http://v6.ipv6-test.com/api/myip.php" # "https://api.ipify.org/" # "https://checkip.amazonaws.com/" # "https://ipv4.icanhazip.com/" # "https://4.icanhazip.com/" ) ip_address="" # IPアドレスを取得する関数 # 获取IP地址的函数 get_ip_address() { local url="$1" ip_address=$(curl -s "$url") } # IPアドレスの正規表現パターン # IP 地址的正则表达式模式 # ip_pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$" #IPv4 ip_pattern="^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::([0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4})$" #IPv6 # 正規表現でIPアドレスが検証できるかチェック # 检查是否可以使用正则表达式验证IP地址 is_valid_ip() { [[ $ip_address =~ $ip_pattern ]] } # IPアドレス取得のループ # IP地址获取循环 for service in "${services[@]}"; do get_ip_address "$service" if is_valid_ip; then break fi done # ipアドレス更新テスト #ip地址更新测试 # ip_address = 8.8.8.8 # CloudFlare API Aレコード更新 # CloudFlare API AAAA记录更新 curl --request PUT \ --url https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID \ --header 'Content-Type: application/json' \ --header "X-Auth-Email: $AUTH_EMAIL" \ --header "Authorization: Bearer $API_TOKEN" \ --data '{ "content": "'"$ip_address"'", "name": "'"$MY_DOMAIN"'", "proxied": false, "type": "AAAA", "comment": "Domain verification record" }' > /home/user/ip.log **说明**:脚本尾部的`> /home/user/ip.log`是把每次curl命令的返回值写入这个`ip.log`文件里了,具体路径可根据实际情况再修改。 然后就是添加定时任务了,让它每十分钟自动执行一次,如果ipv6地址发生变化了,它会自动同步到`cloudflare`后台去。 # 创建定时任务,每10分钟执行一次 crontab -e */10 * * * * bash /home/user/update_ip.sh # 查看定时任务 crontab -l 更新最新的设备ipv6公网地址后,如果是家庭网络环境下,可能还需要在网关端防火墙进行放行。最后,感谢各位群友的帮助,如果有什么问题欢迎留言指正。 参考链接: - [【CloudFlare】動的IPアドレスをAPIで自動更新する。DDNS](https://qiita.com/napspans/items/455103748f3a0dd7ee18 "【CloudFlare】動的IPアドレスをAPIで自動更新する。DDNS") 标签: none