找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 1105|回复: 11

Openwrt基于ipv6更新DNS的cloudflare_shell脚本

[复制链接]
本帖最后由 null666666 于 2023-3-16 13:08 编辑

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


如果你也有同样的需求,可以参考一下,要修改的地方我都注释了,要用这个脚本,前提是你得有一个域名,最好

对应的ssl也申请了,因为把路由器对外访问放开了,https+ssl 还是要安全些,然后你的域名在cloudflare托管好了,
并且你对怎么在cloudflare获取zone_id, dns_id, apikey 这些都很熟悉,不熟悉的话就去度娘教程。


另外,因为cloudflare返回值是json格式,所以最好安装一下jq这个工具,可以用下面的命令安装:
  1. opkg update && opkg install jq
复制代码


脚本如下:


  1. #!/bin/sh

  2. updns() {
  3.         while getopts ':a:d:e:i:p:z:' OPT; do
  4.                 case $OPT in
  5.                 a) local api_key=$OPTARG ;;
  6.                 d) local ddns_nm=$OPTARG ;;
  7.                 e) local e_mail=$OPTARG ;;
  8.                 i) local proj_id=$OPTARG ;;
  9.                 p) local ip=$OPTARG ;;
  10.                 z) local zone_id=$OPTARG ;;
  11.                 esac
  12.         done
  13.         if [ ! ${api_key} ] || [ ! ${ddns_nm} ] || [ ! ${e_mail} ] || [ ! ${proj_id} ] || [ ! ${ip} ] || [ ! ${zone_id} ]; then
  14.                 echo 1
  15.                 return 1
  16.         fi
  17.         res=$(curl -X PUT "https://api.cloudflare.com/client/v4/zones/${zone_id}/dns_records/${proj_id}" \
  18.                 -H "X-Auth-Email: ${e_mail}" \
  19.                 -H "X-Auth-Key: ${api_key}" \
  20.                 -H "Content-Type: application/json" \
  21.                 --data '{"type":"AAAA","name":"'"${ddns_nm}"'","content":"'"${ip}"'","ttl":7200,"proxied":false}' -s |
  22.                 jq .success | tr 'A-Z' 'a-z')
  23.         if [ ${res} == 'true' ]; then
  24.                 echo 0
  25.                 return 0
  26.         else
  27.                 echo 2
  28.                 return 2
  29.         fi
  30. }

  31. hp=1
  32. while getopts ':c' OPT; do
  33.         case $OPT in
  34.         c) hp=0 ;;
  35.         esac
  36. done
  37. ipdat='/root/ipv6_addr_dat'
  38. subj="ipv6_ddns,$(date +%Y%m%d%H%M%S)"
  39. devx="wlan1" # 你的拥有运营商ipv6设备名,比如我是中继wifi上网的,wlan1拥有ipv6地址
  40. ipdatc=$(head -n 1 ${ipdat})
  41. ipv6=$(ip -6 addr show dev ${devx} | grep "/128 scope global" | awk '{print $2}' | awk -F "/" '{print $1}')
  42. if [ ! ${ipv6} ]; then
  43.         echo "${subj},${devx} has no ipv6 addr..." | logger -t ddns
  44.         exit 1
  45. fi

  46. if [ "${ipv6}" != "${ipdatc}" ]; then
  47.         echo ${ipv6} >${ipdat}
  48.         xt=0
  49. else
  50.         xt=1
  51. fi

  52. if [ ${hp} -eq 0 ] || [ ${xt} -eq 0 ]; then
  53.         pid='37iy7chsa0wp2ulzezraya6izt82keow' # 你在cloudflare上的dns id
  54.         zid='58ga8r5homn2myzw1qkoanwg051m2xa2' # 你在cloudflare 上的域名zone_id
  55.         email='example@mail.com' # 你在cloudflare上的账号邮箱
  56.         akey='0fwx0m388nrfy16zgd8gk5yxmudcuop01g3hr' # 你在cloudflare上的api key
  57.         dnm='example.com.cn' # 你在cloudflare上托管的域名
  58.         res=$(updns -a "${akey}" -d "${dnm}" -e "${email}" -i "${pid}" -p "${ipv6}" -z "${zid}")
  59.         if [ ${res} -eq 0 ]; then
  60.                 echo "${subj},${devx} [${ipv6}] upd successful..." | logger -t ddns
  61.                 exit 0
  62.         else
  63.                 echo "${subj},${devx} ipv6 addr update failed..." | logger -t ddns
  64.                 exit 3
  65.         fi
  66. else
  67.         echo "${subj},${devx} ipv6 addr has not changed, no need to be update..." | logger -t ddns
  68.         exit 2
  69. fi
复制代码


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


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


进入luci管理界面---网络---防火墙---通信规则,点下面的添加按钮。


名称,端口,自己指定,其他照着选择和填写就可以了。




折腾之前最后多搜索思考相关教程,好了!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1恩山币 +1 收起 理由
wil*** + 1 教程很好,还不用“回复可见”,楼主太厚道.

查看全部评分

楼主,求教下!我是光猫拨号,openwrt二级路由由,现在wan口有ipv6,为了下面设备有ipv6,lan和wan都用了中继模式,最后是设备有了公网ipv6,但是ipv6网站测试不通过,就算是防火墙关闭了也不行,怎么回事?
回复

使用道具 举报

freenomz申请的免费域名不是不支持在cf的api解析了吗?然后其他eu.org等免费域名,好像移动默认墙,联通,电信似乎无所谓。
回复

使用道具 举报

 楼主| | 显示全部楼层
krystalwater 发表于 2023-3-2 15:58
freenomz申请的免费域名不是不支持在cf的api解析了吗?然后其他eu.org等免费域名,好像移动默认墙,联通, ...

我电信的,用的eu的免费域名,在dnspod 弄了个免费一年的ssl,木有问题,没在移动和联通试过,他们应该是墙你和cf之间的通路,另外dns劫持特定域名,我用dns-proxy代理出去了
回复

使用道具 举报

 楼主| | 显示全部楼层
krystalwater 发表于 2023-3-2 15:58
freenomz申请的免费域名不是不支持在cf的api解析了吗?然后其他eu.org等免费域名,好像移动默认墙,联通, ...

我电信的,用的eu的免费域名,在dnspod 弄了个免费一年的ssl,木有问题,没在移动和联通试过,他们应该是墙你和cf之间的通路,另外dns劫持特定域名,我用dns-proxy代理出去了
回复

使用道具 举报

 楼主| | 显示全部楼层
weige111 发表于 2023-3-2 13:10
楼主,求教下!我是光猫拨号,openwrt二级路由由,现在wan口有ipv6,为了下面设备有ipv6,lan和wan都用了中继 ...

不好意思,兄弟,我的网络环境和你的不太一样,没研究那么多,你这种我也不太知道
回复

使用道具 举报

null666666 发表于 2023-3-2 23:14
我电信的,用的eu的免费域名,在dnspod 弄了个免费一年的ssl,木有问题,没在移动和联通试过,他们应该是 ...

不是墙和cf的通路,移动直接打不开nic.eu.org,还有gw.to也都墙了的,移动就是墙中墙。挂了代理能出去,如果是移动的话,这个就没啥用了。
回复

使用道具 举报

 楼主| | 显示全部楼层
krystalwater 发表于 2023-3-2 23:23
不是墙和cf的通路,移动直接打不开nic.eu.org,还有gw.to也都墙了的,移动就是墙中墙。挂了代理能出去, ...

哦哦,原来这样,电信可以直接打开的
回复

使用道具 举报

本帖最后由 Easong 于 2023-4-7 12:57 编辑

好货,正好也整了个eu域名,能否顺带整个IPV4的?
回复

使用道具 举报

厉害。不过我使用了Python3,定时任务执行python脚本。原理是一小时检测一下最新的ipv6地址和更新CF之后保存在本地的文本ipv6。两者一样,不用联网cloudflare,两者不一致就联网更新,使用API。XXX.life的是我买的后缀,免费的不能使用api更新。我现在ESXi上面有五六台OPenWRT。全都是是自动更新IPV6,比自带的DDNS强多了,那个日志太多,错误的也多。我是自己写日志,自己更新,妥妥的。一百五六十行代码的样子。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

 楼主| | 显示全部楼层
NorthBig 发表于 2023-4-7 15:59
厉害。不过我使用了Python3,定时任务执行python脚本。原理是一小时检测一下最新的ipv6地址和更新CF之后保 ...

对,自带的ddns可能考虑的可能性比较多,毕竟作为插件发行的,要考虑周全,但是设置起来很繁琐,自己写脚本对口自己的需求,比较有针对性,也会比较简洁!
回复

使用道具 举报

 楼主| | 显示全部楼层
NorthBig 发表于 2023-4-7 15:59
厉害。不过我使用了Python3,定时任务执行python脚本。原理是一小时检测一下最新的ipv6地址和更新CF之后保 ...

对,自带的ddns可能考虑的可能性比较多,毕竟作为插件发行的,要考虑周全,但是设置起来很繁琐,自己写脚本对口自己的需求,比较有针对性,也会比较简洁!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-5-16 22:48

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表