铁威马
公网ip
花生壳

#楼主# 2018-5-25 11:54

跳转到指定楼层
本帖最后由 zimrilink 于 2018-5-25 11:59 编辑

本文同步自我的个人博客 Zimri Link  欢迎支持 https://www.zimrilink.com/share/aliddns.html
目的都是因为喜欢折腾 所以分享

实现原理
  • 在一个公网固定IP的服务器上部署PHP版域名解析API作为服务端
  • 客户端设备访问服务器的URL
  • 服务器GET客户端IP并把客户端IP解析到指定的域名A记录上

环境准备
  • 固定IP的公网WEB服务器 WEB环境支持PHP7 推荐宝塔面板 以下用宝塔举例其他环境类似安全起见至少为nginx或apache
  • 阿里云域名,并申请阿里云 AccessKey, AccessKeySecret(先保存记录)
  • 客户端的动态IP带宽

说明:客户端IP地址需要 公网非城域,并且有可运行curl的设备 大多数路由的计划任务中都是支持的
且24小时不关机,(我个人在家有群晖和宝塔面板都是不关机的;也可以树莓派甚至是可curl的路由)
如果满足条件就继续:

开始配置公网服务器配置
  • 解析一个作为DDNS服务域名到该服务器例如'ddns.abc.com',并创建对应的网站,不需要数据库
  • 再解析一个要作为动态域名的子域名例如'www.abc.com',指向暂时IP随便写一个
  • Linux环境ssh进入新建网站根目录,运行命令(由阿里云提供)
    1. git clone https://github.com/roura356a/alicloud-php-dns-updater.git dyndns-updater
    复制代码

  • Windows或者其他环境可直接访问https://github.com/roura356a/alicloud-php-dns-updater.git下载项目并解压到根目录
  • 这时候就会有根目录下就有有一个文件夹 dyndns-updater
  • 进入dyndns-updater文件夹找到 index.php 点击编辑
代码如下
  1. <?php
  2. date_default_timezone_set('UTC');
  3. include_once 'alicloud-php-updaterecord/V20150109/AlicloudUpdateRecord.php';
  4. use Roura\Alicloud\V20150109\AlicloudUpdateRecord;
  5. $AccessKeyId     = '填写你的 AccessKeyId';
  6. $AccessKeySecret = '填写你的 AccessKeySecret';
  7. $updater         = new AlicloudUpdateRecord($AccessKeyId, $AccessKeySecret);
  8. $newIp = $_SERVER['REMOTE_ADDR']; // New IP
  9. $updater->setDomainName('填写你的顶级域名(没有www)如abc.com');
  10. $updater->setRecordType('A');
  11. $updater->setRR('填写作为动态解析的子域名,如www');
  12. $updater->setValue($newIp);
  13. print_r($updater->sendRequest());
复制代码



修改后保存,然后进行先测试,然后再作安全方面配置
浏览器打开
http://你服务端域名/dyndns-updater/
http://www.abc.com/dyndns-updater/
如果返回格式
  1. Array([RecordId] => 3666544576879860[RequestId] => F4VDF8A-D2DF-49VV-ER00-458D6918FDDE)
复制代码

那么说明解析成功,应该稍后就能收到DNS变更邮件提醒,如果没有返回则检查配置,和确认你的动态IP是否是城域;

安全配置
接下来做安全方面配置,避免你的url泄露,无论谁 一访问 A记录就解析成别人的了,总之谁访问就解析谁;
1.宝塔面板nginx点击站点修改——网站目录——密码访问 点击开启,密码建议稍复杂 我这里举例为 账号:btdnsadmin 密码:passwd
设置后 服务器端就完成了;


2.Apache(linux)的使用 .htaccess 和 .htpasswd 来进行安全加固
.htaccess
把.htaccess文件放在与index.php相同的文件夹中
内容如下
  1. AuthType BasicAuthName "DNS Updater Access"AuthUserFile /var/www/dyndns-updater/.htpasswdRequire valid-user
复制代码

.htpasswd
在任意位置运行以下命令,来创建用户及密码:
  1. htpasswd -c /var/www/dyndns-updater/.htpasswd updater_user
复制代码

以上命令会首次创建.htpasswd文件。其中,updater_user是您要添加的用户名。当运行该用户名时,它会要求您输入密码。

注意:根据 Apache 官方文档,htpasswd 使用 bcrypt(针对 Apache 的 MD5 修订版本),SHA1,或者系统的crypt()
例程来加密密码,确保密码不会以纯文本形式保存。所以,在执行以上命令后,我们建议您将密码保存在安全的地方。如果由于加密而忘记密码,您将无法恢复它

推荐一个懒人工具 在线 htpasswd 生成器 可直接生成出需要的文件 生成完成直接拷贝进目录即可

完成以上配置后,您可以使用用户名和密码来访问 URL
接下来,来到动态IP环境中,使用你的linux或者宝塔面板 创建定时任务执行脚本
这里列举宝塔面板 计划任务中的脚本执行
执行命令(脚本) 时间周期建议10分钟一次就行,本人使用1分钟 都是能稳定运行的


群晖中在计划任务中执行即
  1. curl -u btdnsadmin:passwd http://你服务端域名/dyndns-updater/index.php
复制代码




btdnsadmin:passwd为你服务端为网站建立的访问账号:密码
返回日志:
  1. ★[2018-04-21 22:34:02] Successful ----------------------------------------------------------------------------
复制代码

说明执行成功
如没有公网服务器的,那么就只能选择纯客户端版python的 这里就脱离宝塔面板内容了,就不说了 度娘有一堆教程。
如果动态IP宽带没有公网IP的,可以尝试部署Ngrok 内网穿透

一切就绪
推荐使用端搭配阿里云公共DNS
  1. 223.5.5.5
  2. 223.6.6.6
复制代码

就能达到几乎秒级的解析速度

一些总结
实测用过LEDE&OpenWRT 还有梅林 AliDDNS插件 效果都没有上述方法高效稳定 可能是强迫症犯了
至于为何不用免费的一些厂商DDNS,这个问题很好理解 重点我已经标出来;
追求稳定和急速的想法已经造就了强迫症的严重度;
本文部分内容引用阿里云官方提供的阿里云解析API文档


楼主热帖
那是云论坛 - 国内最开放NAS交流平台
http://www.nasyun.com
分享淘帖
回复

使用道具

0

精华

551

帖子

2840

积分

搞机大神

Rank: 3Rank: 3

云币
0
贡献
47
活跃
2329
精华
0
wjq998 发表于 2018-9-6 11:25
确实是难得好帖啊,顶先
回复 支持 反对

使用道具 举报

0

精华

194

帖子

1094

积分

发烧玩家

Rank: 2

云币
0
贡献
80
活跃
597
精华
0
天秤座 发表于 2019-3-18 17:43
正需要,支持楼主大人了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

zimrilink

入门用户

  • 主题

    2

  • 帖子

    2

  • 关注者

    1

那是云自营淘宝
快速回复 返回列表 搜索 官方QQ群
懒人地图 百度地图 谷歌地图手机版|小黑屋|智能生活 , 上那是云 |闽ICP备12025514号-3