DDNS 服务搭建

一 、简介

DDNS(动态域名服务)是将用户的动态公网ip地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态公网ip地址推送到服务商的域名解析上,服务商提供dns服务进行域名解析

二、环境

  • 域名(以aliyun为例)
  • linux主机

三、准备

1、购买域名

本文是基于aliyun平台做的实验

2、添加解析记录

在这里插入图片描述

3、浏览器按F12 进入开发者模式获取recordId值

在这里插入图片描述

4、4、获取accessKeyId、accesssKeySecret值

在这里插入图片描述

四、编写脚本

脚本是基于python 环境写的

1、安装python aliyun模块

pip3 install aliyun-python-sdk-core
pip3 install aliyun-python-sdk-alidns
pip3 install requests

2、脚本

脚本参考:https://blog.51cto.com/u_15060510/4373806

import json,datetime
from json import load
from urllib.request import urlopen
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
i = str(datetime.datetime.now())
newip = load(urlopen('https://api.ipify.org/?format=json'))['ip']
AccessKey_ID = '<accessKeyId>'                                # 填入accessKeyId
Access_Key_Secret = '<accesssKeySecret>'                      # 填入accesssKeySecret
region_id = "<recordId>"                                      # 填入recordId
DomainName = '<域名>'                                          # 填入域名(如:baidu.com)
RR = '<二级域名>'                                               # 填入二级域名(如:www)
DomainType = 'A'
UpdateDomain = 'Auto_Lines'
def AliAccessKey(id,Secret,region):
        client = AcsClient(id, Secret, region)
        return client
def GetDNSRecordId(client,DomainName):
        request = DescribeDomainRecordsRequest()
        request.set_accept_format('json')
        request.set_DomainName(DomainName)
        response = client.do_action_with_exception(request)
        json_data = json.loads(str(response, encoding='utf-8'))
        for RecordId in json_data['DomainRecords']['Record']:
            if RR == RecordId['RR']:
                return RecordId['RecordId']
def UpdateDomainRecord(client,RecordId):
    try:
        request = UpdateDomainRecordRequest()
        request.set_accept_format('json')
        request.set_Value(newip)
        request.set_Type(DomainType)
        request.set_RR(RR)
        request.set_RecordId(RecordId)
        client.do_action_with_exception(request)
        print("域名:" + DomainName + " 主机:" + RR + " 记录类型:" +  DomainType + " 记录值:" +  newip)
    except Exception as e:
        print(i + '    DNS已经更新')
def main():
    client = AliAccessKey(AccessKey_ID,Access_Key_Secret,region_id)
    RecordId = GetDNSRecordId(client,DomainName)
    UpdateDomainRecord(client,RecordId)
if __name__ == "__main__" :
    main()

3、在python环境运行即可,如自动更新可以在linux写定时任务

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱哭的猫!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值