排行榜

利用python脚本实现自动阿里云域名DNS解析

本文阅读 5 分钟
首页 运维中心 正文
广告

内网穿透的最大难题无非就是家里是动态公网IP,每变换一次公网IP,需要重新解析一次域名。而阿里云等大型的云服务商,目前都已经实现了域名解析管理的API接口,而且基本都是立即就可生效 。

所以我的思路就是,系统运行一个定期执行的程序,每隔一段时间扫描一下最新的公网IP,如果发现最新的公网IP与域名解析到的IP地址不一致,就通过阿里云API自动更新解析设置即可。这样的花费不过每年一个域名的费用,最贵也就几十块钱。

具体实现步骤如下:


阿里云设置

首先,要确定一个准备用于外网访问的域名,并将此域名转入到阿里云的云解析服务来解析。如图所示,添加需要管理的域名。

10774034-94a0c10675a859c3.webp


转入后,在解析设置中,设置一下A记录解析,解析的IP地址可以填当前的公网IP。如果不知道自己的公网IP,在CentOS系统下,可以输入使用以下命令获取当前的公网IP。


curl ifconfig.me


这里要注意,如果你查出来的ip是100.xxx开头的(也并不一定,只要这样查出来的ip和百度搜ip出来的结果不一致,那就属于这个情况),这个并不是公网ip,ipv4紧缺,电信把一个片区设置成了同一个局域网,整个片区共用同一个ip了。直接访问这个ip是访问不了本地这台服务器的。只能打电话给电信,让开通私有的公网ip。


获取公网IP后,在阿里云云解析中设置完A记录解析。

10774034-39b8f1f82abe9d4d.webp


在阿里云账户管理后台,点击右上角的账户头像,然后点击accesskeys,或者直接登陆

https://ram.console.aliyun.com/manage/ak,获取阿里云的AccessKeyIDAccessKeySecret


路由器设置

阿里云的设置完成后,需要对路由器设置端口映射,使外网对公网IP的端口访问能转发到内网服务器的相应端口。绝大部分的路由器都支持端口映射。常见的服务端口包括,用于WEB访问的80端口、SSH远程管理的22端口、Mysql数据库的3306端口、Transmission下载服务管理的9091端口和Plex媒体服务的32400端口等等。不用花生壳的好处就是没有端口数量限制,想设置多少就可以设置多少当然,在设置端口映射之前,应确保服务器的内网IP已经设置为静态IP,而不是DHCP动态获取。


服务器设置

服务器端安装好想要使用的各种服务后,别忘了在防火墙中开启相应的端口,在CentOS 7中,防火墙永久开启端口的命令是:

firewall-cmd --add-port=80/tcp --permanent


开启之后别忘了重新载入防火墙的设置以使其生效,命令如下:

firewall-cmd --reload


自动更新域名解析程序

准备工作都做好了,接下来就是通过程序检测公网IP,并在公网IP发生变化时,及时更新阿里云的域名解析。这个程序是用Python写的,先使用Python的包管理工具pip下载安装阿里云的Python SDK。如果没有安装pip,则先安装pip:

yum install pip


安装好pip后,安装阿里云的Python核心SDK以及云解析SDK:

pip install aliyun-python-sdk-alidns
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-core-v3
pip install aliyunsdkcore


完整代码如下:

import json
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
import datetime

#    access_key_id = "-------------"
#    access_key_secret = "---------"

i = str(datetime.datetime.now())
newip = load(urlopen('https://api.ipify.org/?format=json'))['ip']
AccessKey_ID = '-------------'
Access_Key_Secret = '-------------'

region_id = "cn-chengdu"
DomainName = 'xxx.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("domain:" + DomainName + " host:" + RR + " record_type:" +  DomainType + " record:" +  newip)
    except Exception as e:
        print(i + '    DNS-updated')
def main():
    client = AliAccessKey(AccessKey_ID,Access_Key_Secret,region_id)
    RecordId = GetDNSRecordId(client,DomainName)
    UpdateDomainRecord(client,RecordId)
if __name__ == "__main__" :
    main()


将以上代码保存为dns.py文件,并赋予执行权限:

chmod +x dns.py


采用定时任务进行更新

每10分钟运行一次


root@www180:~ # crontab -l
*/10 * * * *  /opt/ddns.py


好了,大功告成,接下来,程序会每隔10分钟自动扫描公网IP,然后自动更新阿里云的解析,速度、稳定性和安全性都远胜于第三方的DDNS服务。


本文经授权后发布,本文观点不代表立场,文章出自:https://www.jianshu.com/p/291a3a5283ac
利用frp+nginx实现外网通过域名访问内网网站
« 上一篇 07-06
windows手动添加开机自动启动软件
下一篇 » 07-25
广告

相关推荐