利用阿里云 OpenAPI 以及 DNS 云解析自建 DDNS 动态域名解析服务

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 家里闲置着一台老款的Mac mini Server,跑OS X越来越慢,索性装上了Cent OS 7,变成了一台家庭服务器,装上了Plex媒体服务器和Transmission下载服务,同时,也装上了Nginx、Mysql、MongoDB、Redis等,可以调试代码,甚至担当一些小型项目的服务器。不过,只在家庭内网使用,功能太有限,于是接下来面临的一个问题就是内网穿透。使用过花生壳和花生棒,服务相当不稳定,而且种种受限,每要多加一个端口就要多花钱,安全性也有问题。

概述

家里闲置着一台老款的Mac mini Server,跑OS X越来越慢,索性装上了Cent OS 7,变成了一台家庭服务器,装上了Plex媒体服务器和Transmission下载服务,同时,也装上了Nginx、Mysql、MongoDB、Redis等,可以调试代码,甚至担当一些小型项目的服务器。
不过,只在家庭内网使用,功能太有限,于是接下来面临的一个问题就是内网穿透。使用过花生壳和花生棒,服务相当不稳定,而且种种受限,每要多加一个端口就要多花钱,安全性也有问题。
其实想想,内网穿透的最大难题无非就是家里是动态公网IP,每变换一次公网IP,需要重新解析一次域名。而阿里云等大型的云服务商,目前都已经实现了域名解析管理的API接口,而且基本都是立即就可生效 。
所以我的思路就是,系统运行一个定期执行的程序,每隔一段时间扫描一下最新的公网IP,如果发现最新的公网IP与域名解析到的IP地址不一致,就通过阿里云API自动更新解析设置即可。这样的花费不过每年一个域名的费用,最贵也就几十块钱。

具体实现步骤

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

阿里云云解析服务

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

> curl ifconfig.me

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

在阿里云账户管理后台,点击右上角的账户头像,然后点击accesskeys,或者直接登陆 https://ak-console.aliyun.com,获取阿里云的AccessKeyID和AccessKeySecret。

  1. 路由器设置
    阿里云的设置完成后,需要对路由器设置端口映射,使外网对公网IP的端口访问能转发到内网服务器的相应端口。绝大部分的路由器都支持端口映射。

常见的服务端口包括,用于WEB访问的80端口、SSH远程管理的22端口、Mysql数据库的3306端口、Transmission下载服务管理的9091端口和Plex媒体服务的32400端口等等。不用花生壳的好处就是没有端口数量限制,想设置多少就可以设置多少。
当然,在设置端口映射之前,应确保服务器的内网IP已经设置为静态IP,而不是DHCP动态获取。

  1. 服务器设置
    服务器端安装好想要使用的各种服务后,别忘了在防火墙中开启相应的端口,在CentOS 7中,防火墙永久开启端口的命令是:
> firewall-cmd --add-port=80/tcp --permanent

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

> firewall-cmd --reload
  1. 自动更新域名解析程序
    准备工作都做好了,接下来就是通过程序检测公网IP,并在公网IP发生变化时,及时更新阿里云的域名解析。

这个程序是用Python写的,先使用Python的包管理工具pip下载安装阿里云的Python SDK。如果没有安装pip,则先安装pip:

> yum install pip

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

> pip install aliyun-python-sdk-core
> pip install aliyun-python-sdk-alidns

导入项目所需要的包,如果缺少则使用pip安装:

import os
import json
from urllib2 import urlopen
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest

完整代码如下:

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

import os
import json
from urllib2 import urlopen
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest

class DnsHandler:
    # 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secret
    access_key_id = ""
    access_key_secret = ""

    # 填入自己的域名
    domain_name = ""
    # 填入二级域名的RR值
    rr_keyword = ""

    # 解析记录类型,一般为A记录
    record_type = "A"

    # 用于储存解析记录的文件名
    file_name = ".ip_addr"

    client = None
    record = None
    current_ip  = ''

    # 初始化,获取client实例
    def __init__(self):
        self.client = AcsClient(
            self.access_key_id,
            self.access_key_secret,
            self.region_id
        )
        self.record = self.get_record()
        self.current_ip = self.get_current_ip()

    # 如果公网IP发生变化,则自动修改阿里云解析记录
    def reset(self):
        if self.current_ip <> self.get_record_value():
            print self.update_record(self.current_ip)
            self.get_record()

    # 获取阿里云域名解析完整记录,并使用文件缓存
    def get_record(self):
        if os.path.isfile(self.file_name) :
            file_handler = open(self.file_name, 'r')
            r = file_handler.read()
            file_handler.close()
        else :
            request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
            request.set_PageSize(10)
            request.set_action_name("DescribeDomainRecords")
            request.set_DomainName(self.domain_name)
            request.set_RRKeyWord(self.rr_keyword)
            request.set_TypeKeyWord(self.record_type)
            r = self.client.do_action_with_exception(request)
            file_handler = open(self.file_name, 'w')
            file_handler.write(r)
            file_handler.close()
        return json.loads(r)

    # 获取阿里云域名解析记录ID
    def get_record_id(self) :
        return self.record["DomainRecords"]["Record"][0]["RecordId"]

    # 获取当前域名解析记录
    def get_record_value(self) :
        return self.record["DomainRecords"]["Record"][0]["Value"]

    # 修改阿里云解析记录
    def update_record(self, value):
        request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
        request.set_action_name("UpdateDomainRecord")
        request.set_RecordId(self.get_record_id())
        request.set_Type(self.record_type)
        request.set_RR(self.rr_keyword)
        request.set_Value(value)
        return self.client.do_action_with_exception(request)

    # 获取当前公网IP
    def get_current_ip(self):
        return json.load(urlopen('http://jsonip.com'))['ip']

# 实例化类并启动更新程序
dns = DnsHandler()
dns.reset()

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

> chmod +x dns.py
  1. 设置定时运行
    CentOS内置有强大的计划任务工具Crontab,如果系统里没有则先使用yum安装:
> yum install crontabs

首先,设置执行用户的环境变量,比如,我们使用root用户来执行这一程序,则先在用户目录下建立.profile文件,或者在已有的.profile文件下加入如下一行,以使得可以使用VI来编辑cron文件:

EDITOR=vi; export EDITOR

建立mycron文件,加入如下内容:

*/10 * * * * /root/ddns/dns.py

这意味着每10分钟执行一次任务,即扫描公网IP,若与阿里云解析不一致,则修改阿里云解析。
然后,提交crontab任务:

> crontab mycron

总结

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

参考文献

版权

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

原创作者 10086@xiaoi.me 发表于阿里云·云栖社区:https://yq.aliyun.com/users/y4epujtm5wye6

扫码关注我,在线与我沟通、咨询
image

转载请保留原文链接以及版权信息

相关文章
|
23天前
|
Dubbo 应用服务中间件 API
使用 Apifox、Postman 测试 Dubbo 服务,Apache Dubbo OpenAPI 即将发布
Apache Dubbo 3.3.3(即将发布)实现了与 OpenAPI 的深度集成,通过与 OpenAPI 的深度集成,用户能够体验到从文档生成到接口调试、测试和优化的全流程自动化支持。不论是减少手动工作量、提升开发效率,还是支持多语言和多环境,Dubbo 3.3.3 都展现了其对开发者体验的极大关注。结合强大的 Mock 数据生成和自动化测试能力,这一版本为开发者提供了极具竞争力的服务治理解决方案。如果你正在寻找高效、易用的微服务框架,Dubbo 3.3.3 将是你不容错过的选择。
|
4月前
|
弹性计算 网络安全
阿里云国际OpenAPI多接口快速管理ECS服务器教程
阿里云国际OpenAPI多接口快速管理ECS服务器教程
|
3月前
|
域名解析 网络协议 安全
反向DNS解析是从IP地址到域名的映射,主要作用于验证和识别,提高通信来源的可信度和可追溯性
在网络世界中,反向DNS解析是从IP地址到域名的映射,主要作用于验证和识别,提高通信来源的可信度和可追溯性。它在邮件服务器验证、网络安全等领域至关重要,帮助识别恶意行为,增强网络安全性。尽管存在配置错误等挑战,但正确管理下,反向DNS解析能显著提升网络环境的安全性和可靠性。
232 3
|
4月前
|
IDE API 开发工具
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
Alibaba Cloud API Toolkit for VSCode 是集成了 OpenAPI 开发者门户多项功能的 VSCode 插件,开发者可以通过这个插件方便地查找API文档、进行API调试、插入SDK代码,并配置基础环境设置。我们的目标是缩短开发者在门户和IDE之间的频繁切换,实现API信息和开发流程的无缝结合,让开发者的工作变得更加高效和紧密。
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
|
8月前
|
存储 监控 数据可视化
基于阿里云 OpenAPI 插件,让 Grafana 轻松实现云上数据可视化
本文旨在提供一个指导性的框架,帮助用户了解插件的安装、配置以及探索如何通过 Grafana 内的阿里云 OpenAPI 插件来对云上数据进行可视化和快速验证开发原型,加强数据可视化和云监控能力,助力开发速度。
33618 24
|
6月前
|
域名解析 监控 负载均衡
【域名解析DNS专栏】智能DNS解析:自动选择最快服务器的奥秘
在互联网中,智能DNS解析作为一项先进技术,根据用户的网络环境和服务器负载情况,自动挑选最优服务器进行域名解析,显著提升访问速度与体验。其工作原理包括实时监控服务器状态、分析数据以选择最佳路由。通过负载均衡算法、地理位置识别及实时性能测试等策略,确保用户能获得最快的响应。这项技术极大提高了互联网服务的稳定性和效率。
208 5
|
6月前
|
域名解析 网络协议 数据中心
【应用服务 App Service】当遇见某些域名在Azure App Service中无法解析的错误,可以通过设置指定DNS解析服务器来解决
【应用服务 App Service】当遇见某些域名在Azure App Service中无法解析的错误,可以通过设置指定DNS解析服务器来解决
|
7月前
|
人工智能 自然语言处理 API
深度融合与创新:Open API技术促进AI服务生态构建
【7月更文第21天】在数字化转型的浪潮中,人工智能(AI)已从概念探索走向实际应用,深刻改变着各行各业。Open API(开放应用程序接口)作为连接技术与业务的桥梁,正成为推动AI服务普及和生态构建的关键力量。本文将探讨Open API技术如何通过标准化、易用性和灵活性,加速AI服务的集成与创新,构建一个更加丰富多元的AI服务生态系统。
349 2
|
6月前
|
IDE API 开发工具
通过IDE插件体验阿里云OpenAPI的高效集成, 精品礼品等你来拿!
轻量级的开放API工具——Alibaba Cloud Developer Toolkit及Alibaba Cloud API Toolkit。这些插件支持快速查阅阿里云产品的开放API,提供API调试与SDK示例生成等功能,帮助开发者轻松集成阿里云服务。您可通过JetBrains Marketplace或VS Code Marketplace搜索安装,完成身份验证后即刻体验。欢迎分享您的使用反馈,有机会获得精美礼品!
|
7月前
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之OpenAPI列表可以在什么地方查看
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。

相关产品

  • 云解析DNS
  • 推荐镜像

    更多