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' # 这个是临时保存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='[email protected]'                     # 你在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管理界面—网络—防火墙—通信规则,点下面的添加按钮。
Openwrt基于ipv6更新DNS的cloudflare_shell脚本_第1张图片
名称,端口,自己指定,其他照着选择和填写就可以了。

Openwrt基于ipv6更新DNS的cloudflare_shell脚本_第2张图片
Openwrt基于ipv6更新DNS的cloudflare_shell脚本_第3张图片
折腾之前最后多搜索学习相关教程,好了!

你可能感兴趣的:(智能路由器,网络)