Openwrt基于ipv6更新DNS的cloudflare_shell脚本

最近折腾了一下内网穿透,发现如果有ipv6的话,防火墙开启相应端口,可以直接从外面用ipv6访问内网服务器,虽然省去了ipv4的端口转发等麻烦事儿,但是ipv6还是经常变动的,所以搞了个免费域名,在cloudflare托管了。然后在路由器用shell 写一个更新dns的脚本,定时运行,更新托管的域名对应设备的最新ipv6地址,就可以在外面随时访问路由器管理luci界面了,下面贴一下脚本,做个备份,方便不时之需。

如果你也有同样的需求,可以参考一下,要修改的地方我都注释了,要用这个脚本,前提是你得有一个域名,最好对应的ssl也申请了,因为把路由器对外访问放开了,https+ssl 还是要安全些,然后你的域名在cloudflare托管好了,并且你对怎么在cloudflare获取zone_id, dns_id, apikey 这些都很熟悉,不熟悉的话就去度娘教程。

另外,因为cloudflare返回值是json格式,所以最好安装一下jq这个工具,可以用下面的命令安装:

opkg update && opkg install jq 

脚本如下:

#!/bin/sh updns() { while getopts ':a:d:e:i:p:z:' OPT; do case $OPT in a) local api_key=$OPTARG ;; d) local ddns_nm=$OPTARG ;; e) local e_mail=$OPTARG ;; i) local proj_id=$OPTARG ;; p) local ip=$OPTARG ;; z) local zone_id=$OPTARG ;; esac done if [ ! ${api_key} ] || [ ! ${ddns_nm} ] || [ ! ${e_mail} ] || [ ! ${proj_id} ] || [ ! ${ip} ] || [ ! ${zone_id} ]; then echo 1 return 1 fi res=$(curl -X PUT "https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${proj_id}" \ -H "X-Auth-Email: ${e_mail}" \ -H "X-Auth-Key: ${api_key}" \ -H "Content-Type: application/json" \ --data '{"type":"AAAA","name":"'"${ddns_nm}"'","content":"'"${ip}"'","ttl":7200,"proxied":false}' -s | jq .success | tr 'A-Z' 'a-z') if [ ${res} == 'true' ]; then echo 0 return 0 else echo 2 return 2 fi } hp=1 while getopts ':c' OPT; do case $OPT in c) hp=0 ;; esac done ipdat='/root/ipv6_addr_dat'  subj="ipv6_ddns,$(date +%Y%m%d%H%M%S)" devx="wlan1"  ipdatc=$(head -n 1 ${ipdat}) ipv6=$(ip -6 addr show dev ${devx} | grep "/128 scope global" | awk '{print $2}' | awk -F "/" '{print $1}') if [ ! ${ipv6} ]; then echo "${subj},${devx} has no ipv6 addr..." | logger -t ddns exit 1 fi if [ "${ipv6}" != "${ipdatc}" ]; then echo ${ipv6} >${ipdat} xt=0 else xt=1 fi if [ ${hp} -eq 0 ] || [ ${xt} -eq 0 ]; then pid='37iy7chsa0wp2ulzezraya6izt82keow'  zid='58ga8r5homn2myzw1qkoanwg051m2xa2'  email='example@mail.com'  akey='0fwx0m388nrfy16zgd8gk5yxmudcuop01g3hr'  dnm='example.com.cn'  res=$(updns -a "${akey}" -d "${dnm}" -e "${email}" -i "${pid}" -p "${ipv6}" -z "${zid}") if [ ${res} -eq 0 ]; then echo "${subj},${devx} [${ipv6}] upd successful..." | logger -t ddns exit 0 else echo "${subj},${devx} ipv6 addr update failed..." | logger -t ddns exit 3 fi else echo "${subj},${devx} ipv6 addr has not changed, no need to be update..." | logger -t ddns exit 2 fi 

脚本每次运行都会先对比当前设备ipv6地址和保存在 /root/ipv6_addr_dat (这个文件你可以在脚本里面自定义位置和名称)里面得ipv6地址,如果不同,就把设备ipv6地址写入这个文件,如果相同就不会再更新cloudflare。当然,如果你要强制更新,可以在运行脚本时加一个可选参数-c,就会主动更新了,假如脚本名称为ipv6_ddns.sh, 运行时 ./ipv6_ddns.sh -c 就会强制更新, ./ipv6_ddns.sh 就会有判断得更新。

PS: 补充一下,怎么开启防火墙ipv6端口。

进入luci管理界面—网络—防火墙—通信规则,点下面的添加按钮。
在这里插入图片描述
名称,端口,自己指定,其他照着选择和填写就可以了。

在这里插入图片描述
在这里插入图片描述
折腾之前最后多搜索学习相关教程,好了!

原文链接:https://blog.csdn.net/coolbi5/article/details/129298577?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168449620216800217253485%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168449620216800217253485&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-21-129298577-null-null.article_score_rank_blog&utm_term=NAS%E3%80%81%E7%BE%A4%E6%99%96%E3%80%81%E9%98%BF%E9%87%8C%E4%BA%91%E3%80%81%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90%E3%80%81%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E3%80%81ipv6%E3%80%81ddns%E3%80%81%E8%BD%BB%E9%87%8F%E7%BA%A7%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%81%E9%93%81%E5%A8%81%E9%A9%AC%E3%80%81%E5%A8%81%E8%81%94%E9%80%9A%E3%80%81DSM%E3%80%81DSM6.0%E3%80%81%E7%BE%A4%E6%99%96nas%E3%80%81%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%81%E8%9C%97%E7%89%9B%E6%98%9F%E9%99%85%E3%80%81%E9%BB%91%E7%BE%A4%E6%99%96%E3%80%81docker%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81%E5%9F%9F%E5%90%8D%E6%B3%A8%E5%86%8C%E3%80%81%E5%AE%9D%E5%A1%94%E3%80%81%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E3%80%81nginx%E3%80%81frp%E3%80%81%E5%8A%A8%E6%80%81%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享