节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
6.08 KiB
Stardust
# StarAgent 阿里云DNS动态域名解析 ## 功能概述 StarAgent 集成了阿里云DNS动态域名解析功能,允许客户端自动将其公网IP地址注册到指定的域名记录,实现动态DNS(DDNS)功能。 本功能为纯客户端实现,无需星尘平台服务端干预,适用于以下场景: - 家庭/办公室宽带动态IP环境 - 需要远程访问内网服务器 - 公网IP频繁变化的场景 - 轻量级DDNS解决方案 ## 配置说明 在 `StarAgent.config` 配置文件中添加以下配置项: ### 配置示例 ```json { "AliyunAccessKeyId": "LTAI4***", "AliyunAccessKeySecret": "xPZQ***", "AliyunDnsDomain": "example.com", "AliyunDnsRecord": "home", "AliyunDnsRecordType": "A", "AliyunDnsInterval": 300 } ``` ### 配置项说明 | 配置项 | 类型 | 必填 | 默认值 | 说明 | |-------|------|------|--------|------| | `AliyunAccessKeyId` | String | 是 | - | 阿里云访问密钥ID | | `AliyunAccessKeySecret` | String | 是 | - | 阿里云访问密钥Secret | | `AliyunDnsDomain` | String | 是 | - | 域名,例如:example.com | | `AliyunDnsRecord` | String | 是 | - | 记录名,例如:home 表示 home.example.com,@ 表示根域名 | | `AliyunDnsRecordType` | String | 否 | A | 记录类型,通常为 A(IPv4地址) | | `AliyunDnsInterval` | Int32 | 否 | 300 | DNS更新间隔(秒),默认5分钟 | ## 获取阿里云访问密钥 1. 登录阿里云控制台:https://ram.console.aliyun.com/ 2. 进入 **访问控制(RAM)** > **用户** 3. 创建新用户或选择已有用户 4. 为用户添加权限:`AliyunDNSFullAccess`(DNS完全访问权限) 5. 创建 AccessKey,保存 AccessKeyId 和 AccessKeySecret **安全提示**: - 建议为DNS功能创建专用的RAM用户 - 仅授予DNS相关权限,遵循最小权限原则 - 定期轮换访问密钥 - 妥善保管密钥,不要提交到代码仓库 ## 工作原理 1. **启动阶段**:StarAgent 启动时读取配置,初始化阿里云DNS客户端 2. **IP获取**:通过公共IP查询服务获取当前公网IP地址 3. **记录查询**:查询阿里云DNS,获取指定域名的记录ID 4. **DNS更新**: - 如果记录不存在,则添加新记录 - 如果记录已存在且IP变化,则更新记录 - 如果IP未变化,则跳过更新 5. **定期更新**:按配置的间隔定期检查并更新DNS记录 ## 日志信息 启动成功时会输出以下日志: ``` 启动阿里云DNS动态域名解析:home.example.com 获取公网IP地址:123.45.67.89 from https://api.ipify.org 找到DNS记录ID:123456789 成功更新阿里云DNS记录:home.example.com => 123.45.67.89 阿里云DNS更新间隔:300秒 ``` ## 公网IP获取 系统会依次尝试以下公共IP查询服务: 1. https://api.ipify.org 2. https://ifconfig.me/ip 3. https://icanhazip.com 如果第一个服务不可用,会自动切换到下一个,确保高可用性。 ## 阿里云DNS API说明 本功能使用阿里云云解析DNS的OpenAPI,主要接口: - **DescribeDomainRecords**:查询域名解析记录列表 - **AddDomainRecord**:添加域名解析记录 - **UpdateDomainRecord**:修改域名解析记录 API文档:https://help.aliyun.com/document_detail/29739.html ## 注意事项 ### 配置要求 1. 域名必须已在阿里云DNS托管 2. AccessKey必须具有DNS操作权限 3. 网络环境必须能访问阿里云API和公网IP查询服务 4. 建议更新间隔不小于60秒,避免频繁调用API ### 安全建议 1. 使用RAM子账号,不要使用主账号AccessKey 2. 仅授予DNS相关权限 3. 定期检查和轮换访问密钥 4. 在配置文件中妥善保管密钥 5. 避免在公开渠道暴露配置文件 ### 故障处理 **DNS更新失败** - 检查AccessKey是否正确 - 确认域名已在阿里云DNS托管 - 验证网络连接是否正常 - 查看日志获取详细错误信息 **无法获取公网IP** - 检查网络连接 - 尝试手动访问IP查询服务URL - 确认防火墙/代理设置 **记录未更新** - IP地址未变化时不会触发更新 - 检查更新间隔配置 - 查看日志确认更新状态 ## 示例场景 ### 场景一:家庭宽带远程访问 家庭宽带使用动态公网IP,需要远程访问家中的服务器: ```json { "AliyunAccessKeyId": "LTAI4***", "AliyunAccessKeySecret": "xPZQ***", "AliyunDnsDomain": "mydomain.com", "AliyunDnsRecord": "home", "AliyunDnsInterval": 300 } ``` 配置后,StarAgent 会自动将当前公网IP更新到 `home.mydomain.com`,每5分钟检查一次。 ### 场景二:多节点同域名 如果有多个节点需要绑定不同子域名: **节点1配置:** ```json { "AliyunDnsRecord": "node1", "AliyunDnsDomain": "cluster.com" } ``` **节点2配置:** ```json { "AliyunDnsRecord": "node2", "AliyunDnsDomain": "cluster.com" } ``` 分别绑定到 `node1.cluster.com` 和 `node2.cluster.com`。 ### 场景三:快速更新 对于IP变化频繁的环境,可以缩短更新间隔: ```json { "AliyunDnsInterval": 60 } ``` 每分钟检查一次(不建议低于60秒)。 ## 技术实现 ### 签名算法 使用阿里云标准的签名方法(HMAC-SHA1): 1. 构建规范化请求字符串 2. 使用 `AccessKeySecret&` 作为密钥 3. 计算 HMAC-SHA1 签名 4. Base64 编码签名结果 ### 错误处理 - 网络异常自动重试 - API调用失败记录日志 - IP获取失败尝试备用服务 - 定时器异常不影响主服务 ### 性能优化 - IP地址缓存,未变化时跳过更新 - 记录ID缓存,减少查询次数 - 异步执行,不阻塞主线程 ## 未来计划 - [ ] 支持 IPv6(AAAA记录) - [ ] 支持其他DNS服务商(腾讯云、CloudFlare等) - [ ] 支持多域名/多记录配置 - [ ] 增加DNS更新成功/失败通知 - [ ] 提供Web界面配置 ## 相关资源 - [阿里云DNS产品文档](https://help.aliyun.com/product/29697.html) - [阿里云DNS API文档](https://help.aliyun.com/document_detail/29739.html) - [RAM访问控制](https://ram.console.aliyun.com/) - [StarAgent文档](https://newlifex.com/stardust) ## 问题反馈 如有问题或建议,请访问:https://github.com/NewLifeX/Stardust/issues