实现DDNS

142 阅读4分钟

最近在看 NAS 相关的文章,也咨询了某些 NAS 设备厂商,发现某些厂商不能直接通过互联网访问 NAS 设备,需要通过同步 NAS 设备内部资源到云端,来达到远程访问的目的,这种做法会有暴露隐私到设备厂商的风险,故而考虑能否为 NAS 设备开放端口来达到查看内部数据的目的。

NAS 设备被很多同学用来私有化某些私密数据或应用,而开放端口来暴露数据到互联网,有点混合云的味道。这个系列的重点不在概念,在于如何实现公有化 NAS 设备。欢迎关注我,后续会更新更多与 NAS 设备相关的文章,我们一起学习。

背景

ISP 一般使用 DHCP 协议为我们提高互联网接入服务,动态 IP 导致我们不能准确地知道局域网设备所处何地,有两个解决方案:

  1. 固定 IP:这个需要花钱,所以不考虑了
  2. DDNS 协议:这个不用花钱,搞这个

如果还有其他解决办法,请评论,我学习一下

DDNS 原理

这个问题让 ChatGPT 回答一下吧

动态域名解析服务(Dynamic Domain Name System,DDNS)是一种允许动态更新域名系统(DNS)记录的服务,通常用于解决动态 IP 地址的问题。以下是 DDNS 的基本原理:

  1. 注册域名: 用户首先在一个 DDNS 服务提供商那里注册一个域名,这个域名将用于映射到用户的动态 IP 地址。

  2. 客户端更新: 用户在其网络中运行一个 DDNS 客户端,通常是安装在路由器上。这个客户端负责检测用户的公共 IP 地址是否发生变化。

  3. IP 地址变化检测: 客户端定期向 DDNS 服务提供商发送请求,以检查用户的公共 IP 地址是否发生变化。这可以通过访问外部 IP 检测服务来实现。

  4. DDNS 服务器更新 DNS 记录: 当客户端检测到 IP 地址发生变化时,它将新的 IP 地址信息发送到 DDNS 服务提供商。DDNS 服务提供商将其记录更新到 DNS 服务器中,确保域名与新的 IP 地址相匹配。

  5. DNS 解析: 当其他设备通过域名访问用户的网络时,DNS 解析请求将被发送到 DDNS 服务提供商的 DNS 服务器。这个 DNS 服务器会返回与用户当前公网 IP 地址相关联的域名解析结果。

  6. 租约管理: 类似于常规 DHCP 的租约管理,DDNS 可以设置记录的过期时间。在一段时间后,如果 DDNS 客户端没有更新 IP 地址,记录可能会过期并被释放,然后可以由其他用户使用。

总体而言,DDNS 的原理是通过将动态变化的公网 IP 地址与一个域名进行绑定,使得即使用户的 IP 地址发生变化,其他设备仍然可以通过使用相同的域名来访问用户的网络。这对于那些拥有动态 IP 地址的用户非常有用,因为它解决了 IP 地址变化带来的访问问题。

省流版本:局域网设备中存在一个定时任务,可以调域名服务商的 API 来修改域名解析指向的 IP 地址,我们只需要使用当前域名就可以访问到局域网设备

如何实现?

image.png Nest 服务内建立一个定时任务,定时任务获取当前宿主机器的 IP 地址,并于 Redis 缓存的 IP 地址做对比,IP 地址改变,调用云服务商提供的 SDK 来修改域名对应的解析记录。

使用 docker-compose 开启一个 redis 和 node 容器,容器默认使用 bridge 模式,这会导致 nest 服务拿到错误的 IP 地址,所以需要将 node 容器的 network 置为 host ,使用宿主机器的网络即可。

如何使用?

代码在 MAC OS 下可以正常更新腾讯云的域名解析记录

github.com/sufuwang/NA…

git clone git@github.com:sufuwang/NAS-Service.git
cd ./center
// 在 vscode 中,打开 init.js 文件
// 填写腾讯云的 secret,以及需要解析的域名
// 执行 init.js 文件,生成配置文件
node ./init.js
docker-compose up