最近折腾了一下内网穿透,发现如果有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' # 这个是临时保存ipv6地址的文件,你可以自定义位置和名称
subj="ipv6_ddns,$(date +%Y%m%d%H%M%S)"
devx="wlan1" # 你的拥有运营商ipv6设备名,比如我是中继wifi上网的,wlan1拥有ipv6地址
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' # 你在cloudflare上的dns id
zid='58ga8r5homn2myzw1qkoanwg051m2xa2' # 你在cloudflare 上的域名zone_id
email='example@mail.com' # 你在cloudflare上的账号邮箱
akey='0fwx0m388nrfy16zgd8gk5yxmudcuop01g3hr' # 你在cloudflare上的api key
dnm='example.com.cn' # 你在cloudflare上托管的域名
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://www.toymoban.com/news/detail-529785.html
折腾之前最后多搜索学习相关教程,好了!文章来源地址https://www.toymoban.com/news/detail-529785.html
到了这里,关于Openwrt基于ipv6更新DNS的cloudflare_shell脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!