我是怎样配置DDNS的?

   

前言

其实,完成ddns很简单,只要有一个动态的公网IP,你可以借助向日葵、 DynDNS之类的ddns服务提供商的服务,也可以把路由器刷成梅林固件使用阿里云ddns插件,或者在群晖里使用Docker配置大神做的ddns镜像,而我比较懒,情况有比较特殊:本身具有动态公网IP,家里路由器下面挂了一台群辉,群晖里配置了zabbix-agent,有一台阿里云ECS服务器,此服务器上搭建了一套zabbix系统,同时我还不想刷路由器,也不想使用Docker压榨群晖的那点性能,也就是说ddns脚本必须运行在服务器端,zabbix检测到IP地址变更自动执行脚本更改阿里云解析。

一、zabbix配置

首先,要有一个监控项监测着群晖系统的IP地址,10分钟一次或者一小时监测一次全看你,这样zabbix的数据库里就会一直有公网IP的地址了,然后配置触发器,一旦触发就执行脚本。

触发器被触发之后,自动进行新的ip地址的解析,还需要设置动作和全局脚本

二、阿里云设置

accessKeyId和accessSecret可以在阿里云控制台个人中心直接获取,但是一般建议使用RAM角色来进行权限控制,这样这个accessKey和accessSecret就只能操作域名,不能操作其他的资源,相对会比较安全,建立RAM账户并进行授权,只允许进行解析操作,不允许控制台登录,官方文档点这里,获取到accessKeyId和accessSecret之后,填入相对应的函数中即可。

三、 python脚本

脚本使用的python,这个看个人喜好,首先要先配置好python3的环境,我是centos系统,其他系统类似。

# yum install python3
# python3 -m pip install aliyun-python-sdk-core
# python3 -m pip install aliyun-python-sdk-domain
# python3 -m pip install aliyun-python-sdk-alidns
# python3 -m pip install PyMySQL

代码贴出来,以供参考:

#!/usr/bin/env python
#coding=utf-8

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
import json
import sys
import pymysql
import re

conn = pymysql.connect('localhost','username','password','dbname')
cursor = conn.cursor()
sql = "SELECT value FROM `history_text`order by clock desc limit 1"
cursor.execute(sql)
data = cursor.fetchone()

client = AcsClient('AccessKeyId', 'AccessKeySecret', 'cn-hangzhou')
def Describe_SubDomain_Records(client,record_type,subdomain):
    request = DescribeSubDomainRecordsRequest()
    request.set_accept_format('json')

    request.set_SubDomain(subdomain)  
    request.set_Lang("en")
    request.set_Type("A")

    response = client.do_action_with_exception(request)
    response = str(response, encoding='utf-8')
    relsult = json.loads(response)
    return relsult

des_relsult = Describe_SubDomain_Records(client,"A","www.yourdomain.win")
des_relsult["TotalCount"]
des_relsult["DomainRecords"]["Record"][0]["RecordId"]

def update_record(client,priority,ttl,record_type,value,rr,record_id):
    request = UpdateDomainRecordRequest()
    request.set_accept_format('json')

    request.set_Priority(priority)
    request.set_TTL(ttl)
    request.set_Value(value)
    request.set_Type(record_type)
    request.set_RR(rr)
    request.set_RecordId(record_id)

    response = client.do_action_with_exception(request)
    response = str(response, encoding='utf-8')
    return response

#函数调用
record_id = des_relsult["DomainRecords"]["Record"][0]["RecordId"]
result = re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", str(data))
result="".join(result)
update_record(client,"5","600","A",result,"www",record_id)

cursor.close()
conn.close()

发表评论