Linux服务器使用腾讯云DnsPod添加ipv6DDNS(动态域名解析)

1.引言

IPv6地址已经投入使用很多年了,得益于IPv6地址数量众多,现在大部分的宽带运营商都会为我们提供公网IPv6地址,但这个地址并不是静态的,而是会变化的,为了能够在外网访问我们的电脑,我们可以使用ddns来解决这个问题,以下教程讲述的是如何使用腾讯云dnspod进行动态域名解析。(此方法也可以使用其他nds提供商,步骤基本是一样的)

2.实现思路

因为我们的ipv6地址会不断变化,那我们只需要每隔一段时间,就自动向dns服务商更新我们的域名所对应的ip地址就行了

3. 本教程使用的前置条件

3.1 确认你的服务器ipv6地址为公网ipv6 (非fe80 开头,fe80开头为局域网ipv6地址)

3.2 你拥有一个腾讯云dnspod的域名

3.3 下载winScp软件并安装

WinScp下载,安装,连接,添加putty教程 - Aiferu

4.实现步骤

4.1 获取腾讯云DnsPod的api和token

点击下方链接进入DnsPod管理控制台

管理控制台 - DNSPod

img进入网页并登录后显示如上图

img点击右上角账号头像,选择API密钥并点击

img点击DNSPod Token 按钮

img点击创建密钥

img随便填个名字,点击确定

img将以上信息复制保存,这些信息只显示一次,我们等会回用到其中的ID和Token

dnsPod的ID和Token我们便已经获取完成了

4.2 在dnspod中添加我们的域名解析记录

img可以参考我的这条记录,ip地址随便填一个,等会我们回使用代码自动更新ip地址

4.3 将以下脚本文件传入我们的服务器根目录

脚本文件可以选择下载下面的,也可以选择自己创建,请按照脚本中的注释写上自己的信息

脚本文件下载

#!/usr/bin/bash    
dnspod_ddnsipv6_id="#####" #【API_id】将引号内容修改为获取的API的ID
dnspod_ddnsipv6_token="#####" #【API_token】将引号内容修改为获取的API的token
dnspod_ddnsipv6_ttl="600" # 【ttl时间】解析记录在 DNS 服务器缓存的生存时间,默认600(s/秒)
dnspod_ddnsipv6_domain='#####' #【已注册域名】引号里改成自己注册的域名
dnspod_ddnsipv6_subdomain='#####' #【二级域名】将引号内容修改为自己想要的名字,需要符合域名规范,附常用的规范
local_net="eth0" # 【网络适配器】 默认为eth0,如果你的公网ipv6地址不在eth0上,需要修改为对应的网络适配器
# 常用的规范【二级域名】
# 【www】 常见主机记录,将域名解析为 www.test.com
# 【@】   直接解析主域名 test.com
# 【*】   泛解析,匹配其他所有域名 *.test.com
#  改进了非fe80开头内网地址被误解析的错误。ps:仅支持中国电信,中国联通,中国移动使用,若国外ipv6无法解析请自行修改脚本。
# 举例
# 在腾讯云注册域名,登陆DNSPOD,在【我的账号】的【账号中心】中,有【密钥管理】
# 点击创建密钥即可创建一个API
# 如果你在腾讯云注册域名叫【test.com】
# 那么【dnspod_ddnsipv6_domain】后面就填【test.com】
# 然后根据常用的规范/自己想要的名字在【dnspod_ddnsipv6_subdomain】填入自己需要的名字
# 现假设为【file】,那么你的访问地址为【file.test.com】
if [ "$dnspod_ddnsipv6_record" = "@" ]
then
  dnspod_ddnsipv6_name=$dnspod_ddnsipv6_domain
else
  dnspod_ddnsipv6_name=$dnspod_ddnsipv6_subdomain.$dnspod_ddnsipv6_domain
fi

die () {
    echo "Error: unable to find [public IPv6 address], please use the 'ip addr' command or query the network panel of the system to check the network card, and fill in the name of the network card with the IPv6 address in the 'local_net' position in the command file." >&2
    echo "IP地址提取错误: 在指定的网络适配器上[$local_net]找不到<公网IPv6地址>(不是fe80开头),请使用'ip addr'命令或在系统的网络面板查询有公网IP的网络适配器,然后在脚本的[local_net]中用填写网络适配器的名称。" >&2
    exit
}

ipv6_list=`ip addr show $local_net | grep inet6 | sed 's/\/.*//g' | awk '{print $2}'  | grep 24 |  awk 'NR==1{print}'` || die

for ipv6 in ${ipv6_list[@]}
do
    if [[ "$ipv6" =~ ^fe80.* ]]
    then
        continue
    else
        echo select IP: $ipv6 >&1
        break
    fi
done

if [ "$ipv6" == "" ] || [[ "$ipv6" =~ ^fe80.* ]]
then
    die
fi

dns_server_info=`nslookup -query=AAAA $dnspod_ddnsipv6_name 2>&1`

dns_server_ipv6=`echo "$dns_server_info" | grep 'address ' | awk '{print $NF}'`
if [ "$dns_server_ipv6" = "" ]
then
    dns_server_ipv6=`echo "$dns_server_info" | grep 'Address: ' | awk '{print $NF}'`
fi
    
if [ "$?" -eq "0" ]
then
    echo "DNS server IP: $dns_server_ipv6" >&1

    if [ "$ipv6" = "$dns_server_ipv6" ]
    then
        echo "The address is the same as the DNS server." >&1
    fi
    unset dnspod_ddnsipv6_record_id
else
    dnspod_ddnsipv6_record_id="1"   
fi

send_request() {
    local type="$1"
    local data="login_token=$dnspod_ddnsipv6_id,$dnspod_ddnsipv6_token&domain=$dnspod_ddnsipv6_domain&sub_domain=$dnspod_ddnsipv6_subdomain$2"
    return_info=`curl -X POST "https://dnsapi.cn/$type" -d "$data" 2> /dev/null`
}

query_recordid() {
    send_request "Record.List" ""
}

update_record() {
    send_request "Record.Modify" "&record_type=AAAA&record_line=默认&ttl=$dnspod_ddnsipv6_ttl&value=$ipv6&record_id=$dnspod_ddnsipv6_record_id"
}

add_record() {
    send_request "Record.Create" "&record_type=AAAA&record_line=默认&ttl=$dnspod_ddnsipv6_ttl&value=$ipv6"
}

if [ "$dnspod_ddnsipv6_record_id" = "" ]
then
    echo "seem exists, try update." >&1
    query_recordid
    code=`echo $return_info  | awk -F \"code\":\" '{print $2}' | awk -F \",\"message\" '{print $1}'`
    echo "return code $code" >&1
    if [ "$code" = "1" ]
    then
        dnspod_ddnsipv6_record_id=`echo $return_info | awk -F \"records\":.{\"id\":\" '{print $2}' | awk -F \",\"ttl\" '{print $1}'`
        update_record
        echo "update sucessful" >&1
    else
        echo "error code return, domain not exists, try add." >&1
        add_record
        echo "add sucessful." >&1
    fi
else
    echo "domain not exists, try add."
    add_record
    echo "add sucessful" >&1
fi

使用WinScp将修改好的文件传输到服务器

打开WinScp,连接上我们的服务器,点击进入root路径,然后将我们的文件拖入root文件夹中

不知道怎么使用的请访问:服务器搭建:WinScp下载,安装,连接,添加putty教程 – アイフェルの個人ニブログ (aiferu.xyz)

img

img将鼠标放在我们的文件上,右键选择属性

img将x全部打勾,添加权限

使用putty运行一下我们的脚本

不知道如何使用putty,请访问:服务器搭建:WinScp下载,安装,连接,添加putty教程 – アイフェルの個人ニブログ (aiferu.xyz)

输入:

 ./dnspod-v6.sh

回车确认。

再次查看解析记录,我们的ip已经更新上去了。

img

下面我们只需要让电脑定时运行一下代码,就可以实时动态更新我们的ipv6地址了。

4.4 设置定时任务

定时执行任务我们会用到Linux中的crontab工具,如果你是在群晖等nas系统中使用的话,请自行百度相关定时任务如何设置

下面链接讲述的是如何在centos7中设置定时任务,其他Linux系统设置与其大同小异

(25条消息) Centos7 设置定时任务_Undefind_object的博客-CSDN博客_centos 定时任务

设置完成之后,我们就实现了ipv6的ddns。

5.参考

【IPV6 DDNS】简单快速使用腾讯DNSPOD进行群辉LINUX的动态域名解析_哔哩哔哩_bilibili

最后修改:2023 年 10 月 10 日
如果觉得我的文章对你有用,请随意赞赏