群晖DDNS解析

网上关于DDNS解析的介绍已经很多了,我这里主要列举通过阿里云和Cloudflare进行解析。使用两个解析的原因是阿里云的域名必须要备案,不然会被阿里云封掉(阿里云解析的域名如果解析的IP不是阿里云服务器的,还会提示要求使用阿里云服务器。)。而Cloudflare不用备案,可以直接用。在阿里云申请的域名可以在阿里云上配置为通过Cloudflare解析。当然不只Cloudflare,其实有很多提供DNS解析服务的厂商都提供了DNS的API,就不一一列举了。
在这里插入图片描述
如果买的群晖服务器的话,本身群晖会送一个域名,也会自动做DDNS解析,不需要自己折腾。如果没有群晖的服务器或者想用自己的已经申请的域名,就需要自己做DDNS解析。DDNS解析说白了就是调用第三方提供的更新DNS的API。
步骤如下:

  1. 获取当前的公网IP;
  2. 对比当前公网IP是否变化;
  3. 若发生变化则更新DNS解析。

下面是具体实现过程,我通过python来实现。

1.获取当前的公网IP

获取公网ip目前我有四种方式:

  1. 通过www.ifconfig.me获取,因为群晖本身也是linux环境,代码跑在群晖上,可以直接curl www.ifconfig.me -s得到公网ip。不过这个网站好像是国外的,有时候访问很慢,可能会获取超时,这时候可以尝试其他方式。
  2. 通过200019.ip138.com获取,这是国内的获取ip,百度上搜ip就是调用的这个网站的。优点速度快,缺点要自己分析页面提取ip。
  3. 自己搭一个nginx服务器,然后配置nginx获取真实IP。优点不会受制于别人,获取方便。缺点是有个服务器,要自己部署个程序。
  4. 自己写代码解析获取真实IP,这个我没试过,理论上也是可以的,不然nginx怎么能拿到的?

nginx获取公网ip,配置如下:

   server {listen       80;server_name  localhost;location / {default_type text/html;return 200 "$remote_addr";}}

可以测试下: curl http://localhost

下面的代码中实现了前两种方式,其实我也实现了第三种方式,但我自己的域名安全起见,不方便公开,代码就不公布了,其实也简单,就是一个request发送get请求就好了。

# -*- coding:UTF-8 -*-
import re
import subprocessimport requestsfrom util.tonggu_logger import TongguLoggerlogger = TongguLogger().getLogger()"""get network ip@version: python3.x@author: wangjf@software: PyCharm@file: collect.py@time: 2019/7/8 19:30
"""
def get_network_ip():ip = getIpFromIfConfig()if ip is None:ip = getIpFromIp138()if len(ip) == 0:return None# extract ipresult = re.findall(r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b", ip)if result:return result[0]return None"""get ip from www.ifconfig.me@version: python3.x@author: wangjf@software: PyCharm@file: collect.py@time: 2019/7/8 19:30
"""
def getIpFromIfConfig():try:logger.info("start get ip from www.ifconfig.me")rows = subprocess.getoutput('curl www.ifconfig.me -s')if rows:logger.info("get ip %s" % rows)ip = rowselse:raise Exception('get ip from www.ifconfig.me failed')return ipexcept Exception:logger.error("get ip from www.ifconfig.me failed", exc_info=True)return None"""get ip from ip138.com@version: python3.x@author: wangjf@software: PyCharm@file: collect.py@time: 2019/7/8 19:35
"""
def getIpFromIp138():try:logger.info("start get ip from 200019.ip138.com")headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}html = requests.get('http://200019.ip138.com/', headers=headers)rows = re.findall('<p align="center">(.*?)</p>', html.text, re.S)if rows:logger.info("get ip %s" % rows)ip = rows[0]else:raise Exception('get ip from 200019.ip138.com failed')return ipexcept Exception:logger.error("get ip from 200019.ip138.com failed", exc_info=True)return None

2.对比当前公网IP是否变化

这个步骤其实比较简单,把获取的对公ip存在本地文件,然后下次获取对公ip的时候判断新获取的ip与文件中的ip是否一致,不一致则修改。
下面的代码中包含了获取对公ip、判断ip是否变化以及更新dns。若用的阿里云,则修改ali这段,若用的cloudflare则修改flare这段。

# -*- coding:UTF-8 -*-
from ddns.collect import get_network_ip
from ddns.alicloud import AliCloudDns
from ddns.cloudflare import CloudflareDnsimport sys
from util.tonggu_logger import TongguLogger
import util.path
import pathliblogger = TongguLogger().getLogger()ali = {"access_key_id": "xxx","access_secret": "xxx","region_id": "cn-hangzhou","domain": "xxx.com","domain-a": "home"
}flare = {"access_key_id": "xxx@163.com","access_secret": "xxx","region_id": "xxx","domain": "xxx.com","domain-a": "home"
}# save content and return true if changed, otherwise return false
def save_content(path, filename, content):path = pathlib.Path(str)if not path.exists():path.mkdir()file = pathlib.Path(path + '/' + filename)if file.exists():with file.open() as f:str = f.readline()if content == str:return False# write filewith file.open('w') as f:f.writelines(content)return Trueif __name__ == "__main__":try:network_ip = get_network_ip()if network_ip is None:raise Exception("get ip failed")# check ip is changedif save_content('/tmp', 'ip', network_ip) == False:sys.exit(2)except Exception:logger.error("get ip failed", exc_info=True)sys.exit(2)# update dnstry:# update alicloudlogger.info("updata aliyun dns")aliCloudDns = AliCloudDns(ali["access_key_id"], ali["access_secret"], ali["region_id"])record = aliCloudDns.DescribeDomainRecords(ali["domain"], ali["domain-a"])aliCloudDns.UpdateDomainRecord(record, network_ip)logger.info('update aliyun dns success')except Exception:logger.error("update aliyunv dns failed", exc_info=True)try:# update cloudflarelogger.info("updata cloudflare dns")dns = CloudflareDns(flare["access_key_id"], flare["access_secret"], flare["region_id"])record = dns.DescribeDomainRecords(ali["domain"], ali["domain-a"])dns.UpdateDomainRecord(record, network_ip)logger.info('update  cloudflare dns success')except Exception:logger.error("update cloudflare dns failed", exc_info=True)

3.更新DNS

阿里云DNS更新代码,两个函数,第一个函数用于获取之前设置的DNS解析记录(主要拿到这条数据的id),第二个函数用于更新DNS。

# -*- coding:UTF-8 -*-
import jsonfrom aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
from aliyunsdkcore.client import AcsClientclass AliCloudDns:def __init__(self, access_key_id, access_secret, region_id):self._client_ = AcsClient(access_key_id, access_secret, region_id)"""search Records@:param main_domain @:param child_domain@version: python3.x@author: wangjf@software: PyCharm@file: alicloud.py@time: 2019/7/8 20:40"""def DescribeDomainRecords(self, main_domain, child_domain):request = DescribeDomainRecordsRequest()request.set_accept_format('json')request.set_DomainName(main_domain)response = self._client_.do_action_with_exception(request)result = json.loads(str(response, encoding='utf-8'))for record in result["DomainRecords"]["Record"]:if record["RR"] == child_domain:return record"""update record by id@:param record @:param ip @version: python3.x@author: wangjf@software: PyCharm@file: alicloud.py@time: 2019/7/8 20:40"""def UpdateDomainRecord(self, record, ip):# not need to update if not changeif record['Value'] == ip:return ''request = UpdateDomainRecordRequest()request.set_accept_format('json')request.set_RecordId(record['RecordId'])request.set_RR(record['RR'])request.set_Type(record['Type'])request.set_Value(ip)response = self._client_.do_action_with_exception(request)return str(response, encoding='utf-8')

cloudflare的DNS更新代码,也是两个函数跟阿里云类似。

# -*- coding:UTF-8 -*-
import requestsimport jsonclass CloudflareDns:def __init__(self, access_key_id, access_secret, zone_id):self.__access_key_id = access_key_idself.__access_secret = access_secretself.__zone_id = zone_id"""search Records@:param main_domain @:param child_domain@version: python3.x@author: wangjf@software: PyCharm@file: coludflare.py@time: 2020/2/8 21:40"""def DescribeDomainRecords(self, main_domain, child_domain):url = "https://api.cloudflare.com/client/v4/zones/%s/dns_records?type=A&name=%s.%s" % (self.__zone_id, child_domain, main_domain)headers = {"X-Auth-Email": self.__access_key_id, "X-Auth-Key": self.__access_secret,"Content-Type": "application/json"}response = requests.get(url, headers=headers).textresult = json.loads(response)return result["result"][0]"""update record by id@:param record @:param ip @version: python3.x@author: wangjf@software: PyCharm@file: coludflare.py@time: 2020/2/8 21:40"""def UpdateDomainRecord(self, record, ip):# not need to update if not changeif record['content'] == ip:return ''url = "https://api.cloudflare.com/client/v4/zones/%s/dns_records/%s" % (self.__zone_id, record['id'])headers = {"X-Auth-Email": self.__access_key_id, "X-Auth-Key": self.__access_secret,"Content-Type": "application/json"}data = {"type": "A", "name": record['name'], "content": ip, "ttl": 600, "proxied": False}response = requests.put(url, json=data, headers=headers)return response.text

获取完整代码

注意:修改exec_ddns.py中的ali和flare,配置对应的密钥或者登陆名密码。如果只使用其中一个,可以把另一个删掉,对应删掉代码。

下面是获取阿里云的AccessKey,在右上角,剩余步骤都是傻瓜式的,不介绍了。
ali = {
“access_key_id”: “xxx”, # AccessKey
“access_secret”: “xxx”, # AccessSecret
“region_id”: “cn-hangzhou”, # 区域(默认就好)
“domain”: “xxx.com”, # 你的域名
“domain-a”: “home” # 你的域名前缀,比如www.baidu.com其中的www
}
在这里插入图片描述
下面是cloudflare配置APIToken
flare = {
“access_key_id”: “xxx@163.com”, # cloudflare登陆邮箱
“access_secret”: “xxx”, # cloudflare登陆密码
“region_id”: “xxx”, # 下面申请的api token
“domain”: “xxx.com”, # 你的域名
“domain-a”: “home” # 你的域名前缀,比如www.baidu.com其中的www
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

把代码拷贝到群晖服务器上,设置任务计划

我配置的每5分钟跑一次
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40793.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

群晖可以修改服务器名字吗,群晖主机改服务器

群晖主机改服务器 内容精选 换一换 DCC是物理隔离的专属计算资源集群,集群中主机可能会因为故障而自动停机。为降低物理机故障的影响,在用户购买的专属集群内资源有冗余的情况下,在集群内的云服务器支持自动迁移能力。带有本地盘的主机不支持宕机自动迁移能力。计算资源没有…

群晖java安装失败_群晖NAS安装Jenkins

Jenkins大家都不陌生&#xff0c;Java开发的持续集成工具&#xff0c;今天简单记录一下在群晖NAS上安装Jenkins的整个过程。 首先在群晖中打开Docker&#xff0c;点击注册表&#xff0c;注册表里有很多已上传的镜像下载&#xff1a; 下载上图标红的镜像到本地&#xff0c;大家可…

TinyML:使用 ChatGPT 和合成数据进行婴儿哭声检测

故事 TinyML 是机器学习的一个领域,专注于将人工智能的力量带给低功耗设备。该技术对于需要实时处理的应用程序特别有用。在机器学习领域,目前在定位和收集数据集方面存在挑战。然而,使用合成数据可以以一种既具有成本效益又具有适应性的方式训练 ML 模型,从而消除了对大量…

chatgpt赋能python:Python制图:让数据图像化

Python制图&#xff1a;让数据图像化 数据可视化是近年来越来越流行的技术&#xff0c;其能够将大量的数字和信息变成直观有趣的图形。Python是一个广泛使用的编程语言&#xff0c;也是制图利器。Python的绘图库非常丰富&#xff0c;包括流行的Matplotlib、Seaborn和Plotly等&…

第一批被AI淘汰的人已经出现,你距离失业还有多远?

在我之前的文章有提到过&#xff0c;当chat GPT横空出世之后&#xff0c;AI必然会迎来大爆发&#xff0c;在chat GPT推出后&#xff0c;百度随即推出文心一言&#xff0c;而各个互联网大厂也纷纷入局&#xff0c;这将会导致一大批人失业。 为什么各个互联网大厂会纷纷入局&…

Stable Diffusion原理详解

Stable Diffusion原理详解 最近AI图像生成异常火爆&#xff0c;听说鹅厂都开始用AI图像生成做前期设定了&#xff0c;小厂更是直接用AI替代了原画师的岗位。这一张张丰富细腻、风格各异、以假乱真的AI生成图像&#xff0c;背后离不开Stable Diffusion算法。 Stable Diffusion…

ChatGpt闪联(商业版)

ChatGpt闪联 介绍 ChatGPT商业版,支持在线支付&#xff0c;卡密兑换&#xff0c;KEY轮询&#xff0c;显示余额以及到期时间 精美 UI&#xff0c;响应式设计&#xff0c;支持深色模式 极快的首屏加载速度&#xff08;秒进&#xff09; 极快的回复速度 支持连续对话 拥有内…

美团外卖智能陪伴型导购的探索与实践

相比于其他电商场景&#xff0c;外卖场景对于实时发现和反馈用户兴趣的能力有着更高的要求。近年来&#xff0c;美团外卖算法团队摸索出了一套适用于外卖场景的智能陪伴型导购架构和策略。这一举措已经取得了显著成效&#xff0c;本文将详细介绍外卖搜索技术团队搭建智能陪伴型…

chatgpt赋能Python-python_ceil

Python中的向上取整函数——ceil详解 当我们处理数学问题时&#xff0c;经常需要对数字进行舍入操作。Python内置了许多这样的函数&#xff0c;其中一个非常实用的函数就是ceil。 本篇文章将着重介绍Python中的向上取整函数ceil&#xff0c;探讨其使用场景和具体实现方法&…

微信/支付宝app支付相关参数

目录 微信app支付 appid-18位&#xff0c;appsecret -32位 商户号 mchId&#xff0c;mchKey keyPath: /root/cert/apiclient_cert.p12 payUrl: https://api.mch.weixin.qq.com/pay/unifiedorder refundPath: https://api.mch.weixin.qq.com/secapi/pay/refund notifyUrl…

支付宝接口使用

支付宝接口使用 给大家讲讲支付宝如何使用第三方接口1.准备环境 支付宝开放平台 &#xff1a;https://openhome.alipay.com/platform/home.htm 点击右上角 **进入管理中心**点击研发服务 进来之后找到二维码扫码下载 沙箱&#xff0c;仅支持安卓 电脑下载支付宝平台助手 …

java支付接口(支付宝、微信、QQ)

目录 对接步骤效果图对接注意事项尾言 去年对接了一个第三方支付接口&#xff0c;也就是码支付&#xff0c;觉得挺不错&#xff0c;能支持的支付方式有支付宝、微信、QQ&#xff0c;如果是个人测试使用&#xff0c;除了微信其他两个都可以。最近有空整理了一下&#xff0c;分享…

支付接口调用(支付宝、微信)

一、支付宝支付 1、官方文档是最好的教程&#xff1a; ①电脑网站支付文档&#xff1a;https://docs.open.alipay.com/270/105899/ ②支付宝沙箱使用教程&#xff1a;https://docs.open.alipay.com/200/105311/ ③调用支付宝相关接口的应用创建&#xff1a;https://open.alipa…

php处理支付宝应用网关给接口发送的post参数

php如何接收支付宝应用网关发送的POST请求方式,参数又是GET请求的数据格式 配置支付宝应用网关如何接收支付宝异步通知(应用网关接收请求)将&连接的参数分割成数组实例&#xff1a;难点 配置支付宝应用网关 首先要在服务器上写一个接口,然后将接口的访问地址设置在支付宝应…

如何调用支付宝接口

之前做web项目接入支付宝&#xff0c;网上看了很多文档和案列&#xff0c;不是不讲重点就是过时不适用了&#xff0c;导致走了很多弯路&#xff0c;经过冷静分析总算跑通了&#xff0c;这里分享下接入流程。 1.准备工作 1)支付宝服务商账号&#xff0c;现在叫蚂蚁金服&#x…

支付宝接口的调用

支付流程图 对接支付宝的准备工作 一、申请条件 1.企业或个体工商户可申请&#xff1b; 2. 提供真实有效的营业执照&#xff0c;且支付宝账户名称需与营业执照主体一致&#xff1b; 3. 网站能正常访问且页面信息有完整商品内容&#xff1b; 4. 网站必须通过ICP备案&#xff0…

微信 及支付宝 支付接口 功能

1&#xff1a;首页需要了解支付宝跟微信的开发文档&#xff0c;这里就贴上文档网址&#xff0c;不做过多描述 微信&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/index.html 支付宝&#xff1a;https://open.alipay.com/developmentDocument.htm 2&#xff1a;业务流程…

android应用程序如何调用支付宝接口

最近在做一个关于购物商城的项目&#xff0c;项目里面付款这块我选的是调用支付宝的接口&#xff0c;因为用的人比较多。 在网上搜索了以下&#xff0c;有很多这方面的教程&#xff0c;但大部分教程过于陈旧&#xff0c;而且描述的过于简单。而且支付宝提供的接口一直在更新&am…

小编和ChatGPT聊了下智能运维,大家看看能不能把专家替了?

近日&#xff0c;聊天机器人ChatGPT爆火&#xff0c;仅仅推出2个月&#xff0c;其月活跃用户就成功过亿&#xff0c;成为历史上增长最快的消费者应用程序。连一向高调的马斯克在使用ChatGPT都直呼“好到吓人”&#xff0c;甚至断言&#xff1a;“我们离强大到危险的AI不远了。”…

外贸单证制作常用名称中英互译表

外贸单证制作对于外贸人来说会遇到的样式很多&#xff0c;因此在进行这项工作的过程中&#xff0c;会有很多专业单证英文名称&#xff0c;对于这些名称的了解就很重要。这里汇信外贸管理软件整理了包含390种常用外贸单证名称的中英互译表&#xff0c;大家来分享吧&#xff01; …