Skip to content

GloryRedstoneUnion/OpenDDNS

Repository files navigation

OpenDDNS

现代化多提供商 DDNS 动态域名解析工具,支持 Cloudflare、阿里云、阿里云ESA,多 IP 提供源,IPv4/IPv6 双栈,日志等级与文件输出,自动检查更新。

特性

  • 目前支持 Cloudflare、阿里云(Aliyun)、阿里云ESA(Aliyun ESA),全部采用官方 SDK
  • 支持 IPv4 和 IPv6 双栈 DDNS(A 和 AAAA 记录)
  • 智能记录类型检测,根据获取到的 IP 地址自动选择记录类型
  • 强制网络类型:指定 A 记录时强制通过 IPv4 访问 API,指定 AAAA 记录时强制通过 IPv6 访问 API
  • 支持多个IP回显源,自动投票决定
  • 日志等级支持 debug/info/warn/error
  • 启动参数支持 -c/--config 指定配置文件,--no-check-update 跳过更新检查
  • 首次启动自动生成默认 config.yml

快速开始

  1. 下载

    • 前往 Releases 下载对应平台的二进制文件。
    • 或自行编译:
      git clone https://github.com/GloryRedstoneUnion/OpenDDNS.git
      cd OpenDDNS
      go build -o ddns.exe
  2. 配置

    • 首次运行会自动生成 config.yml并自动退出,请手动编辑配置文件(见下方配置示例)。
  3. 运行

    • Windows:

      openddns-xxx-xxx.exe
    • Linux/macOS:

      ./openddns-xxx-xxx
    • 可选参数:

      • -c/--config 指定配置文件

        ./openddns-xxx-xxx -c myconfig.yml
        
      • --no-check-update 跳过启动时版本检查


配置示例

provider: "cloudflare"
domain: "example.com"
subdomain: "www"

# DNS记录类型:A (IPv4), AAAA (IPv6), auto (自动检测)
record_type: "auto"

update_interval_minutes: 5
log_level: "info"
log_file: ""
ip_sources:
  - name: "bilibili"
    url: "https://api.live.bilibili.com/xlive/web-room/v1/index/getIpInfo"
    type: "json"
    json_path: "data.addr"
  - name: "cf-cdn-tace"
    url: "https://www.cloudflare-cn.com/cdn-cgi/trace"
    type: "trace"
  # IPv6 IP源示例(如需IPv6 DDNS请取消注释)
  # - name: "ipify-ipv6"
  #   url: "https://api64.ipify.org"
  #   type: "text"
  # - name: "icanhazip-ipv6" 
  #   url: "https://ipv6.icanhazip.com"
  #   type: "text"
cloudflare:
  api_token: "YOUR_CLOUDFLARE_API_TOKEN"
  zone_id: ""
aliyun:
  access_key_id: "YOUR_ALIYUN_ACCESS_KEY_ID"
  access_key_secret: "YOUR_ALIYUN_ACCESS_KEY_SECRET"
  endpoint: "alidns.aliyuncs.com"
aliyun_esa:
  access_key_id: "YOUR_ALIYUN_ESA_ACCESS_KEY_ID"
  access_key_secret: "YOUR_ALIYUN_ESA_ACCESS_KEY_SECRET"
  site_id: "YOUR_ESA_SITE_ID"

配置项目录


provider

  • 类型:string
  • 说明:选择 DNS 服务商。可选值:cloudflarealiyunaliyun_esa
  • 示例provider: "cloudflare"

domain

  • 类型:string
  • 说明:主域名,不含子域名部分。
  • 示例domain: "example.com"

subdomain

  • 类型:string

  • 说明:子域名部分。添加前会自动检查是否存在此子域名,若不存在将自动创建。

Warning

若此子域名存在多个解析记录,则会将它们全部覆盖为当前公网IP。

  • 示例subdomain: "www"

record_type

  • 类型:string
  • 说明:DNS记录类型。可选值:
    • A:IPv4地址记录(强制IPv4网络访问API)
    • AAAA:IPv6地址记录(强制IPv6网络访问API)
    • auto 或留空:根据获取到的IP地址自动选择记录类型(自动选择网络)
  • 默认值auto
  • 示例record_type: "auto"

Tip

  • 智能网络选择:当设置为 A 时,程序会强制通过 IPv4 网络访问所有 IP 源 API;设置为 AAAA 时强制通过 IPv6 网络访问
  • 推荐使用 auto 模式:程序会根据实际获取到的IP地址自动选择正确的记录类型和网络

log_level

  • 类型:string
  • 说明:日志等级。可选:debuginfowarnerror
  • 示例log_level: "info"

log_file

  • 类型:string
  • 说明:日志文件路径,留空则仅输出到控制台。
  • 示例log_file: ""

ip_sources

  • 类型:数组

  • 说明:公网 IP 获取源列表,可填多个。当有多个IP源存在时,将启用投票机制,多数者胜。如果没有“多数”,则按配置顺序优先取第一个可用的 IP。

Note

OpenDDNS目前仅会向设定的URL发送GET请求以获取响应,更多配置项将在后续版本添加。

  • 结构

  • name:源名称,可自定义,会在日志中体现

  • url:GET请求地址

  • typejsontracetext

Note

目前对trace的兼容性较差,建议使用提供json响应的API,对于trace的兼容性配置将在后续版本更新。

各类型说明:

  • json模式: 解析JSON响应,通过json_path提取IP地址
  • trace模式: 查找以ip=开头的行(如ip=1.2.3.4),提取IP地址
  • text模式: 直接返回响应体内容作为IP地址(适用于直接返回IP的API)
  • json_path:仅 type 为 json 时必填,指定 IP 字段路径,OpenDDNS将从API响应中提取对应路径的值

  • 示例

ip_sources:
  - name: "bilibili"
    url: "https://api.live.bilibili.com/xlive/web-room/v1/index/getIpInfo"
    type: "json"
    json_path: "data.addr"
  - name: "cloudflare"
    url: "https://www.cloudflare-cn.com/cdn-cgi/trace"
    type: "trace"
  # IPv6 示例
  - name: "ipify-ipv6"
    url: "https://api64.ipify.org"
    type: "text"

update_interval_minutes

  • 类型:int
  • 说明:检测并同步 IP 的时间间隔(分钟)。
  • 示例update_interval_minutes: 5

cloudflare

  • 类型:对象
  • 说明:Cloudflare 账户配置。
    • api_token:Cloudflare API Token
    • zone_id:可选,留空自动获取
  • 示例
cloudflare:
  api_token: "YOUR_CLOUDFLARE_API_TOKEN"
  zone_id: ""

Important

所使用的Cloudflare账户必须对相应主域有编辑DNS权限

aliyun

  • 类型:对象
  • 说明:阿里云相关配置。
    • access_key_id:用来进行DNS操作的阿里云账户AccessKey ID
    • access_key_secret:用来进行DNS操作的阿里云账户 AccessKey Secret
    • endpoint:可选,默认为 alidns.aliyuncs.com
  • 示例
aliyun:
  access_key_id: "YOUR_ALIYUN_ACCESS_KEY_ID"
  access_key_secret: "YOUR_ALIYUN_ACCESS_KEY_SECRET"
  endpoint: "alidns.aliyuncs.com"

Important

所使用的阿里云账户必须具有以下权限:

alidns:DescribeDomainRecords
alidns:UpdateDomainRecord
alidns:AddDomainRecord
alidns:DescribeSubDomainRecords

aliyun_esa

  • 类型:对象
  • 说明:阿里云ESA(Edge Security Acceleration)相关配置。
    • access_key_id:用来进行ESA DNS操作的阿里云账户AccessKey ID
    • access_key_secret:用来进行ESA DNS操作的阿里云账户 AccessKey Secret
    • site_id:ESA站点ID,可从ESA控制台获取,留空时自动根据域名查询
  • 示例
aliyun_esa:
  access_key_id: "YOUR_ALIYUN_ESA_ACCESS_KEY_ID"
  access_key_secret: "YOUR_ALIYUN_ESA_ACCESS_KEY_SECRET"
  site_id: ""  # 留空自动获取,或填入具体的站点ID如 "123456789012"

Important

使用阿里云ESA需要注意:

  1. 所使用的阿里云账户必须具有ESA DNS记录管理权限
  2. 域名必须已接入阿里云ESA服务
  3. 可以在ESA控制台手动获取站点ID,或留空让程序自动查询
  4. 自动查询功能会根据配置的域名精确匹配对应的ESA站点
  5. ESA服务目前主要面向企业用户,可能需要开通相应服务

其它说明

  • 首次启动:无 config.yml 会自动生成模板并退出

  • 命令行参数

    • -c/--config 指定配置文件
    • --no-check-update 跳过启动时版本检查
  • 关于权限

    由于大多数使用AccessKey/AccessSecret方法鉴权的DNS提供商所提供的Key和Secret权限等同于账号权限,且Key和Secret是明文保存在配置文件中的,所以建议使用子账户并为其分配最小化权限。

Caution

OpenDDNS开发者不对任何访问密钥或身份凭证泄露事件及其造成的后果负任何责任。OpenDDNS不会试图收集你的访问密钥或身份凭证。

  • 常见问题

    • 提交PR时 config.yml 泄露:已默认加入 .gitignore,请勿上传敏感配置
    • 支持平台:Windows/Linux/macOS/FreeBSD/ARM 等主流架构,对任何32位操作系统均不提供支持,任何因非64位操作系统/计算平台产生的issue将被关闭。

贡献

欢迎 PR、issue 反馈与建议!

About

DDNS client for multi provider

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages