当前位置:论坛首页 > Linux面板 > 讨论

通过宝塔面板+阿里云API(php)搭建秒级DDNS动态域名解析

发表在 Linux面板2018-4-22 01:20 [复制链接] 27 36370

本帖最后由 zimr 于 2018-4-22 10:16 编辑

实现原理

1.在一个公网固定IP的服务器上部署PHP版域名解析API作为服务端
2.客户端访问服务器的URL
3.服务器GET客户端IP并把客户端IP解析到指定的域名A记录上




需要的环境有

1.固定IP的公网服务器 并运行宝塔面板(面板环境 推荐nginx+php,Apache+php作为备选)
2.阿里云域名,并申请阿里云 AccessKey, AccessKeySecret(先保存记录)
3.动态IP带宽(公网非城域),并且有可运行linux的设备 且24小时不关机,(我个人在家有群晖和宝塔面板都是不关机的;也可以树莓派甚至是可curl的路由)


                        
适用环境

家庭或者公司有公网访问需求的,私有云盘,工作资料私有共享;  可能有人用过花生壳,效果大家都知道 不多说





如果满足条件就继续:


一,公网服务器配置
                1.解析一个自定域名到该服务器,并通过面板创建对应的网站,不需要数据库。
                2.再解析一个要作为动态域名的子域名,指向暂时IP随便写一个
                2.ssh进入新建网站根目录,运行命令(由阿里云提供)
               
  1. git clone https://github.com/roura356a/alicloud-php-dns-updater.git dyndns-updater
复制代码

                       3.这时候就会有根目录下就有有一个文件夹        dyndns-updater
                4.进入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('填写作为动态解析的子域名');
  12. $updater->setValue($newIp);
  13. print_r($updater->sendRequest());
复制代码
修改后保存,然后进行先测试,然后再作安全方面配置
浏览器打开
http://你服务端域名/dyndns-updater/




如果返回格式
  1. Array
  2. (
  3. [RecordId] => 3666544576879860
  4. [RequestId] => F4VDF8A-D2DF-49VV-ER00-458D6918FDDE
  5. )
复制代码


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



安全配置


接下来做安全方面配置,避免你的url泄露,无论谁 一访问 A记录就解析成别人的了,总之谁访问就解析谁;

宝塔面板点击站点修改——网站目录——密码访问   点击开启,密码建议稍复杂 我这里举例为 账号:btdnsadmin  密码:passwd
设置后 服务器端就完成了;





接下来,来到动态IP环境中,使用你的linux或者宝塔面板 创建定时任务执行脚本
这里指正阿里云的密码传参带""的问题并不是所有环境都能用,这里列举宝塔面板 计划任务中的脚本执行

执行命令(脚本) 时间周期建议10分钟一次就行,本人测试过1分钟  都是能稳定运行的


  1. curl -u btdnsadmin:passwd http://你服务端域名/dyndns-updater/index.php
复制代码


btdnsadmin:passwd为你服务端为网站建立的访问账号:密码



返回日志
  1. ★[2018-04-21 22:34:02] Successful
  2. ----------------------------------------------------------------------------
  3.   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
  4.                                  Dload  Upload   Total   Spent    Left  Speed

  5.   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  6. 100   183    0   183    0     0    309      0 --:--:-- --:--:-- --:--:--   309
  7. Array
  8. (
  9.     [RequestId] => F4VDF8A-D2DF-49VV-ER00-458D6918FDDE
  10.     [HostId] => dns.aliyuncs.com
  11.     [Code] => DomainRecordDuplicate
  12. )
复制代码


说明执行成功

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


感谢宝塔能有这样的环境给我们各种折腾;

使用道具 举报 只看该作者 回复
发表于 2018-5-19 07:43:34 | 显示全部楼层
zimr 发表于 2018-4-30 11:50
报错代码62行为为

这个程序只支持PHP7.1,换成7.1就弄好了,别的都不行
使用道具 举报 回复 支持 1 反对 0
发表于 2018-4-22 02:30:55 | 显示全部楼层
感谢楼主给的思路,很不错,谢谢
使用道具 举报 回复 支持 反对
发表于 2018-4-24 14:36:52 | 显示全部楼层

回帖奖励 +3

很多路由器上支持DDNS

使用道具 举报 回复 支持 反对
发表于 2018-4-24 17:14:00 | 显示全部楼层

回帖奖励 +3

虽然很多路由器都有ddns,但是毕竟也只是那几家,,,不如自己搭建自由高效
使用道具 举报 回复 支持 反对
发表于 2018-4-24 19:25:02 | 显示全部楼层
成本有点高。智能路由器有这个功能的,没有的,刷刷就有了。
使用道具 举报 回复 支持 反对
发表于 2018-4-25 00:37:04 | 显示全部楼层

回帖奖励 +3

学习了!!!
使用道具 举报 回复
发表于 2018-4-26 11:55:56 | 显示全部楼层
本帖最后由 zimr 于 2018-4-26 11:58 编辑
13064502842 发表于 2018-4-24 14:36
很多路由器上支持DDNS

嗯,都有用过  解析效果 很不理想
使用道具 举报 回复 支持 反对
发表于 2018-4-26 11:58:26 | 显示全部楼层
小新 发表于 2018-4-24 19:25
成本有点高。智能路由器有这个功能的,没有的,刷刷就有了。

是的,方法很多 就看怎么折腾了;我的路由器是TP企业千兆路由 全闭源  爬了很多楼 都无解;刚好上了TX云的车  就弄起来了
使用道具 举报 回复 支持 反对
发表于 2018-4-29 11:50:13 | 显示全部楼层
Parse error: syntax error, unexpected ':', expecting ';' or '{' in /www/wwwroot/*****.com/dyndns-updater/alicloud-php-updaterecord/V20150109/AlicloudUpdateRecord.php on line 62

出错了,完全不能用啊,能帮忙看看吗
使用道具 举报 回复 支持 反对
发表于 2018-4-30 11:50:42 | 显示全部楼层
本帖最后由 zimr 于 2018-4-30 11:53 编辑
chinacomic 发表于 2018-4-29 11:50
Parse error: syntax error, unexpected ':', expecting ';' or '{' in /www/wwwroot/*****.com/dyndns-upd ...

报错代码62行为为



  1.     public function getSignature(string $CanonicalQueryString): string
  2.     {
  3.         $HTTPMethod                  = 'GET';
  4.         $slash                       = urlencode('/');
  5.         $EncodedCanonicalQueryString = urlencode($CanonicalQueryString);
  6.         $StringToSign                = "{$HTTPMethod}&{$slash}&{$EncodedCanonicalQueryString}";
  7.         $StringToSign                = str_replace('%40', '%2540', $StringToSign);
  8.         $HMAC                        = hash_hmac('sha1', $StringToSign, "{$this->accessKeySecret}&", true);

  9.         return base64_encode($HMAC);
  10.     }
复制代码


具体我也不清楚,阿里云官方提供的API只要配置正确和环境符合 一般没问题
应该要先检查你的 AccessKey, AccessKeySecret 是否正确和授权域名管理权限,然后更换PHP版本尝试我的版本在7.1  ,放心的话 私信我 帮你看看
使用道具 举报 回复 支持 反对
发表于 2018-5-15 22:36:44 | 显示全部楼层
我现在在用的就是这个,但是有BUG。一,如果别人执行了会导致IP地址解析到别人的地址上,这里要改成服务器自动获取自己的真实外网地址。二、不支持泛解析,在传递时*可能被错误处理了,这个目前没有找到合适的方法,也许加转意符之类可实现.

这个DDNS效果是目前最好的,比DNSPOD要好太多了(虽然它支持泛解析,但是经常会解析不了),非常稳定
使用道具 举报 回复 支持 反对
发表于 2018-5-16 11:20:05 | 显示全部楼层
支持一下!!!!!!!!!!!!!!!!!!!!
使用道具 举报 回复
发表于 2018-5-23 14:29:59 | 显示全部楼层
colinlu 发表于 2018-5-15 22:36
我现在在用的就是这个,但是有BUG。一,如果别人执行了会导致IP地址解析到别人的地址上,这里要改成服务器 ...

嗯嗯,对于您这些问题 我都考虑到了
一,如果别人执行了url就会解析给别人的问题 我上面有写到安全配置感兴趣可以研究一下
二,泛域名解析其实不必在意在这里,可以换个思路  比如 我执行动态解析的域名为 ddns.abc.com  然后主域名需要泛解析或者其他域名需要泛解析  那么就别名到ddns.abc.com 就可以了呢
*.abc.com 别名到ddns.abc.com   或者 *.a.abc.com 别名到ddns.abc.com

我用下来 配合本地阿里云公共DNS  都是秒级别的  重启了猫和路由  立马就收到变更解析的邮件,然后就已经可以访问了  
使用道具 举报 回复 支持 反对
发表于 2018-5-23 14:30:52 | 显示全部楼层
liang2580 发表于 2018-5-16 11:20
支持一下!!!!!!!!!!!!!!!!!!!!

感谢 感谢
使用道具 举报 回复 支持 反对
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

企业版年付运维跟进群

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急问题处理

论坛响应时间:10分钟

问题处理方式:1对1处理(优先)

工作时间:白班:9:00 - 18:00

工作时间:晚班:18:00 - 24:00

立即付费处理
快速回复 返回顶部 返回列表