简介
适用于:
- 有公网 IPv4 地址
- 使用华硕路由器或者其他可以登录 SSH 的路由器或者软路由
- 准备好了一个域名
- 光猫设置为桥接模式,路由器使用 PPPOE 拨号
SSH 登录路由器
系统管理 -> 系统设置 -> SSH
选择: 启用 SSH

应用设置后,内网通过网关与对应端口进行 SSH 登录。
外网可以通过公网 IP 来进行登录。
比如内网登录:
ssh admin@${your_gateway} -p ${your_port}
|
外网登录:
ssh admin@${your_ip_address} -p ${your_port}
|
配置 Cloudflare
我们通过 Cloudflare API 来更新我们的域名解析地址来实现 DDNS,因此首先需要创建一个 API Token。
在 Cloudflare 中创建一个 API 令牌。




然后保存好 API Token。
获取 ZONE_ID 和 RECORD_ID
想要使用 Cloudflare 来更新域名解析地址,你需要提供:
- 需要更新的域名是哪一个 - 通过 ZONE_ID 来确定
- 需要更新的解析记录是哪一条 - 通过 RECORD_ID 来确定
使用这条命令获取 ZONE_ID:
curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$YOUR_DOMAIN" \ -H "Authorization: Bearer $API_TOKEN" \ -H "Content-Type: application/json"
|
使用这条命令获取 RECORD_ID:
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$YOUR_DOMAIN_RECORD" \ -H "Authorization: Bearer $API_TOKEN" \ -H "Content-Type: application/json"
|
DDNS 脚本
创建脚本:
需要注意的是, 为了这里的API_TOKEN是使用文件形式存储了, 你可以将其更改为脚本中定义
cat > /jffs/scripts/ddns_cf_update.sh <<'EOF'
TOKEN_FILE="/jffs/.cf_api_token" CF_API_TOKEN=$(cat "$TOKEN_FILE") CF_ZONE_ID=$YOUR_ZONE_ID CF_RECORD_ID=$YOUR_RECORE_ID CF_RECORD_NAME=$YOUR_DOMAIN
WAN_IP=$(ifconfig ppp0 | awk '/inet addr/ {split($2,a,":"); print a[2]}') echo "WAN_IP = $WAN_IP"
[ -n "$WAN_IP" ] || { echo "Error: WAN_IP empty, exiting."; exit 1; }
CURRENT_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_RECORD_ID}" \ -H "Authorization: Bearer ${CF_API_TOKEN}" \ -H "Content-Type: application/json" | sed -n 's/.*\"content\":\"\\([^\"]*\\)\".*/\\1/p')
echo "Current Cloudflare IP = $CURRENT_IP"
if [ "$CURRENT_IP" = "$WAN_IP" ]; then echo "IP has not changed. Nothing to update." exit 0 fi
RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_RECORD_ID}" \ -H "Authorization: Bearer ${CF_API_TOKEN}" \ -H "Content-Type: application/json" \ --data "{\"type\":\"A\",\"name\":\"${CF_RECORD_NAME}\",\"content\":\"${WAN_IP}\",\"ttl\":120,\"proxied\":false}")
echo "Cloudflare response: $RESPONSE"
echo "$RESPONSE" | grep -q '"success":true' && echo "$(date -u +'%Y-%m-%d %H:%M:%S') Updated ${CF_RECORD_NAME} -> ${WAN_IP}" && exit 0 echo "$(date -u +'%Y-%m-%d %H:%M:%S') FAILED update" >&2 exit 2 EOF
|
设置执行权限:
chmod 700 /jffs/scripts/ddns_cf_update.sh
|
测试脚本:
sh /jffs/scripts/ddns_cf_update.sh
|
查看输出是否正确,也可以在 Cloudflare 中查看域名解析地址是否已经更新。
然后添加 cron 自动更新:
cru a ddns_cf_update "*/5 * * * * /jffs/scripts/ddns_cf_update.sh"
|
这样每 5 分钟就会执行一遍这个脚本。
可以使用:
来查看当前脚本是否被定期执行。
外网登录 SSH
至此已经完成 DDNS,可以通过外网登录 SSH 来检验:
ssh admin@$YOUR_DOMAIN -p $YOUR_PORT
|