转自(https://www.pocketdigi.com/20181009/1626.html)
大部分路由器(包括非智能路由)都支持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 脚本内容:
代码语言:txt复制#!/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登录路由器:
代码语言:txt复制ssh root@192.168.0.1
密码需要到小米路由官网找
给ddns脚本增加可执行权限
代码语言:txt复制chmod x /data/ddns
添加定时任务
代码语言:txt复制crontab -e
在末尾添加
代码语言:txt复制* * * * * /data/ddns
大功告成!