TimothyYe/godns
TimothyYe/godns has 1,786 GitHub stars and 248 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-08 01:24 UTC. Last push 2026-10-23.
A dynamic DNS client tool that supports AliDNS, Cloudflare, Google Domains, DNSPod, HE.net & DuckDNS & DreamHost, etc, written in Go.
实测星标增长
- 24小时
- 0
- 7天
- 正在收集历史
- 15天
- 正在收集历史
- 1个月
- 正在收集历史
各周期内的星标净变化,周期相互重叠,并非每日新增。缺失的测量保持空白。星标代表关注度,不代表软件质量。
README_CN.md
原文 ██████╗ ██████╗ ██████╗ ███╗ ██╗███████╗
██╔════╝ ██╔═══██╗██╔══██╗████╗ ██║██╔════╝
██║ ███╗██║ ██║██║ ██║██╔██╗ ██║███████╗
██║ ██║██║ ██║██║ ██║██║╚██╗██║╚════██║
╚██████╔╝╚██████╔╝██████╔╝██║ ╚████║███████║
╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝
GoDNS 是一个支持多提供商并内置 Web 面板的开源自建动态 DNS (DDNS) 客户端。它是用 Go 重写的我早期的 DynDNS 开源项目。
托管版服务
如果你希望直接使用托管式 DDNS 服务,而不是自己部署 GoDNS,可以试试 godns.app。
它更适合那些不想自己搭服务器、不想手动维护 DNS 流程,甚至还没有自己域名的用户。
下面展示的是开源版 GoDNS 内置的 Web UI:
支持的 DNS 提供商
| 提供商 | IPv4 支持 | IPv6 支持 | 根域名 | 子域名 |
|---|---|---|---|---|
| Cloudflare | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| DigitalOcean | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Google Domains | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| DNSPod | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Dynv6 | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| HE.net (Hurricane Electric) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| AliDNS | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| DuckDNS | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| Dreamhost | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| No-IP | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| Scaleway | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Linode | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Strato | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| LoopiaSE | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| Infomaniak | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| Hetzner | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| OVH | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| Porkbun | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Dynu | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| IONOS | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| TransIP | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: |
| name.com | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
提示:您可以关注此 问题 查看根域名 DDNS 的当前状态。
快速开始
请选择最适合你的方式:
- 如果你想直接使用托管服务而不自建:使用 godns.app。
- 如果你想最快速地开始自建:从 releases 下载二进制文件。
- 如果你想用容器运行:直接看 作为 Docker 容器。
- 如果你想从源码构建:看 安装。
支持的平台
Linux
MacOS
ARM Linux(如 Raspberry Pi 等)
Windows
MIPS32 平台
要为 MIPS(mips 或 mipsle)编译二进制文件,请运行:
GOOS=linux GOARCH=mips/mipsle GOMIPS=softfloat go build -a该二进制文件也可以在路由器上运行。
开源自建版前提条件
要自建部署 GoDNS,假设:
- 您已注册(现在拥有)一个域名
- 域名已委托给受支持的 DNS 提供商(即它有指向受支持提供商的 nameserver
NS记录)
或者,您可以登录 DuckDNS(使用社交账户),免费获取 duckdns.org 域名下的子域名。
安装
你可以选择以下安装方式之一:
- 使用 Homebrew 安装(macOS / Linux):
brew install godns
- 从 releases 下载已编译的二进制文件。
- 使用 作为 Docker 容器 中描述的 Docker 镜像。
- 从源码构建:
cd cmd/godns # 进入 GoDNS 目录
go mod download # 获取依赖项
go build # 构建
使用方法
通过运行以下命令打印使用/帮助信息:
$ ./godns -h
Usage of ./godns:
-c string
指定配置文件(默认 "./config.json")
-h 显示帮助
配置
概述
- 复制 config_sample.json 并命名为
config.json,或者复制 config_sample.yaml 并命名为config.yaml。 - 配置您的提供商、域名/子域名信息、凭据等。
- 配置通知媒介(例如 SMTP 接收电子邮件),以便在您的 IP 地址更改时收到通知
- 将文件放置在 GoDNS 的同一目录中,或者使用
-c=path/to/your/file.json选项
多提供商支持
🆕 GoDNS 现已支持同时使用多个 DNS 提供商!
您现在可以在单个配置文件中配置来自不同 DNS 提供商的域名,从而实现:
- 跨多个 DNS 服务(Cloudflare、DNSPod、DigitalOcean 等)管理域名
- 为每个服务使用提供商特定的凭据
- 与现有单提供商配置保持完全向后兼容
📖 查看完整的多提供商配置指南 了解详细的设置说明和示例。
配置文件格式
GoDNS 支持两种不同的配置文件格式:
- JSON
- YAML
默认情况下,GoDNS 使用 JSON 配置文件。但是,您可以通过 ./godns -c /path/to/config.yaml 指定使用 YAML 格式。
动态加载配置
GoDNS 支持动态加载配置。如果您修改了配置文件,GoDNS 将自动重新加载配置并应用更改。
配置属性
provider— 使用的一个 支持的提供商:Cloudflare、Google、DNSPod、AliDNS、HE、DuckDNS或Dreamhost。email— DNS 提供商的电子邮件或账户名。password— DNS 提供商的密码。login_token— DNS 提供商的 API 令牌。domains— 域名列表,包含您的子域名。ip_urls— 用于获取公共 IPv4 地址的 URL 数组。ipv6_urls— 用于获取公共 IPv6 地址的 URL 数组。ip_type— 决定使用 IPv4 还是 IPv6 的开关(当 支持 时)。可用值:IPv4或IPv6。interval— 公共 IP 更新的频率(以秒为单位)。socks5_proxy— Socks5 代理服务器。resolver— 要使用的公共 DNS 服务器地址。例如,要使用 Google 的公共 DNS,您可以在使用 GoDNS 的 IPv4 模式时设置8.8.8.8,或在 IPv6 模式时设置2001:4860:4860::8888。skip_ssl_verify- 跳过对 https 请求的 SSL 证书验证。
更新根域名
只需将 @ 放入 sub_domains,例如:
"domains": [{
"domain_name": "example.com",
"sub_domains": ["@"]
}]
配置示例
Cloudflare
对于 Cloudflare,您需要提供电子邮件和全局 API 密钥作为密码(或使用 API 令牌),并配置所有域名和子域名。
通过设置选项 proxied = true,记录将获得 Cloudflare 的性能和安全优势。此选项仅适用于 Cloudflare。
使用电子邮件和全局 API 密钥
{
"provider": "Cloudflare",
"email": "[email protected]",
"password": "Global API Key",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": "",
"proxied": false
}
使用 API 令牌
{
"provider": "Cloudflare",
"login_token": "API Token",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
DNSPod
对于 DNSPod,您需要提供您的 API 令牌(您可以在这里创建),并配置所有域名和子域名。
示例
{
"provider": "DNSPod",
"login_token": "your_id,your_token",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
DigitalOcean
对于 DigitalOcean,您需要提供一个具有 domain 范围的 API 令牌(您可以在这里创建),并配置所有域名和子域名。
示例
{
"provider": "DigitalOcean",
"login_token": "dop_v1_00112233445566778899aabbccddeeff",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["@", "www"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300
}
Dreamhost
对于 Dreamhost,您需要提供您的 API 令牌(您可以在这里创建),并配置所有域名和子域名。
示例
{
"provider": "Dreamhost",
"login_token": "your_api_key",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"resolver": "ns1.dreamhost.com",
"socks5_proxy": ""
}
Dynv6
对于 Dynv6,只需提供 token,配置 1 个默认域名和子域名。
示例
{
"provider": "Dynv6",
"password": "",
"login_token": "1234567ABCDEFGabcdefg123456789",
"domains": [
{
"domain_name": "dynv6.net",
"sub_domains": ["myname"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
Google Domains
对于 Google Domains,您需要提供电子邮件和密码,并配置所有域名和子域名。
示例
{
"provider": "Google",
"email": "Your_Username",
"password": "Your_Password",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
AliDNS
对于 AliDNS,您需要提供 AccessKeyID 和 AccessKeySecret 作为 email 和 password,并配置所有域名和子域名。
示例
{
"provider": "AliDNS",
"email": "AccessKeyID",
"password": "AccessKeySecret",
"login_token": "",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
DuckDNS
对于 DuckDNS,只需提供 token,配置 1 个默认域名和子域名。
示例
{
"provider": "DuckDNS",
"password": "",
"login_token": "3aaaaaaaa-f411-4198-a5dc-8381cac61b87",
"domains": [
{
"domain_name": "www.duckdns.org",
"sub_domains": ["myname"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
No-IP
示例
{
"provider": "NoIP",
"email": "[email protected]",
"password": "YourPassword",
"domains": [
{
"domain_name": "ddns.net",
"sub_domains": ["timothyye6"]
}
],
"ip_type": "IPv4",
"ip_urls": ["https://api.ip.sb/ip"],
"resolver": "8.8.8.8",
"interval": 300,
"socks5_proxy": ""
}
HE.net
对于 HE,不需要电子邮件,只需填写 DDNS 密钥作为密码,并配置所有域名和子域名。
示例
{
"provider": "HE",
"password": "Your DDNS Key",
"login_token": "",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
提供商配置
添加一个新的 "A 记录" 并确保勾选 "启用动态 DNS 条目":

填写您自己的 DDNS 密钥或为这个新创建的 "A 记录" 生成一个随机 DDNS 密钥:

记住 DDNS 密钥并在配置文件中设置到 password 属性中。
注意:如果您有多个域名或子域名,请确保它们的 DDNS 密钥相同。
Scaleway
对于 Scaleway,您需要提供 API 密钥作为 login_token(如何生成 API 密钥),并配置域名和子域名。domain_name 应等于 Scaleway 中的 DNS 区域或根域名。DNS 记录的 TTL 将设置为 interval 值。确保相关子域名的 A 或 AAAA 记录存在,这些可以在 Scaleway 控制台 中设置。
示例
{
"provider": "Scaleway",
"login_token": "API Secret Key",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "@"]
},
{
"domain_name": "samplednszone.example.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300
}
Linode
要与 Linode API 进行身份验证,您需要提供一个具有“读/写”访问权限的个人访问令牌,范围为“Domain”。Linode 有一个关于创建访问令牌的帮助页面。将此令牌传入配置文件中的 login_token 字段。
配置文件中的 domain_name 字段必须是 Linode 管理的现有域名的名称。Linode 有一个关于添加域名的帮助页面。GoDNS Linode 处理程序不会自动创建域名,但会自动创建子域名。
GoDNS Linode 处理程序目前对 Linode DNS 记录使用固定的 30 秒 TTL。
示例
{
"provider": "Linode",
"login_token": ${PERSONAL_ACCESS_TOKEN},
"domains": [{
"domain_name": "example.com",
"sub_domains": ["www","@"]
},{
"domain_name": "samplednszone.example.com",
"sub_domains": ["www","test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300
}
Strato
对于 Strato,您需要提供电子邮件和密码,并配置所有域名和子域名。 更多信息:德语 英语
示例
{
"provider": "strato",
"password": "Your_Password",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
LoopiaSE
对于 LoopiaSE,您需要提供用户名和密码,并配置所有域名和子域名。 更多信息:瑞典语
示例
{
"provider": "LoopiaSE",
"email": "Your_Username",
"password": "Your_Password",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
Infomaniak
对于 Infomaniak,您需要提供用户名和密码,并配置所有域名和子域名。 更多信息:英语
示例
{
"provider": "Infomaniak",
"email": "Your_Username",
"password": "Your_Password",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
Hetzner
对于 Hetzner,您必须创建一个访问令牌。这可以在 DNS 控制台中完成。 (左上角的个人图标 --> API 令牌) 注意:如果一个域名有多个记录,只有第一个记录会被更新。 确保只有一个记录。
示例
{
"provider": "hetzner",
"login_token": "<token>",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4"
}
OVH
对于 OVH,您需要提供 Consumerkey、Appsecret 和 Appkey,并配置所有域名和子域名。 所需的值可以通过访问此网站获取 权限应在 GET、POST 和 PUT 上设置为 '*' 更多信息:help.ovhcloud.com
示例
{
"provider": "OVH",
"consumer_key": "e389ac80cc8da9c7451bc7b8f171bf4f",
"app_secret": "d1ffee354d3643d70deaab48a09131fd",
"app_key": "cd338839d6472064",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["www", "test"]
},
{
"domain_name": "example2.com",
"sub_domains": ["www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
Porkbun
对于 Porkbun,您需要提供 API 密钥作为 login_token 和秘密密钥作为 password。
从 Porkbun API 管理 获取您的 API 凭据。
示例
{
"provider": "Porkbun",
"login_token": "pk1_your_api_key",
"password": "sk1_your_secret_key",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["@", "www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ipify.org"],
"ip_type": "IPv4",
"interval": 300
}
name.com
对于 name.com,您需要提供账户用户名作为 email,API 令牌作为 login_token。
从 name.com API 设置 生成 API 令牌。该提供商使用 CORE v1 API,记录不存在时会自动创建。
示例
{
"provider": "NameDotCom",
"email": "your_username",
"login_token": "your_api_token",
"domains": [
{
"domain_name": "example.com",
"sub_domains": ["@", "www", "test"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ipify.org"],
"ip_type": "IPv4",
"interval": 300
}
Dynu
对于 Dynu,您需要配置 password,配置 1 个默认域名和子域名。
示例
{
"provider": "Dynu",
"password": "Your_Password",
"domains": [
{
"domain_name": "your_domain.com",
"sub_domains": ["your_subdomain"]
}
],
"resolver": "8.8.8.8",
"ip_urls": ["https://api.ip.sb/ip"],
"ip_type": "IPv4",
"interval": 300,
"socks5_proxy": ""
}
IONOS
这是针对 IONOS 托管服务的,不是 IONOS 云。
您需要注册 IONOS API 访问托管服务,然后创建一个API 密钥。
您可以在IONOS API 文档中找到完整指南。
注意:GoDNS 使用的 API 密钥必须遵循上述文档中描述的 publicprefix.secret 形式。
示例
provider: IONOS
login_token: publicprefix.secret
domains:
- domain_name: example.com
sub_domains:
- somesubdomain
- anothersubdomain
resolver: 1.1.1.1
ip_urls:
- https://api.ipify.org
ip_type: IPv4
interval: 300
socks5_proxy: ""
TransIP
对于 TransIP,您需要提供您的 API 私钥作为 login_token,用户名作为 email,并配置所有域名和子域名。
示例
provider: TransIP
email: account_name
login_token: api_key
domains:
- domain_name: example.com
sub_domains:
- "@"
- somesubdomain
- anothersubdomain
resolver: 1.1.1.1
ip_urls:
- https://api.ipify.org
ip_type: IPv4
interval: 300
socks5_proxy: ""
通知
GoDNS 可以在 IP 更改时发送通知。
电子邮件
电子邮件通过 SMTP 发送。使用以下片段更新您的配置:
"notify": {
"mail": {
"enabled": true,
"smtp_server": "smtp.example.com",
"smtp_username": "user",
"smtp_password": "password",
"smtp_port": 25,
"send_from": "[email protected]"
"send_to": "[email protected]"
}
}
每次 IP 更改时,您将收到如下电子邮件:

Telegram
要在 IP 更改时接收 Telegram 消息,使用以下片段更新您的配置:
"notify": {
"telegram": {
"enabled": true,
"bot_api_key": "11111:aaaa-bbbb",
"chat_id": "-123456",
"message_template": "域名 *{{ .Domain }}* 已更新为 %0A{{ .CurrentIP }}",
"use_proxy": false
},
}
message_template 属性支持 markdown。新行需要用 %0A 转义。
Slack
要在 IP 更改时接收 Slack 消息,使用以下片段更新您的配置:
"notify": {
"slack": {
"enabled": true,
"bot_api_token": "xoxb-xxx",
"channel": "your_channel",
"message_template": "域名 *{{ .Domain }}* 已更新为 \n{{ .CurrentIP }}",
"use_proxy": false
},
}
message_template 属性支持 markdown。新行需要用 \n 转义。
Discord
要在 IP 更改时接收 Discord 消息,使用以下片段更新您的配置:
"notify": {
"discord": {
"enabled": true,
"bot_api_token": "discord_bot_token",
"channel": "your_channel",
"message_template": "(可选) 域名 *{{ .Domain }}* 已更新为 \n{{ .CurrentIP }}",
}
}
Pushover
要在 IP 更改时接收 Pushover 消息,使用以下片段更新您的配置:
"notify": {
"pushover": {
"enabled": true,
"token": "abcdefghijklmnopqrstuvwxyz1234",
"user": "abcdefghijklmnopqrstuvwxyz1234",
"message_template": "",
"device": "",
"title": "",
"priority": 0,
"html": 1
}
}
如果 html 参数为 1,message_template 属性支持 html。如果留空,将使用默认消息。
如果 device 和 title 参数留空,Pushover 将选择默认值参见。有关优先级参数的更多详细信息
可以在 Pushover API 描述 中找到。
Bark
要在 IP 更改时接收 Bark 消息,使用以下片段更新您的配置:
"notify": {
"bark": {
"enabled": true,
"server": "https://api.day.app",
"device_keys": "",
"params": "{ \"isArchive\": 1, \"action\": \"none\" }"
}
}
server Bark 服务器地址,可使用官方默认服务器 https://api.day.app,也可设置为自建服务器地址。device_keys 设备 key,支持多个(英文逗号分隔),多个时,用于批量推送。params Bark 请求参数,可参考 Bark APIuser 自建服务器 Basic auth 用户名,与服务端环境变量 BARK_SERVER_BASIC_AUTH_USER 一致。password 自建服务器 Basic auth 密码,与服务端环境变量 BARK_SERVER_BASIC_AUTH_PASSWORD 一致。
更多内容请参阅 Bark 官方文档
Ntfy
要在 IP 更改时接收 ntfy 通知,使用以下片段更新您的配置:
"notify": {
"ntfy": {
"enabled": true,
"topic": "godns",
"server": "https://ntfy.sh",
"token": "",
"user": "",
"password": "",
"priority": "default",
"tags": "rotating_light",
"icon": "",
"message_template": ""
}
}
topic 要发布到的 ntfy 主题(必填)。主题本质上是一个频道名称,请选择不容易被猜到的名称。server ntfy 服务器 URL。默认为 https://ntfy.sh。如果使用自建服务器,请设置为自建服务器地址。token 用于身份验证的访问令牌(可选)。仅在启用了访问控制的自建服务器上需要。user 基本身份验证的用户名(可选)。与 password 一起用于自建服务器。password 基本身份验证的密码(可选)。与 user 一起用于自建服务器。priority 消息优先级:min、low、default、high 或 max(可选)。tags 以逗号分隔的标签或 emoji 短代码 列表(可选)。icon 通知中显示的图标 URL(可选)。message_template 自定义消息模板(可选)。如果为空,默认为 IP address of {{ .Domain }} updated to {{ .CurrentIP }}。
更多信息请参阅 ntfy 官方文档
Webhook
Webhook 是 GoDNS 提供的另一个功能,用于在 IP 更改时向其他应用程序发送通知。GoDNS 通过 HTTP GET 或 POST 请求向目标 URL 发送通知。
配置部分 webhook 用于自定义 webhook 请求。通常,有 2 个字段用于 webhook 请求:
url:发送 webhook 请求的目标 URL。request_body:发送POST请求的内容,如果此字段为空,则发送 HTTP GET 请求而不是 HTTP POST 请求。
可用变量:
Domain:当前域名。IP:新 IP 地址。IPType:IP 类型:IPV4或IPV6。
使用 HTTP GET 请求的 Webhook
"webhook": {
"enabled": true,
"url": "http://localhost:5000/api/v1/send?domain={{.Domain}}&ip={{.CurrentIP}}&ip_type={{.IPType}}",
"request_body": ""
}
对于此示例,将向目标 URL 发送带有查询字符串参数的 webhook:
http://localhost:5000/api/v1/send?domain=ddns.example.com&ip=192.168.1.1&ip_type=IPV4
使用 HTTP POST 请求的 Webhook
"webhook": {
"enabled": true,
"url": "http://localhost:5000/api/v1/send",
"request_body": "{ \"domain\": \"{{.Domain}}\", \"ip\": \"{{.CurrentIP}}\", \"ip_type\": \"{{.IPType}}\" }"
}
对于此示例,当 IP 更改时将触发 webhook,目标 URL http://localhost:5000/api/v1/send 将收到带有请求体的 HTTP POST 请求:
{ "domain": "ddns.example.com", "ip": "192.168.1.1", "ip_type": "IPV4" }
杂项主题
IPv6 支持
大多数 提供商 都支持 IPv6。
要启用 GoDNS 的 IPv6 支持,有两种解决方案可供选择:
使用在线服务查找外部 IPv6
为此:
- 将
ip_type设置为IPv6,并确保配置了ipv6_urls - 在您的 DNS 提供商中创建
AAAA记录而不是A记录
配置示例
{ "domains": [ { "domain_name": "example.com", "sub_domains": ["ipv6"] } ], "resolver": "2001:4860:4860::8888", "ipv6_urls": ["https://api-ipv6.ip.sb/ip"], "ip_type": "IPv6" }- 将
让 GoDNS 查找其运行机器的网络接口的 IPv6(稍后详细说明网络接口 IP 地址)。
为此,只需将
ip_urls和ipv6_urls留空。请注意,网络接口必须配置 IPv6 才能正常工作。
网络接口 IP 地址
由于某些原因,如果您想获取与网络接口关联的 IP 地址(而不是执行在线查找),您可以在配置文件中这样指定:
"ip_urls": [""],
"ip_interface": "interface-name",
将 interface-name 替换为网络接口的名称,例如 Linux 上的 eth0 或 Windows 上的 Local Area Connection。
注意:如果也指定了 ip_urls,它将首先用于执行在线查找,网络接口 IP 将在失败情况下用作后备。
通过特定网络接口查询 IP
在有多条上行链路的主机上,在线 IP 查询默认会走默认路由。如果默认路由在 CGNAT 后面,而另一条链路拥有公网地址,查询结果就会是错误的 IP。query_interface 可以让查询请求从指定的网络接口发出:
{
"ip_urls": ["https://api.ipify.org/"],
"query_interface": "wan0",
"ip_type": "IPv4"
}
GoDNS 会把查询用的 socket 绑定到该设备(Linux 上使用 SO_BINDTODEVICE,macOS 上使用 IP_BOUND_IF),并使用该接口的地址作为源地址。设备绑定才是真正决定路由的关键,因此无需额外配置策略路由。在其他平台上只会绑定源地址,这在系统路由已经把该源地址导向正确链路时同样有效。
注意:
query_interface与ip_interface不同。query_interface决定 HTTP 请求从哪条链路发出,ip_interface则直接读取本地接口上的地址,不发出任何请求。- 该接口必须拥有与
ip_type匹配的全局单播地址。私有地址也可以,例如位于 1:1 NAT 之后的接口。 - 在低于 5.7 的 Linux 内核上,绑定设备需要
CAP_NET_RAW权限。绑定失败时查询会直接失败,而不会悄悄退回默认路由。 - 查询 URL 的主机名仍然通过系统解析器解析。
SOCKS5 代理支持
您可以通过在配置文件中指定 SOCKS5 代理 来使所有远程调用通过该代理:
"socks5_proxy": "127.0.0.1:7070"
"use_proxy": true
从 RouterOS 获取 IP
如果您想从 Mikrotik RouterOS 设备获取公共 IP,您可以使用以下配置:
"mikrotik": {
"enabled": false,
"server": "http://192.168.88.1",
"username": "admin",
"password": "password",
"interface": "pppoe-out"
}
显示调试信息
要显示调试信息,将 debug_info 设置为 true 以启用此功能。默认情况下,调试信息被禁用。
"debug_info": true,
多个 API URL
GoDNS 支持通过简单的轮询算法从多个 URL 获取公共 IP。如果第一个 URL 失败,它将尝试下一个,直到成功。以下是配置示例:
"ip_urls": [
"https://api.ipify.org",
"https://api-ipv4.ip.sb/ip"
],
推荐的 API
Web 面板

从版本 3.1.0 开始,GoDNS 提供了一个 Web 面板来管理配置和监控域名状态。Web UI 默认是禁用的。要启用它,只需在配置文件中启用 web_panel。
"web_panel": {
"enabled": true,
"addr": "0.0.0.0:9000",
"username": "admin",
"password": "123456"
}
启用 Web 面板后,您可以访问 http://localhost:9000 来管理配置和监控域名状态。
运行 GoDNS
有几种运行 GoDNS 的方式。
手动运行
注意:确保在配置文件中设置 run_once 参数,这样程序将在首次运行后退出(默认值为 false)。
它可以添加到 cron 或附加到系统上的其他事件。
{
"...": "...",
"run_once": true
}
然后运行
./godns
作为手动守护进程
nohup ./godns &
注意:当程序停止时,它不会重新启动。
作为托管守护进程(使用 upstart)
首先安装
upstart(如果尚未可用)将
./config/upstart/godns.conf复制到/etc/init(并根据需要调整)启动服务:
sudo start godns
作为托管守护进程(使用 systemd)
首先安装
systemd(如果尚未可用)将
./config/systemd/godns.service复制到/lib/systemd/system(并根据需要调整)启动服务:
sudo systemctl enable godns sudo systemctl start godns
作为托管守护进程(使用 procd)
procd 是 OpenWRT 上的 init 系统。如果您想在 OpenWRT 和 procd 上将 godns 用作服务:
将
./config/procd/godns复制到/etc/init.d(并根据需要调整)启动服务(需要 root 权限):
service godns enable service godns start
作为 Docker 容器
可用的 docker 注册表:
访问 https://hub.docker.com/r/timothyye/godns 获取最新的 docker 镜像。-p 9000:9000 选项暴露 Web 面板。
使用 /path/to/config.json 作为您的本地配置文件,运行:
docker run \
-d --name godns --restart=always \
-v /path/to/config.json:/config.json \
-p 9000:9000 \
timothyye/godns:latest
要使用 YAML 配置文件运行:
docker run \
-d --name godns \
-e CONFIG=/config.yaml \
--restart=always \
-v /path/to/config.yaml:/config.yaml \
-p 9000:9000 \
timothyye/godns:latest
作为 Windows 服务
下载最新版本的 NSSM
在管理员提示符中,从下载 NSSM 的文件夹(例如
C:\Downloads\nssm\win64)运行:nssm install YOURSERVICENAME按照界面配置服务。在"Application"选项卡中只需指明
godns.exe文件的位置。您还可以选择在"Details"选项卡上定义描述,并在"I/O"选项卡上定义日志文件。点击"Install service"按钮完成。该服务现在将与 Windows 一起启动。
注意:您可以通过运行以下命令卸载服务:
nssm remove YOURSERVICENAME
贡献
欢迎贡献!请随时提交 Pull Request。
设置前端开发环境
要求:
- Bun
1.3.11或更高版本 - Go
1.17或更高版本
前端项目使用 Next.js 和 daisyUI 构建。要启动开发环境,运行:
cd web
bun install
bun run dev
构建前端
要构建前端,运行:
cd web
bun run build
运行前端
要运行前端,运行:
cd web
bun run start