使用老毛子在腾讯云DNSpod上实现DDNS

这篇具有很好参考价值的文章主要介绍了使用老毛子在腾讯云DNSpod上实现DDNS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用老毛子在腾讯云DNSpod上实现DDNS

需求:
1. 一台刷了老毛子的路由器
2. 腾讯云上购买的域名

最近申请了电信的动态公网IP,就想着我之前买的域名可以用起来了,于是乎查阅资料在路由器上实现了DDNS

  1. 首先在GitHub上搜索DDNS,找到了一个可用的shell脚本rehiy/dnspod-shell为了方便拷贝到路由器,按照作者的方法把配置融合进了单文件内,文件修改好备用

  2. 复制进老毛子,浏览器输入192.168.123.1进入老毛子管理界面,依次点击高级设置中的系统管理-服务-启用ssh服务选择“是”
    使用老毛子在腾讯云DNSpod上实现DDNS

  3. 打开FinalShell或者其他ssh软件登录路由器,选择新建ssh连接,地址就是192.168.123.1,用户名密码就是你设置的密码,进入之后把改好的.sh文件复制到路由器/etc/storage/目录下

  4. 在计划任务那里输入*/10 * * * * /etc/storage/ardnspod.sh代表10分钟运行一次,最后点击“应用本页面设置”即可。
    使用老毛子在腾讯云DNSpod上实现DDNS

  5. 最后为了能够方便管理,我把代码的输出改到了系统日志输出,这样就可以在路由器管理界面看到运行效果啦
    使用老毛子在腾讯云DNSpod上实现DDNS
    改过的代码我放在最后,只需要改最后两行的arTokenarDdnsCheck即可,arToken可以登录DNSpod点击右上角我的账号-api密钥
    使用老毛子在腾讯云DNSpod上实现DDNS
    然后选择创建DNSpod Token即可获取,arToken格式为ID,Token使用老毛子在腾讯云DNSpod上实现DDNS
    如果感觉不错的话请点个小使用老毛子在腾讯云DNSpod上实现DDNS使用老毛子在腾讯云DNSpod上实现DDNS哈。文章来源地址https://www.toymoban.com/news/detail-454938.html

#!/bin/sh
#

#############################################################
# AnripDdns v6.1.1
#
# Dynamic DNS using DNSPod API
#
# Author: Rehiy, https://github.com/rehiy
#                https://www.anrip.com/?s=dnspod
# Collaborators: ProfFan, https://github.com/ProfFan
#
# Usage: please refer to `ddnspod.sh`
#
#############################################################



# TokenID,Token

export arToken=""

# Get WAN IPv4

arWanIp4() {

    local hostIp

    local lanIps="^$"

    lanIps="$lanIps|(^10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^169\.254\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.[0-9]{1,3}$)"
    lanIps="$lanIps|(^192\.168\.[0-9]{1,3}\.[0-9]{1,3}$)"

    case $(uname) in
        'Linux')
            hostIp=$(ip -o -4 addr list | grep -Ev '\s(docker|lo)' | awk '{print $4}' | cut -d/ -f1 | grep -Ev "$lanIps")
        ;;
        Darwin|FreeBSD)
            hostIp=$(ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | grep -Ev "$lanIps")
        ;;
    esac

    if [ -z "$hostIp" ]; then
        if type wget >/dev/null 2>&1; then
            hostIp=$(wget -q -O- https://v4.myip.la)
        else
            hostIp=$(curl -s https://v4.myip.la)
        fi
    fi

    if [ -z "$hostIp" ]; then
        echo "arWanIp4 - Can't get ip address"
        logger -t DNSpod_DDNS "无法获取ip地址"
        return 1
    fi

    if [ -z "$(echo $hostIp | grep -E '^[0-9\.]+$')" ]; then
        echo "arWanIp4 - Invalid ip address $hostIp"
        logger -t DNSpod_DDNS "无效ip地址:$hostIp"
        return 1
    fi

    echo $hostIp

}

# Get WAN IPv6

arWanIp6() {

    local hostIp

    local lanIps="(^$)|(^::1$)|(^[fF][eE][8-9a-fA-F])"

    case $(uname) in
        'Linux')
            hostIp=$(ip -o -6 addr list | grep -Ev '\s(docker|lo)' | awk '{print $4,substr($NF,0,length($NF)-3)}' | sed 's/fore/2592000/g' | sort -k 2 -n | cut -d/ -f1 | grep -Ev "$lanIps" | head -n 1)
        ;;
        Darwin|FreeBSD)
            hostIp=$(ifconfig | grep "inet6 " | awk '{print $2}' | grep -Ev "$lanIps" | head -n 1)
        ;;
    esac

    if [ -z "$hostIp" ]; then
        if type wget >/dev/null 2>&1; then
            hostIp=$(wget -q -O- https://v6.myip.la)
        else
            hostIp=$(curl -s https://v6.myip.la)
        fi
    fi

    if [ -z "$hostIp" ]; then
        echo "arWanIp6 - Can't get ip address"
        return 1
    fi

    if [ -z "$(echo $hostIp | grep -E '^[0-9a-fA-F:]+$')" ]; then
        echo "arWanIp6 - Invalid ip address"
        return 1
    fi

    echo $hostIp

}

# Dnspod Bridge
# Args: type data

arDdnsApi() {

    local agent="AnripDdns/6.1.0(wang@rehiy.com)"

    local apiurl="https://dnsapi.cn/${1:?'Info.Version'}"
    local params="login_token=$arToken&format=json&$2"

    if type wget >/dev/null 2>&1; then
        wget -q -O- --no-check-certificate -U $agent --post-data $params $apiurl
    else
        curl -s -A $agent -d $params $apiurl
    fi

}

# Fetch Ids of Domain and Record
# Args: recordType domain subdomain

arDdnsIds() {

    local errMsg

    local domainId
    local recordId

    # Get Domain Id
    domainId=$(arDdnsApi "Domain.Info" "domain=$2")
    domainId=$(echo $domainId | sed 's/.*"id":"\([0-9]*\)".*/\1/')

    if ! [ "$domainId" -gt 0 ] 2>/dev/null ;then
        errMsg=$(echo $domainId | sed 's/.*"message":"\([^\"]*\)".*/\1/')
        echo "arDdnsIds - $errMsg"
        logger -t DNSpod_DDNS "arDdnsIds - $errMsg"
        return 1
    fi

    # Get Record Id
    recordId=$(arDdnsApi "Record.List" "domain_id=$domainId&sub_domain=$3&record_type=$1")
    recordId=$(echo $recordId | sed 's/.*"id":"\([0-9]*\)".*/\1/')

    if ! [ "$recordId" -gt 0 ] 2>/dev/null ;then
        errMsg=$(echo $recordId | sed 's/.*"message":"\([^\"]*\)".*/\1/')
        echo "arDdnsIds - $errMsg"
        logger -t DNSpod_DDNS "arDdnsIds - $errMsg"
        return 1
    fi

    echo $domainId $recordId
    logger -t DNSpod_DDNS "$domainId $recordId"
}

# Fetch Record Ip
# Args: domainId recordId

arDdnsRecordIp() {

    local errMsg

    local recordIp

    # Get Record Ip
    recordIp=$(arDdnsApi "Record.Info" "domain_id=$1&record_id=$2")
    recordIp=$(echo $recordIp | sed 's/.*,"value":"\([0-9a-fA-F\.\:]*\)".*/\1/')

    # Output Record Ip
    case "$recordIp" in
        [0-9a-fA-F]*)
            echo $recordIp
            logger -t DNSpod_DDNS "$recordIp"
            return 0
        ;;
        *)
            errMsg=$(echo $recordIp | sed 's/.*"message":"\([^\"]*\)".*/\1/')
            echo "arDdnsRecordIp - $errMsg"
            logger -t DNSpod_DDNS "arDdnsRecordIp - $errMsg"
            return 1
        ;;
    esac

}

# Update Record Ip
# Args: domainId recordId subdomain hostIp recordType

arDdnsUpdate() {

    local errMsg

    local recordRs
    local recordIp
    local recordCd

    if [ -z "$5" ]; then
        echo "arDdnsUpdate - Args number error"
        logger -t DNSpod_DDNS "arDdnsUpdate - Args number error"
        return 1
    fi

    # Update Ip
    recordRs=$(arDdnsApi "Record.Modify" "domain_id=$1&record_id=$2&sub_domain=$3&record_type=$5&value=$4&record_line=%e9%bb%98%e8%ae%a4")
    recordIp=$(echo $recordRs | sed 's/.*,"value":"\([0-9a-fA-F\.\:]*\)".*/\1/')
    recordCd=$(echo $recordRs | sed 's/.*{"code":"\([0-9]*\)".*/\1/')

    # Output Result
    if [ "$recordIp" = "$4" ] && [ "$recordCd" = "1" ]; then
        echo "arDdnsUpdate - success"
        logger -t DNSpod_DDNS "arDdnsUpdate - success"
        return 0
    else
        errMsg=$(echo $recordRs | sed 's/.*,"message":"\([^"]*\)".*/\1/')
        echo "arDdnsUpdate - $errMsg"
        logger -t DNSpod_DDNS "arDdnsUpdate - $errMsg"
        return 1
    fi

}

# DDNS Check
# Args: Main Sub
arDdnsCheck() {

    local errCode

    local recordType
    local hostIp

    local ddnsIds
    local lastIp
    local postRs

    echo "Fetching Host Ip"
    logger -t DNSpod_DDNS "获取主机IP"
    if [ "$3" = "6" ]; then
        recordType=AAAA
        hostIp=$(arWanIp6)
    else
        recordType=A
        hostIp=$(arWanIp4)
    fi

    errCode=$?
    echo "> Host Ip: $hostIp"
    logger -t DNSpod_DDNS "主机IP: $hostIp"
    echo "> Record Type: $recordType"
    logger -t DNSpod_DDNS "记录类型: $recordType"
    if [ $errCode -ne 0 ]; then
        return 1
    fi

    echo "Fetching Ids of $2.$1"
    logger -t DNSpod_DDNS "抓取Id: $2.$1"
    ddnsIds=$(arDdnsIds "$recordType" "$1" "$2")

    errCode=$?
    echo "> Domain Ids: $ddnsIds"
    logger -t DNSpod_DDNS "域名Ids: $ddnsIds"
    if [ $errCode -ne 0 ]; then
        return 1
    fi

    echo "Checking Record for $2.$1"
    logger -t DNSpod_DDNS "检查记录:$2.$1"
    lastIp=$(arDdnsRecordIp $ddnsIds)

    errCode=$?
    echo "> Last Ip: $lastIp"
    logger -t DNSpod_DDNS "上一次的IP: $lastIp"
    if [ $errCode -ne 0 ]; then
        return 1
    fi

    if [ "$lastIp" = "$hostIp" ]; then
        echo "> Last Ip is the same as host Ip"
        logger -t DNSpod_DDNS "> 上一次的IP与主机记录值相同 <"
        return 0
    fi

    echo "Updating Record for $2.$1"
    logger -t DNSpod_DDNS "Updating Record for $2.$1"
    postRs=$(arDdnsUpdate $ddnsIds "$2" "$hostIp" "$recordType")

    errCode=$?
    echo "> $postRs"
    logger -t DNSpod_DDNS "> $postRs"
    if [ $errCode -ne 0 ]; then
        return 1
    fi

}
arToken=12345,7676f344eaeaea9074c123451234512d
arDdnsCheck test.org subdomain

到了这里,关于使用老毛子在腾讯云DNSpod上实现DDNS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 群晖折腾记1—群晖NAS使用docker中的ddns-go,DDNS阿里云ali实现Ipv6访问

    1、移动宽带只有IPv6公网地址,若你的宽带为电信或联通,它们都可以申请到公网IPv4地址,不需要这么复杂。 2、主路由为小米AX9000(虽然是定制OpenWrt系统,但是固件真的很辣鸡, 已开启SSH ),若你的路由器为其它系统,可以参考思路。 3、路由器拨号,怎么设置光猫桥接自己

    2024年02月13日
    浏览(65)
  • 老毛子padavan实现修改自定义ssh端口和ipv6外网访问

    本文目的:padavan下,自定义 SSH 端口 并实现 ipv6 外网访问 本文记录于 2022年4月10日,随着固件更新可能会存在变动。 最近在倒腾路由器固件,使用的是 hiboy 大的 padavan 固件。 在 WebUI 中,可以启用内网下 22 端口的服务,并通过端口转发实现 ipv4 下的外网访问,但是 ipv6 暂时

    2024年02月05日
    浏览(56)
  • 实现阿里云域名的DDNS

    我们在使用ddns的时候会不会遇到这样的问题:路由器只支持指定的域名服务提供商或者是指定的域名,比如我的华为路由器就只支持花生壳: 我想看到这篇文章的小伙伴们应该都把域名注册到中国最大的域名注册服务商阿里云上,那么我们要怎么实现阿里云的DDNS呢?我们接

    2024年02月09日
    浏览(40)
  • Ubuntu安装ddns-go使用阿里ddns解析ipv6

    DDNS-GO是简单好用的DDNS,它可以帮助你自动更新域名解析到公网IP。比如你希望在本地部署网站,但是因为公网IP是动态的,无法使用常用的DNS解析到固定的公网IP上,如果一直前往DNS控制台更改DNS解析就会很繁琐。而DDNS-GO就能解决这一难题,帮助你自动更改DNS解析! 设备:树

    2024年02月03日
    浏览(52)
  • 利用Python+阿里云实现DDNS(动态域名解析)

    因需求公司路由器公网ip不是动态的,需要及时的修改阿里云的域名解析 前期准备 aliyunsdkcore.acs_exception.exceptions.ClientException 如果出现该报错:aliyunsdkcore.acs_exception.exceptions.ClientException: SDK.HttpError (‘Connection aborted.’, ConnectionResetError(104, ‘Connection reset by peer’)) 安装另一个核

    2024年02月06日
    浏览(47)
  • iStoreOS 使用 阿里云 ddns + https

    在阿里云上购买一个域名 .cn 价位大概在 40 rmb 一年 然后你要为这个域名备案。国内的没办法。(如果不想这么麻烦可以找其他域名备案商) 申请一个 AccessKey 子账号 AliyunDNSFullAccess 点击确定。阿里云上的操作就告一段落了 下面是iStoreOS 在服务中找到 动态DNS 选项卡 点开 点击

    2024年01月16日
    浏览(42)
  • 群晖docker实现阿里云动态公网域名解析ddns服务

    日常生活中,一般家庭用户宽带使用的都是内网ip,如果需要在外网就是远程使用,需要将家庭ip向电信部门申请变更为公网ip,通常情况下,我们获得的都是动态公网ip,这种ip每隔一段时间都会自动变化,这样如果想通过一个不变的域名地址来访问,就需要dns动态来解析到变

    2024年02月05日
    浏览(53)
  • 怎么使用ddns域名,举个例子,列出详细步骤

    使用DDNS域名的步骤如下: 选择一个DDNS服务提供商,比如No-IP或DynDNS。 在DDNS服务提供商的网站上注册一个账号,并创建一个域名。 在路由器上设置DDNS,将刚刚创建的域名与您的账号信息关联起来。 测试您的域名是否可以访问您的网络。 如果您有防火墙,请确保允许对您的

    2024年02月14日
    浏览(37)
  • ubuntu安装ddns-go实现内网穿透

    ddns-go 是一个用Go语言编写的动态DNS客户端,可以将动态IP地址映射到固定的域名,从而实现内网穿透。 在Ubuntu上安装和配置 ddns-go 的步骤如下: 目录 安装Go语言环境 获取ddns-go源码 编译和安装ddns-go 配置ddns-go 运行ddns-go 设置ddns-go为开机自启动(可选) 安装Go语言环境 首先,

    2024年01月24日
    浏览(48)
  • python3对接godaddy API,实现自动更改域名解析(DDNS)

    文章开始前,先解释下如下问题: ①什么是域名解析? 域名解析一般是指通过一个域名指向IP地址(A解析),然后我们访问这个域名就可以有直接访问这个IP地址的效果,只需要记住域名即可,无需记住IP。 ②什么是DDNS? DDNS是动态域名解析,一个域名可以根据IP的变化,自动

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包