0%

openwrt路由器(小米路由)实现自定义DDNS(动态域名解析)

大部分路由器(包括非智能路由)都支持ddns,一般是集成花生壳、公云等有限的几家服务商。直接使用路由器集成的ddns功能,优点是简单,缺点就是慢。因为DDNS都是用服务商提供的域名,如果要使用我们自己的域名,需要cname到服务商的域名,这里就存在二次解析,更别说免费DDNS本身速度慢了。 现在的智能路由器都是基于linux的,我们完全可以写一个脚本检测外网ip,在路由器外网ip变化时,去DNS服务提供商直接更改dns设置新的IP,实现DDNS功能。 准备环境:

  • 路由器:小米路由3G 需root,否则登不上ssh, ip 192.168.0.1
  • DNS服务商:dnspod

理论上所有openwrt路由都支持,因为下面的脚本没用到小米路由的特性,都是linux上的命令,但我没有测其他路由器。 dnspod开放了api,可以调接口更新记录,现在已经被腾讯收购,也可以用腾讯的api,但腾讯的api比较复杂,反正我没调通。其他的像阿里云也开放了云解析接口,有需要的同学可以自己研究。 重点不在脚本,而在于思路:

  • linux 定时任务,每分钟执行一次脚本
  • 脚本访问外网指定服务器,获取当前外网ip地址,比较上次获取的外网ip地址,如果不一致,则调dns系统的api更新记录

ddns 脚本内容:

#!/bin/sh
oldIPFile=/tmp/oldip.txt
login_token=xxxxxxx
domain=pocketdigi.com
record_id=xxxxxxx
sub_domain=test

updateIp(){
  result=$(curl -s -d "login_token=$login_token&format=json&domain=$domain&record_id=$record_id&sub_domain=$sub_domain&value=$myip&record_type=A&record_line=默认" https://dnsapi.cn/Record.Modify)
  grepResult=$(echo $result | grep "\"code\":\"1\"")
  if [[ "$grepResult" != "" ]]
   then
       echo '更新成功'
       echo "$myip" > $oldIPFile
   else
       echo '更新失败'
  fi
}

myip=$(curl -s http://myip.dnsomatic.com/)
echo "当前ip:$myip"


if [ ! -f "$oldIPFile" ]; then
  echo "文件不存在,更新"
  updateIp;
else
  oldip=$(cat $oldIPFile)
  echo "旧IP:$oldip"
  if [ "$myip" = "$oldip" ]; then
    echo "当前IP与旧IP相同,不更新"
  else
    echo "当前IP与旧IP不同,更新"
    updateIp
  fi
fi

login_token需要登录dnspod获取,record_id可以使用chrome,在dnspod后台编辑保存那条记录时抓包找到。 使用scp将脚本拷到路由器上的/data目录,小米路由很多目录是只读的,写不进去 ssh登录路由器:

ssh root@192.168.0.1

密码需要到小米路由官网找 给ddns脚本增加可执行权限

chmod +x /data/ddns

添加定时任务

crontab -e

在末尾添加

* * * * * /data/ddns

大功告成!