本文主要是介绍群晖设置DDNS (服务商Godaddy被墙 DDNS-GO无法解析 采用自定义脚本方式完成DDNS更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
起因&解决思路
事情的开始大概是这样的。。godaddy买了个域名,好好的用了半个月。。然后一直更新失败发现被狗东西墙了
在提一嘴DDNS-GO 解析失败原因
DDNS-GO必须要先向godaddy请求自己的IP地址[这里被墙卡住了],然后比对,再决定是否上传新的地址[上传不会被卡]
所以解决方法是直接整个脚本,管你godaddy上记录的IP是什么,我也不用获取,直接上传获得的IP地址就完事了
测试过的解决方法
在openwrt网关路由上使用透明网关的方式代理并且做DDNS,并且设置端口转发到后端群晖,失败
(代理强制使用IPV4,但我要用ipv6啊,直接获取不到IPV6地址)- 在openwrt网关路由上使用透明网关的方式代理,然后在后面的群晖上设置DDNS-GO的docker容器,成功
- (但是总不能给家里所有设备都上一层代理吧,太耗代理的流量了,而且开开关关的也麻烦)
在群晖系统内设置代理服务器,使用旁路由,然后在后面的群晖上设置DDNS-GO的docker容器,失败
(似乎群晖设置的代理,只能群晖用?群晖里docker不走代理。群晖可以curl Google,里面的容器curl不通。折腾很久没折腾成)群晖系统内设置DDNS,不用ddns-go套件,心有余而力不足
(群晖系统内要自定义请求串,看godaddy的文档调半天调不通)- 直接去github上找了个godaddy的 DDNS 脚本,并且自行修改以完成ipv6的解析上传,成功(用不着设置啥代理服务器,最方便。为什么这个办法看上面的黄底红字)
源脚本
https://github.com/gu1ll0me/godaddy-ddns/blob/master/godaddy.sh
完整脚本
注:我测试发现如果用请求api方式虽然可以获取IP地址,但是用这个地址访问不了我的主机,所以改用ifconfig方式获取网卡网址。我把api方式有关命令全部注释了
使用时,无论ipv6还是ipv4,基本上只要更改最上面几个变量,还有中间PublicIP=`ifconfig -a | gr........(地址获取匹配规则)即可
完成后将其加入crontab计划任务,每10分钟更新一次
#!/bin/bashKey=这里输入api key Secret=这里输入api Secret Domain=你的域名 Type=AAAA #ipv4=A ipv6=AAAA Name=@ # Record name, as seen in the DNS setup page, default @. TTL=600#这个是缓存IP 用于与目前比对决定是否更新 # Writable path to last known Public IP record cached. Best to place in tmpfs. CachedIP=/tmp/current_ip#外部api方式检测IP地址。改用ifconfig方式获取,整段注释 #我测试发现可以获取地址但是用这个地址访问不了我的主机,所以改用ifconfig方式获取网址 #CheckURL=http://api.ipify.org. #检测ipv4地址 #CheckURL=https://6.ipw.cn/ #检测ipv6地址 #CheckURL=https://v6.ident.me #检测ipv6地址 #CheckURL=https://speed.neu6.edu.cn/getIP.php #检测ipv6地址 #PublicIP=$(${Curl} -kLs ${CheckURL})#ifconfig方式获取网卡eth0接口IP地址 PublicIP=`ifconfig -a | grep -A 5 eth0 | grep Glo | grep 64 | awk '{print $3}' | awk -F / '{print $1}'` #自己根据自己要获取的网卡和ip自行修改,每个人都不一样。我这里对于我的地址最大化匹配 echo "ifconfig获得IP为 $PublicIP"#检测IP地址合法性 #由于源脚本针对IPV4进行匹配,IPV6会直接进入else显示failed,所以整段注释 #if [ $? -eq 0 ] && [[ "${PublicIP}" =~ [0-9]{1,3}\.[0-9]{1,3} ]];then # echo "${PublicIP}!" #else # echo "Failed ${PublicIP}"#exit 1 #fi#curl请求体 Curl=$(/usr/bin/which curl 2>/dev/null) Touch=$(/usr/bin/which touch 2>/dev/null) [ "${Curl}" = "" ] && echo "Error: Unable to find 'curl CLI'." && exit 1 [ -z "${Key}" ] || [ -z "${Secret}" ] && echo "Error: Requires API 'Key/Secret' value." && exit 1 [ -z "${Domain}" ] && echo "Error: Requires 'Domain' value." && exit 1 [ -z "${Type}" ] && Type=A [ -z "${Name}" ] && Name=@ [ -z "${TTL}" ] && TTL=600 [ "${TTL}" -lt 600 ] && TTL=600 ${Touch} ${CachedIP} 2>/dev/null [ $? -ne 0 ] && echo "Error: Can't write to ${CachedIP}." && exit 1 #[ -z "${CheckURL}" ] && CheckURL=http://api.ipify.org #不使用api接口获取ip地址,改为ifconfig获取,注释掉 #echo -n "Checking current 'Public IP' from '${CheckURL}'..." #不使用api接口获取ip地址,改为ifconfig获取,注释掉#CachedIP与PublicIP比对决定是否更新 #使用上方的key,secret,publicIP等参数更新DDNS #并判断更新是否成功 if [ "$(cat ${CachedIP} 2>/dev/null)" != "${PublicIP}" ];thenecho -n "Checking '${Domain}' IP records from 'GoDaddy'..."Check=$(${Curl} -kLsH"Authorization: sso-key ${Key}:${Secret}" \-H"Content-type: application/json" \https://api.godaddy.com/v1/domains/${Domain}/records/${Type}/${Name} \2>/dev/null|jq -r '.[0].data')if [ $? -eq 0 ] && [ "${Check}" = "${PublicIP}" ];thenecho -n ${Check}>${CachedIP}echo -e "unchanged!\nCurrent 'Public IP' matches 'GoDaddy' records. No update required!"elseecho -en "changed!\nUpdating '${Domain}' ${Check} -> ${PublicIP}..."Update=$(${Curl} -kLsXPUT -H"Authorization: sso-key ${Key}:${Secret}" \-H"Content-type: application/json" \https://api.godaddy.com/v1/domains/${Domain}/records/${Type}/${Name} \-d "[{\"data\":\"${PublicIP}\",\"ttl\":${TTL}}]" 2>/dev/null)if [ $? -eq 0 ] && [ "${Update}" = "" ];thenecho -n ${PublicIP}>${CachedIP}echo "Success!"eval ${SuccessExec}elseecho "Fail! ${Update}"eval ${FailedExec}exit 1fifi elseecho "Current 'Public IP' matches 'Cached IP' recorded. No update required!" fi exit $?
完成后DDNS更新后进行检测
访问
https://api.godaddy.com/v1/domains/你的域名/records/AAAA/@#AAAA为IPV6
这就成功了捏
嗯,建议以后买域名先看中国大内网能不能访问。虽然这次是解决了,但是真的太折腾了、、、
这篇关于群晖设置DDNS (服务商Godaddy被墙 DDNS-GO无法解析 采用自定义脚本方式完成DDNS更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!