利用阿里云解析API搭建毫秒级DDNS动态域名解析(PHP版)
DDNS相关介绍
[scode type="share"]DNS:域名系统,是因特网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人们更方便的用数字英文组合甚至中文访问互联网,而不需要用IPv4、IPv6 复杂的数字字符组合;
DDNS:动态域名系统,是域名系统(DNS)中的一种自动更新名称服务器内容的技术。在传统的DNS中,域名必须和固定的IP绑定,当IP变化时,必须手动更新IP与域名的映射关系,才能保证变化后的IP仍与域名相对应,其他用户才可访问。DDNS的作用就是将这更新过程自动化
[/scode]


目前公司商用、家用宽带 几乎都是动态IP的宽带,所谓动态IP就是 随机分配给你的IP地址,动态IP地址(Dynamic IP)指的是在需要的时候才进行IP地址分配的方式。动态IP地址和静态IP地址是对应的。所谓动态就是指当你每一次上网时,ISP会随机分配一个IP地址,静态指的是固定分配一个IP地址,每次都用这一个地址;
那么怎么才能固定,答案是否定的! 但可以换个思路,IP不固定 那么 域名 是固定的,只需要记得域名,域名则通过DDNS解析,就能在广义上定义为固定。
DDNS用来干什么
用DDNS动态域名的目的是什么?
现在智能家电越来越多,物联网时代;通过APP就能远程家电、监控、家庭私有云、公司云盘... ...
[scode type="yellow"]特别提醒:使用动态域名搭建服务 请自觉遵守互联网安全法和相关法律法规[/scode]
实现原理
- 在一个公网固定IP的服务器上部署PHP版域名解析API作为服务端
- 客户端设备访问服务器的URL
- 服务器GET客户端IP并把客户端IP解析到指定的域名A记录上

环境准备
1.固定IP的公网WEB服务器 WEB环境支持PHP7 推荐宝塔面板 以下用宝塔举例其他环境类似安全起见至少为nginx或apache
2.阿里云域名,并申请阿里云 AccessKey, AccessKeySecret(先保存记录)
3.客户端的动态IP带宽
[scode type="yellow"]说明:客户端IP地址需要 公网非城域,并且有可运行curl的设备 大多数路由的计划任务中都是支持的
且24小时不关机,(我个人在家有群晖和宝塔面板都是不关机的;也可以树莓派甚至是可curl的路由,比如老毛子,openwrt等)
如果满足条件就接着往下看
[/scode]
开始配置
公网服务器配置
1.解析一个作为DDNS服务域名到该服务器例如'ddns.abc.com',并创建对应的网站,不需要数据库
2.再解析一个要作为动态域名的子域名例如'www.abc.com',指向暂时IP随便写一个
3.Linux环境ssh进入新建网站根目录,运行命令(由阿里云提供)
git clone https://github.com/roura356a/alicloud-php-dns-updater.git dyndns-updater
Windows或者其他环境可直接访问 https://github.com/roura356a/alicloud-php-dns-updater.git 下载项目并解压到根目录
5.这时候就会有根目录下就有有一个文件夹 dyndns-updater
6.进入dyndns-updater文件夹找到 index.php 点击编辑
代码如下
<?php
date_default_timezone_set('UTC');
include_once 'alicloud-php-updaterecord/V20150109/AlicloudUpdateRecord.php';
use Roura\Alicloud\V20150109\AlicloudUpdateRecord;
$AccessKeyId = '填写你的 AccessKeyId';
$AccessKeySecret = '填写你的 AccessKeySecret';
$updater = new AlicloudUpdateRecord($AccessKeyId, $AccessKeySecret);
$newIp = $_SERVER['REMOTE_ADDR']; // New IP
$updater->setDomainName('填写你的顶级域名(没有www)如abc.com');
$updater->setRecordType('A');
$updater->setRR('填写作为动态解析的子域名,如www');
$updater->setValue($newIp);
print_r($updater->sendRequest());
修改后保存,然后进行先测试,然后再作安全方面配置
浏览器打开
http://你服务端域名/dyndns-updater/
如http://ddns.abc.com/dyndns-updater/
如果返回格式(JSON转义,源为数组格式)
{
"RecordId":"0833293686517392",
"RequestId":"xxxx-xxxx-xxxx-xxxx"
}
那么说明解析成功,应该稍后就能收到DNS变更邮件提醒,如果没有返回则检查配置,和确认你的动态IP是否是城域;
安全配置
接下来做安全方面配置,避免你的url泄露,无论谁 一访问 A记录就解析成别人的了,总之谁访问就解析谁;
1.宝塔面板nginx点击站点修改——网站目录——密码访问 点击开启,密码建议稍复杂 我这里举例为 账号:btdnsadmin 密码:passwd
设置后 服务器端就完成了;
2.Apache(linux)的使用 .htaccess 和 .htpasswd 来进行安全加固
.htaccess
把.htaccess文件放在与index.php相同的文件夹中
内容如下
AuthType Basic
AuthName "DNS Updater Access"
AuthUserFile /var/www/dyndns-updater/.htpasswd
Require valid-user
.htpasswd
在任意位置运行以下命令,来创建用户及密码:
htpasswd -c /var/www/dyndns-updater/.htpasswd updater_user
以上命令会首次创建.htpasswd文件。其中,updater_user是您要添加的用户名。当运行该用户名时,它会要求您输入密码。
[scode type="share"]注意:根据 Apache 官方文档,htpasswd 使用 bcrypt(针对 Apache 的 MD5 修订版本),SHA1,或者系统的crypt()
例程来加密密码,确保密码不会以纯文本形式保存。所以,在执行以上命令后,我们建议您将密码保存在安全的地方。如果由于加密而忘记密码,您将无法恢复它[/scode]
推荐一个懒人工具 在线 htpasswd 生成器 可直接生成出需要的文件 生成完成直接拷贝进目录即可
完成以上配置后,您可以使用用户名和密码来访问 URL
创建定时执行脚本
接下来,来到动态IP环境中,使用你的linux或者宝塔面板 创建定时任务执行脚本
这里列举宝塔面板 计划任务中的脚本执行
执行命令(脚本) 时间周期建议10分钟一次就行,本人使用1分钟 都是能稳定运行的
curl -u btdnsadmin:passwd http://你服务端域名/dyndns-updater/index.php
btdnsadmin:passwd为你服务端为网站建立的访问账号:密码
返回日志:
[2019-04-30 08:45:54] Successful
{
"RequestId":"xxxx-xxxxxxxx-xxxxxxxx-xxx",
"HostId":"youdmoain.com",
"Code":"DomainRecordDuplicate"}
说明执行成功
如没有公网服务器的,那么就只能选择纯客户端版python的 这里就脱本文内容了,就不说了 度娘有一堆教程。
如果动态IP宽带没有公网IP的,可以尝试部署Ngrok 内网穿透
一切就绪
[scode type="green"]推荐使用端搭配阿里云公共DNS
223.5.5.5
223.6.6.6[/scode]
就能达到几乎秒级的解析速度
总结
实测用过LEDE&OpenWRT 还有梅林 AliDDNS插件 效果都没有上述方法高效稳定 可能是强迫症犯了
至于为何不用免费的一些厂商DDNS,这个问题很好理解 重点我已经标出来;
追求稳定和急速的想法已经造就了强迫症的严重度;
本文部分内容引用阿里云官方提供的阿里云解析API文档
免费!申请免费Let's Encrypt泛域名SSL证书教程
[scode type="yellow"] 2020年9月10日 使用的时候发现目前办法已失效,只能每3个月重新申请[/scode]
SSL是什么?
SSL(Secure Sockets Layer 安全套接层 ),及其继任者 传输层安全 (Transport Layer Security,TLS)是为 网络通信 提供安全及 数据完整性 的一种安全协议。TLS与SSL在 传输层 对网络连接进行加密。
为什么首先要使用HTTPS呢?
它有三个主要原因:
保密。这保护了双方之间的通信,使其免受诸如因特网之类的公共媒体的影响。例如,在没有HTTPS的情况下,当使用接入点的某人在线购买某物时,运行Wi-Fi接入点的某人可以看到诸如信用卡之类的私人信息。
诚信。这可以确保信息完整且未经更改地到达其目标方。例如,我们的Wi-Fi好友可以在我们的网站上添加额外的广告,降低图像质量以节省带宽或更改我们阅读的文章内容。HTTPS确保无法修改网站。
验证。这确保了网站安全。例如,运行Wi-Fi接入点的同一个人可以将浏览器发送到虚假网站。HTTPS确保你访问的网址是一个唯一安全网站。
那为什么要生成泛域名的SSL证书呢?
如果建过站的朋友一应该了解,在宝塔Linux面板中可以非常便捷的申请免费的SSL证书,但是有缺陷的是,加入我申请的是www.xxx.com证书,那么就无法适用于www2(这里是前缀).xxx.com其他前缀的域名,所以我们借Let's Encrypt来申请泛域名证书,这样就可在七牛云等其他地方可以共用一套证书。
如何申请?
访问www.sslforfree.com
填写泛域名和一级域名然后点击 Create Free SSL Certificate

通过验证后点击Manually Verify Domain进行域名验证
此时会分配需要在域名服务商填写的必要信息

登入域名服务商(以阿里云为例)
依照生成的验证信息设置域名解析
添加TXT记录(请注意添加是要添加2个!)

添加完成后点击Download SSL Certificate会进行相关验证

等待验证中....
证书申请成功
点击Download All SSL Certificate Files可以下载生成的三个证书

免费的泛域名证书到手啦!
超强Win10系统工具:Qwins v1.7.3
软件简介
Qwins 系统工具,强大实用的Win10系统工具,集成移除水印、一键激活系统、Office、KMS续期、ESD转换、磁力搜索、文件HASH、系统信息、系统版本、系统应用、Hosts编辑、Adobe CC激活等诸多功能。



小提示
[scode type="yellow"]首次运行会释放所有工具在以下路径,用完建议删除以下文件夹
C:/Users/Administrator/AppData/Local/winsys[/scode]
下载链接
[scode type="green"]链接:https://pan.baidu.com/s/1hKagPu3ADErYUX5iZUwflQ
提取码:dl0q [/scode]
如何用 Frp 实现外网访问群晖 NAS
为什么写这篇文章
因为有在外面访问家里 NAS 的需求,群晖自带的动态域名解析访问又太慢(因为群晖自带动态域名的 DNS 服务器在国外)。所以需要用内网穿透技术来实现通过其他公网 IP 来访问家里的 NAS 设备的需求。所以才有了这篇文章。
概念解释
NAS - 简单的说就是一个存储中心。
Frp - 一种内网穿透技术。
内网穿透 - 就是通过其他公网 IP 来访问本地没有公网 IP 网络环境的一个技术。
内网穿透
内网穿透技术众多,比如花生壳内网穿透、Ngrok、Frp 都是现在主流的内网穿透技术。
但我个人认为 Frp 是目前最好用配置最简单的(经过测试)。
- 花生壳
配置简单方便,比较傻瓜化。但要收费。虽然也有免费版,但由于免费版的流量限制,基本上没有什么实际作用。
- Ngrok
发布时间相对较长,对象较为成熟的一种内网穿透技术。但由于功能的强大。配置较为繁琐。因为折腾许久没有成功过,最后放弃。
- Frp
配置简单,第一次用就配置成功了。并且适用于各大主流平台设备。
具体过程
准备工作
一台有公网 IP 的服务器 (VPS、云主机)
之前注册了一个国外的 VPS, 准备做内网穿透和 vpn 用,但由于访问速度。果断放弃,最后换成了自己阿里云 ECS。
NAS (客户端)
群晖 DS 416 play
基本步骤
由于 Frp 官网说明文档还是比较详细。我不过多做解释。
服务器端配置:
登录服务器,在 Release页面 下载自己服务器对应版本 Frp
wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
实例中:我的阿里云 ECS 用的 centos7 所以我选择 linux_amd64 64位的
Frp 0.12.0 最新测试版的
使用 tar 指令解压 tar.gz 文件
tar -zxvf frp_0.12.0_linux_amd64.tar.gz
进入 frp 目录
cd frp_0.12.0_linux_amd64
删除不必要的客户端文件
rm -f frpc frpc_full.ini frpc.ini
版本不同可能稍有差异,
frpc 为客户端文件
frps 为服务器端文件
配置服务器端文件
vi frps.ini
frps.ini 为服务器配置文件
编辑配置文件
[common]
bind_port = 7000
vhost_http_port = 8080
dashboard_port = 7500
dashboard_user = 用户名
dashboard_pwd = 密码
max_pool_count = 5
authentication_timeout = 900
subdomain_host = lekee.cc
[ssh]
listen_port = 6000
auth_token = 和客服端 token 对应
简单解释:
[common] 必填的
bind_port Frp 服务端口(可自定义)
vhost_http_port http 访问端口(可自定义)
dashboard_port dashboard 界面端口
dashboard_user 登录 dashboard 用户名
dashboard_pwd 登录 dashboard 密码
max_pool_count 最大连接池数量
authentication_timeout 超时验证时间
subdomain_host 自定义二级域名
[ssh]
listen_port ssh 访问端口
auth_token 用户身份认证
详细配置
点击官方
保存上面配置文件吗,启动 frp 服务器
./frps -c ./frps.ini
需要后台运行,请看下面
服务端配置结束。