简介

适用于:

  • 有公网 IPv4 地址
  • 使用华硕路由器或者其他可以登录 SSH 的路由器或者软路由
  • 准备好了一个域名
  • 光猫设置为桥接模式,路由器使用 PPPOE 拨号

SSH 登录路由器

系统管理 -> 系统设置 -> SSH

选择: 启用 SSH

image

应用设置后,内网通过网关与对应端口进行 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 令牌。

image

image

imageimage

然后保存好 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'
#!/bin/sh
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

# 获取路由器 PPPoE 公网 IPv4
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; }

# 读取 Cloudflare 当前记录
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

# 更新 Cloudflare A 记录
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 分钟就会执行一遍这个脚本。

可以使用:

cru l

来查看当前脚本是否被定期执行。

外网登录 SSH

至此已经完成 DDNS,可以通过外网登录 SSH 来检验:

ssh admin@$YOUR_DOMAIN -p $YOUR_PORT