DDNS相关介绍

[scode type="share"]DNS:域名系统,是因特网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人们更方便的用数字英文组合甚至中文访问互联网,而不需要用IPv4、IPv6 复杂的数字字符组合;

DDNS:动态域名系统,是域名系统(DNS)中的一种自动更新名称服务器内容的技术。在传统的DNS中,域名必须和固定的IP绑定,当IP变化时,必须手动更新IP与域名的映射关系,才能保证变化后的IP仍与域名相对应,其他用户才可访问。DDNS的作用就是将这更新过程自动化
[/scode]

3911016366.png

172714455.png

目前公司商用、家用宽带 几乎都是动态IP的宽带,所谓动态IP就是 随机分配给你的IP地址,动态IP地址(Dynamic IP)指的是在需要的时候才进行IP地址分配的方式。动态IP地址和静态IP地址是对应的。所谓动态就是指当你每一次上网时,ISP会随机分配一个IP地址,静态指的是固定分配一个IP地址,每次都用这一个地址;

那么怎么才能固定,答案是否定的! 但可以换个思路,IP不固定 那么 域名 是固定的,只需要记得域名,域名则通过DDNS解析,就能在广义上定义为固定。

DDNS用来干什么

用DDNS动态域名的目的是什么?
现在智能家电越来越多,物联网时代;通过APP就能远程家电、监控、家庭私有云、公司云盘... ...

[scode type="yellow"]特别提醒:使用动态域名搭建服务 请自觉遵守互联网安全法和相关法律法规[/scode]

实现原理

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

3238681657.png

环境准备

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文档

[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可以下载生成的三个证书

微信截图

免费的泛域名证书到手啦!
微信截图

软件简介

Qwins 系统工具,强大实用的Win10系统工具,集成移除水印、一键激活系统、Office、KMS续期、ESD转换、磁力搜索、文件HASH、系统信息、系统版本、系统应用、Hosts编辑、Adobe CC激活等诸多功能。
2017-12-18_134125.png
2017-12-18_134113.png
2017-12-18_135145.png
2017-12-18_135208.png

小提示

[scode type="yellow"]首次运行会释放所有工具在以下路径,用完建议删除以下文件夹
C:/Users/Administrator/AppData/Local/winsys[/scode]

下载链接

[scode type="green"]链接:https://pan.baidu.com/s/1hKagPu3ADErYUX5iZUwflQ
提取码:dl0q [/scode]

为什么写这篇文章

因为有在外面访问家里 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
需要后台运行,请看下面
服务端配置结束。