RouterOS(ros)软路由利用脚本与调度器实现DNSPOD动态域名解析
1. 什么是DDNS及其应用场景动态域名解析DDNS对于家庭宽带用户来说是个非常实用的功能。简单来说它就像给你的家庭网络装了个智能门牌——即使你的公网IP地址经常变化别人也能通过固定的域名找到你。我家里用这个功能已经三年多了实测下来特别适合以下几种场景远程访问NAS我经常出差时需要调取家里的监控录像搭建个人服务器去年用树莓派搭建的智能家居控制中心游戏联机和朋友玩Minecraft时不用每次更换IP传统DNS有个致命缺陷它只能解析固定IP。但国内家庭宽带99%都是动态IP除了专线。我实测过电信宽带平均3天换一次IP移动宽带甚至每天都会变。这就是为什么需要DDNS技术——它通过定期检测并更新IP与域名的绑定关系解决了动态IP的寻址问题。2. DNSPod API准备工作2.1 获取DNSPod API密钥在开始配置前我们需要先在DNSPod平台获取API凭证。这里有个坑我踩过千万不要用主账号的API密钥建议按照以下步骤操作登录 DNSPod控制台进入账号中心 → API密钥点击创建密钥建议命名为RouterOS_DDNS记录下ID和Token格式为ID,Token注意Token只显示一次务必立即保存。我有次忘记保存不得不重新创建。2.2 域名解析设置确保你的域名已经在DNSPod托管。我以example.com为例添加A记录比如主机记录www记录值随便填个IP后续脚本会自动更新TTL建议设60秒3. RouterOS脚本编写3.1 创建DDNS脚本通过Winbox登录RouterOS按以下步骤操作进入System→Scripts点击新建脚本命名为dnspod-ddns粘贴以下代码关键参数需要修改# PPPoE接口名称 :local pppoe pppoe-out1 # DNSPod的ID和Token :local token 123456,abcdefghijklmnopqrstuvwxyz123456 # 主域名和子域名 :local domain example.com :local subdomain www # 以下代码无需修改 :local dname ($subdomain...$domain) :local ipaddr [/ip address get [/ip address find interface$pppoe] address] :set ipaddr [:pick $ipaddr 0 ([len $ipaddr] -3)] # 获取记录列表 :local record [/tool fetch urlhttps://dnsapi.cn/Record.List \ http-datalogin_token$tokenformatjsondomain$domainsub_domain$subdomainrecord_typeA \ as-value outputuser] # 提取记录ID和IP :set record ($record-data) :set record [:pick $record [:find $record \records\:] [:len $record]] :local recordid [:pick $record ([:find $record \id\:\]6) [:find $record \,\ttl\]] :local recordip [:pick $record ([:find $record \value\:\]9) [:find $record \,\en]] # 比较并更新IP :if ($recordip!$ipaddr) do{ /tool fetch urlhttps://dnsapi.cn/Record.Ddns \ http-datalogin_token$tokenformatjsondomain$domainsub_domain$subdomainrecord_id$recordidrecord_line_id0value$ipaddr :log info ([.$dname.] IP已更新为.$ipaddr) } else{ :log info ([.$dname.] IP未变化) }3.2 脚本参数详解这段脚本的工作原理是这样的首先获取PPPoE接口的当前公网IP通过DNSPod API查询现有解析记录比较当前IP与解析记录是否一致不一致时触发更新有几次我的脚本失效排查发现是这些原因Token过期现在设置成永不过期网络波动导致API请求超时加了重试机制子域名填写错误注意不要带主域名4. 配置定时任务4.1 创建调度器脚本需要定期执行才能保持IP同步进入System→Scheduler新建任务参数如下Name:DDNS-UpdateInterval:00:05:00(每5分钟)On Event:/system script run dnspod-ddns实际使用中发现1分钟间隔太短5分钟既能保证及时性又不会给DNSPod服务器造成压力4.2 日志监控调试阶段建议查看执行日志进入Log→Script筛选包含dnspod的条目正常情况应该看到类似这样的记录[www.example.com] IP已更新为1.2.3.4 [www.example.com] IP未变化5. 高级配置技巧5.1 多域名配置如果你有多个子域名需要解析比如www.example.comhome.example.comnas.example.com可以这样修改脚本:local domains { www; home; nas } :foreach sub in$domains do{ :local record [/tool fetch urlhttps://dnsapi.cn/Record.List \ http-datalogin_token$tokenformatjsondomain$domainsub_domain$subrecord_typeA \ as-value outputuser] # 后续处理逻辑... }5.2 IPv6支持现在很多地区已经普及IPv6可以添加双栈解析# IPv6记录更新 :local ipv6addr [/ipv6 address get [/ipv6 address find interface$pppoe] address] :set ipv6addr [:pick $ipv6addr 0 [:find $ipv6addr /]] /tool fetch urlhttps://dnsapi.cn/Record.Modify \ http-datalogin_token$tokenformatjsondomain$domainrecord_id12345678sub_domain$subdomainrecord_typeAAAAvalue$ipv6addr6. 常见问题排查问题1脚本执行但IP不更新检查PPPoE接口名称是否正确手动运行/interface pppoe-client monitor pppoe-out1查看真实IP测试API连通性/tool fetch urlhttps://dnsapi.cn/Record.List问题2证书错误如果是RouterOS v7版本出现TLS错误需要/tool fetch urlhttps://dnsapi.cn dst-pathdnspod.pem /certificate import file-namednspod.pem passphrase /certificate set dnspod.pem trustedyes问题3日志显示权限拒绝确保API Token有足够权限需要Record.List和Record.Modify权限如果是子账号需要主账号在权限管理中授权经过半年多的实际使用这个方案在RouterOS v6和v7上都能稳定运行。唯一遇到的问题是运营商每30天会强制重拨一次PPPoE导致IP变更。后来我在凌晨设置了自动重拨脚本完美避开了这个问题