本帖最后由 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这个工具,可以用下面的命令安装:
- 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" # 你的拥有运营商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.right.com.cn/forum/thread-8307840-1-1.html
|