最近折騰了一下內(nèi)網(wǎng)穿透,發(fā)現(xiàn)如果有ipv6的話,防火墻開啟相應(yīng)端口,可以直接從外面用ipv6訪問內(nèi)網(wǎng)服務(wù)器,雖然省去了ipv4的端口轉(zhuǎn)發(fā)等麻煩事兒,但是ipv6還是經(jīng)常變動(dòng)的,所以搞了個(gè)免費(fèi)域名,在cloudflare托管了。然后在路由器用shell 寫一個(gè)更新dns的腳本,定時(shí)運(yùn)行,更新托管的域名對(duì)應(yīng)設(shè)備的最新ipv6地址,就可以在外面隨時(shí)訪問路由器管理luci界面了,下面貼一下腳本,做個(gè)備份,方便不時(shí)之需。
如果你也有同樣的需求,可以參考一下,要修改的地方我都注釋了,要用這個(gè)腳本,前提是你得有一個(gè)域名,最好對(duì)應(yīng)的ssl也申請(qǐng)了,因?yàn)榘崖酚善鲗?duì)外訪問放開了,https+ssl 還是要安全些,然后你的域名在cloudflare托管好了,并且你對(duì)怎么在cloudflare獲取zone_id, dns_id, apikey 這些都很熟悉,不熟悉的話就去度娘教程。
另外,因?yàn)閏loudflare返回值是json格式,所以最好安裝一下jq這個(gè)工具,可以用下面的命令安裝:
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' # 這個(gè)是臨時(shí)保存ipv6地址的文件,你可以自定義位置和名稱
subj="ipv6_ddns,$(date +%Y%m%d%H%M%S)"
devx="wlan1" # 你的擁有運(yùn)營(yíng)商ipv6設(shè)備名,比如我是中繼wifi上網(wǎng)的,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上的賬號(hào)郵箱
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
腳本每次運(yùn)行都會(huì)先對(duì)比當(dāng)前設(shè)備ipv6地址和保存在 /root/ipv6_addr_dat (這個(gè)文件你可以在腳本里面自定義位置和名稱)里面得ipv6地址,如果不同,就把設(shè)備ipv6地址寫入這個(gè)文件,如果相同就不會(huì)再更新cloudflare。當(dāng)然,如果你要強(qiáng)制更新,可以在運(yùn)行腳本時(shí)加一個(gè)可選參數(shù)-c,就會(huì)主動(dòng)更新了,假如腳本名稱為ipv6_ddns.sh, 運(yùn)行時(shí) ./ipv6_ddns.sh -c 就會(huì)強(qiáng)制更新, ./ipv6_ddns.sh 就會(huì)有判斷得更新。
PS: 補(bǔ)充一下,怎么開啟防火墻ipv6端口。
進(jìn)入luci管理界面—網(wǎng)絡(luò)—防火墻—通信規(guī)則,點(diǎn)下面的添加按鈕。
名稱,端口,自己指定,其他照著選擇和填寫就可以了。文章來源:http://www.zghlxwxcb.cn/news/detail-529785.html
折騰之前最后多搜索學(xué)習(xí)相關(guān)教程,好了!文章來源地址http://www.zghlxwxcb.cn/news/detail-529785.html
到了這里,關(guān)于Openwrt基于ipv6更新DNS的cloudflare_shell腳本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!