群晖设置DDNS (服务商Godaddy被墙 DDNS-GO无法解析 采用自定义脚本方式完成DDNS更新)

news2025/1/16 14:00:46

起因&解决思路

事情的开始大概是这样的。。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/bash

Key=这里输入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}" ];then
  echo -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}" ];then
    echo -n ${Check}>${CachedIP}
    echo -e "unchanged!\nCurrent 'Public IP' matches 'GoDaddy' records. No update required!"
  else
    echo -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}" = "" ];then
      echo -n ${PublicIP}>${CachedIP}
      echo "Success!"
      eval ${SuccessExec}
    else
      echo "Fail! ${Update}"
      eval ${FailedExec}
      exit 1
    fi
  fi
else
  echo "Current 'Public IP' matches 'Cached IP' recorded. No update required!"
fi
exit $?

完成后DDNS更新后进行检测

访问

https://api.godaddy.com/v1/domains/你的域名/records/AAAA/@
                                                #AAAA为IPV6

这就成功了捏 

嗯,建议以后买域名先看中国大内网能不能访问。虽然这次是解决了,但是真的太折腾了、、、

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1154404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

okhttp post请求 header post参数加密遇到的两个问题

如果你对于网络请求用了https后是否还有必要对参数加密有疑问可以看我上篇的文章:网络安全https 记得耐心看完,下面说问题: Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a 一开始以为是okhttp框架对特殊字符做了现在…

私有网络的安全保障,WorkPlus Meet内网视频会议助力企业高效会议

在企业内部沟通与协作中,视频会议成为了一种必不可少的沟通方式。然而,传统的互联网视频会议往往受制于网络不稳定因素,给企业带来不便与困扰。WorkPlus Meet作为一款专注内网视频会议的软件,致力于为企业打造高效、稳定的内网视频…

openpnp - code review - 开机对话框历史记录和贡献者名单

文章目录 openpnp - code review - 开机对话框历史记录和贡献者名单概述笔记D:\my_openpnp\openpnp_dev_2022_0801\src\main\java\org\openpnp\gui\AboutDialog.javaEND openpnp - code review - 开机对话框历史记录和贡献者名单 概述 偶然发现, 自己打包后的openpnp, 开机后…

js中获取json的值:使用 JSON.parse() 方法

比如json为:configs: "{"type":1}" 直接打印configs如下图 我们可以使用 JSON.parse() 方法将JSON格式字符串转换为 JavaScript 对象。 let a JSON.parse(configs) console.log(a) a打印出来如下图 此时就可以用a.type来得到1。 JSON.parse(…

配电柜监控原来还能这样?真的太爽啦!

在现代社会中,电力作为基础设施的一部分,扮演着至关重要的角色。为了确保电力系统的可靠性、安全性和高效性,配电柜监控系统变得越来越重要。 配电柜监控系统提供了实时数据和控制,有助于迅速识别并解决问题,从而降低停…

Linux 远程桌面软件

为您的 IT 管理员配备最好的 Linux 远程桌面软件至关重要。原因如下?Linux 是一个开源和免费的操作系统,它提供了一个非常灵活和可定制的软件内核。由于其开源性质,Linux 被认为是市场上最安全的操作系统之一,它拥有一个全球用户社…

【学习SonarQube记录】如何在windows上安装SonarQube及安装中文语言包

学习SonarQube记录 第一章 如何在windows上安装SonarQube及安装中文语言包 文章目录 学习SonarQube记录前言一、SonarQube是什么?二、安装步骤1.准备工作2.安装SonarQube 总结 前言 公司近期有代码完整性检测的需求,于是来学习相关工具SonarQube 一、S…

算法:二叉树难题和与STL相结合的练习题

文章目录 二叉树层序遍历原理二叉树的层序遍历 二叉树的最近公共祖先二叉搜索树和双向链表从前序与中序遍历序列构造二叉树从后序与中序遍历序列构造二叉树二叉树的非递归实现前序遍历中序遍历后序遍历 二叉树层序遍历原理 二叉树的层序遍历通常是借助队列来实现,可…

数字孪生应用到供水站远程运维的场景及优势

水厂在生活中的重要性不可忽视。它们提供清洁、安全的水源,满足人们饮用、洗浴、烹饪等基本需求,保障公共卫生,预防疾病传播;同时,水厂也促进经济发展,为工业生产和农业灌溉提供保障,吸引和支持企业的投资和…

【产品经理从0到1】ID(工业设计)知识构建

导语:作为一个硬件产品经理,虽然不需要自己进行工业设计,但是若要对产品外观和品质细节进行更深入和准确的把控,就需要了解工业设计的相关知识。

微信小程序-授权登录(手机号码)

1、WXBizDataCrypt.js-下载地址 2、UNIAPP代码 <template> <view class"work-container"> <view class"login"> <view class"content"> <button class"button_wx&q…

Intel 系列时序说明

1xx2xx系列时序说明 1.VCCRTC=2.5V+ 3.3V BOARD TO PCH 保存CMOS信息,保持时钟正常运行 电池供电或3V线性给到 2.RTCRST#/SRTCRST# BOARD TO PCH 延时复位 正常3.3V,低到高完成复位,VCCRTC通过电阻延时 3.32.768KHZ=RTCX1 BOARD TO PCH 0.1V-0.6V直通桥 4.VC…

关键词搜索天猫商品数据接口(标题|主图|SKU|价格|优惠价|掌柜昵称|店铺链接|店铺所在地|天猫商品列表API接口)

关键词搜索天猫商品数据接口可以使用天猫官方的API接口实现。以下是一些可能有用的天猫API接口&#xff1a; item_search_tmall - 按关键字搜索天猫商品接口&#xff1a;这个接口可以用于通过关键词搜索天猫商品&#xff0c;获取商品列表。可以在接口中使用不同的关键字进行搜…

关于有效客户关系管理,你需要了解的一切

为了了解客户购买决策的驱动因素或阻碍因素&#xff0c;你需要组织和分析有关客户需求、喜好和厌恶的数据。这正是客户关系管理其中一个重要方面。有效的客户关系管理可以帮助企业与其现有客户和潜在客户建立联系&#xff0c;以提高客户满意度并确保销售周期有利可图。 什么是客…

【HTML】实现填写简历信息

实现页面&#xff1a; 完整源代码&#xff1a; <!DOCTYPE html> <html lang"cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Doc…

Jt808应答举例

1.前言 最近客户在集成基于Jt808的产品协议的时候&#xff0c;经常会遇到一些问题&#xff0c;比如没有进行转义&#xff0c;或者转义的时机不对&#xff0c;导致校验码没有进行转义。为了让大家更熟悉Jt808的指令组包&#xff0c;我这里整理了一下转义的步骤。 2.组包 以此…

android 8.1 disable unsupported sensor

如果device不支持某种sensor,可以在android/frameworks/base/core/java/android/hardware/SystemSensorManager.java里将其disabled掉。以disable proximity sensor为例。 public SystemSensorManager(Context context, Looper mainLooper) {synchronized(sLock) {if (!sNativ…

mysql---DCL(用户创建及限制)

DCL: 权限控制语句 grant revoke 数据库用户管理: 创建用户 修改用户的权限 删除用户 grant 要在终端执行。 用户创建语句注释 create user ky32localhost identified by 123456; create user 创建用户的开头 ky32localhost ky32 表示用户的主机名 localhost 新建的…

一文吃透低代码开发与传统IT开发的区别

目录 一、含义不同 二、开发门槛不同 三、两者之间的区别 1、从技术特征来看 2、从目标开发者来看 四、低代码平台使用感受&#xff1f; &#xff08;1&#xff09;自定义模块&#xff0c;满足不同的业务需求 &#xff08;2&#xff09;工作流引擎&#xff0c;简化复杂流程的管…

js判断数据类型的方式详解(面试题)

一.typeof 1.用来判断基本数据类型 null、Object、String判断的结果都为object 二.instanceof 检测构造函数的 prototype 属性是否在某个实例对象的原型链上 不能判断简单数据类型&#xff0c;只能判断复杂数据类型。 复杂数据类型的具体类型不一定判断正确。 手写instanceof…