NAT型VPS部署Cloudfare DDNS服务

前言

昨天Lamhosting上了台湾HiNet NAT的VPS,看到是HiNet家宽而且¥9.9/m,使用中秋优惠码后打8折约$1/m就很心动买了,也是第一次玩 NAT VPS。因为这个VPS是动态IP,所以IP经常变化,连接VPS和搭建节点都非常不方便。故使用DDNS将设备与域名绑定起来方便使用。

🗃️搭建环境及依赖

  • ✅ Debian 12.6
  • curl
  • cron

🔩配置 DDNS 服务

获取 Cloudflare 的 API Token

  • 登录到Cloudflare
  • 点击右上角人像,并选择点击我的个人资料
  • { } API令牌下,点击创建令牌
  • API 令牌模板中找到编辑区域 DNS,点击使用此模板
  • 找到区域资源,在select选择到自己的域名,然后点击继续以显示摘要->创建令牌来保存
  • 记录API令牌及测试令牌命令,尝试运行测试命令
1#测试令牌命令
2curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
3-H "Authorization: Bearer API令牌" \
4-H "Content-Type:application/json"

测试命令运行后返回This API Token is valid and active即令牌有效

1{"result":{"id":"XXXX","status":"active"},"success":true,"errors":[],"messages":[{"code":10000,"message":"This API Token is valid and active","type":null}]}

VPS 上安装必要的依赖

确保 VPS 上安装了curl工具。如果没有,使用以下命令安装:

1sudo apt update
2sudo apt install curl

编写 DDNS 更新脚本

新建一个脚本(例如cloudflare-ddns.sh),内容如下:

 1#!/bin/bash
 2
 3# Cloudflare API 信息
 4CF_API_TOKEN="你的 Cloudflare API Token"
 5ZONE_ID="你的 Cloudflare 域名 Zone ID"
 6RECORD_ID="你的 DNS 记录 ID"
 7RECORD_NAME="你所绑定的子域名"
 8IP=$(curl -s http://checkip.amazonaws.com)
 9
10# 更新 DNS 记录
11curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" \
12     -H "Authorization: Bearer ${CF_API_TOKEN}" \
13     -H "Content-Type: application/json" \
14     --data "{\"type\":\"A\",\"name\":\"${RECORD_NAME}\",\"content\":\"${IP}\",\"ttl\":120,\"proxied\":false}"
  • CF_API_TOKEN:你在 Cloudflare 创建的 API Token。
  • ZONE_ID:在 Cloudflare 中找到的 Zone ID。
  • RECORD_ID:你要更新的 DNS 记录的 ID。
  • RECORD_NAME:要更新的域名,例如example.comsub.example.com
  • IP:获取当前外网 IP 的方式。

获取ZONE IDRECORD ID

1# 获取 Zone ID
2curl -X GET "https://api.cloudflare.com/client/v4/zones?name=你的一级域名" \
3     -H "Authorization: Bearer ${CF_API_TOKEN}" \
4     -H "Content-Type: application/json"
5
6# 获取 DNS 记录 ID
7curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?name=${RECORD_NAME}" \
8     -H "Authorization: Bearer ${CF_API_TOKEN}" \
9     -H "Content-Type: application/json"

获取到的ZONE IDRECORD ID填入到cloudflare-ddns.sh脚本中

cloudflare-ddns.sh设置定时任务自动更新

安装cron

使用以下命令安装cron

1sudo apt update
2sudo apt install cron

启动并启用cron服务

安装完成后,启动cron服务并确保它在系统启动时自动运行

1sudo systemctl start cron
2sudo systemctl enable cron

检查cron是否正在运行:

1sudo systemctl status cron 

编辑 crontab 来设置定时任务:

1crontab -e

添加以下行,每 5 分钟更新一次 DNS 记录:

1*/5 * * * * /path/to/cloudflare-ddns.sh >/dev/null 2>&1

/path/to/cloudflare-ddns.sh替换为你脚本的实际路径。

这样 DDNS 服务就配置好了,可以在cloudflare-ddns.sh的目录下运行该脚本

1{"result":{"id":"XXXX","zone_id":"XXXX","zone_name":"一级域名","name":"所绑定的子域名","type":"A","content":"ip地址","proxiable":true,"proxied":false,"ttl":120,"settings":{},"meta":{"auto_added":false,"managed_by_apps":false,"managed_by_argo_tunnel":false},"comment":null,"tags":[],"created_on":"2024-08-27T06:06:31.022794Z","modified_on":"2024-09-17T15:28:34.627094Z"},"success":true,"errors":[],"messages":[]}

出现如上的提示,即更新脚本配置正确

使用 Hugo 构建
主题 StackJimmy 设计