|
|
# ddns-go
: i Q/ w6 ^, k$ Z, y$ \* q# l
* Y5 f6 \* A$ U% ^8 W4 z' {/ M自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。* [! _: T9 z* Y8 o: C a- P5 Z
* V* S, s, @" T& J- [特性](#特性)6 o3 B- t0 B+ y" u7 _& y
- [系统中使用](#系统中使用)8 _3 @/ N1 g& ?- V" _
- [Docker中使用](#docker中使用)# [! @* k3 L* I' C7 X
- [使用IPv6](#使用ipv6)
3 _4 ~: m d) O* y" U4 x4 X, L- [Webhook](#webhook), W) @0 h+ W" g1 ?/ _ [4 z4 ?4 d/ N
- [Callback](#callback)
0 ~) z& y0 B5 A' D7 U5 ?) h& u# B- [界面](#界面)( q' b- a; R6 j5 D9 N q7 V5 S
- [开发&自行编译](#开发自行编译)
. d; m" K3 Q5 i
' |# \; \6 a' F/ h## 特性
/ Z% F% I- E- G9 t" A0 O0 }
4 |7 c2 T) w! k5 s' f- 支持Mac、Windows、Linux系统,支持ARM、x86架构& S8 c- j0 u4 V# J2 D, y
- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`
- @! j6 u. D- j( c3 r O7 g- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP
2 y! E7 w/ k# J3 A* U- 支持以服务的方式运行
4 I, d7 F2 z2 W Z0 S4 c, i W- 默认间隔5分钟同步一次
! {# K5 E2 Y, F0 P( k* a- x- 支持同时配置多个DNS服务商
+ \) f. D! |" `3 r" [' E p1 v! B& ]: y- 支持多个域名同时解析2 w& i9 s3 T& ^; J
- 支持多级域名
- m5 j2 M8 O% x1 _: m- 网页中配置,简单又方便,默认勾选`禁止从公网访问`+ f% z* c, i* g9 I6 J4 m
- 网页中方便快速查看最近50条日志$ K! E9 a2 V: T' Q) X
- 支持Webhook通知
+ o- e: S4 k' p/ A1 I- 支持TTL0 ^& w5 U D6 K* |# Z2 \
- 支持部分DNS服务商[传递自定义参数]
8 q8 [8 ~& ^) L1 I/ _
5 x+ B+ E) L" o7 [7 Q1 G2 {> [!NOTE]
% o0 G0 r3 j+ D. ?" S> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。4 e/ ]8 p( L5 @ e. C: q+ g
## 系统中使用1 @0 `; k- A/ u) g0 l4 T; v
2 D- p* G4 Y+ w! W7 i9 E' Q) E3 R
- 从 [Releases] 下载并解压 ddns-go
k) z5 b8 J4 x1 M2 `9 q, N- 安装服务& z- u7 q, v# @$ ?
- Mac/Linux: `sudo ./ddns-go -s install`
% ^) W$ Z t6 i, L9 g$ I( t - Win(以管理员打开cmd): `.\ddns-go.exe -s install`( Y# n6 h, B% v I- @: h$ d
- [可选] 服务卸载) q3 e; L+ N2 |# n; D
- Mac/Linux: `sudo ./ddns-go -s uninstall`
1 Q, K7 L9 p0 T& d8 e+ V - Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`
6 F. ^$ v+ d. a9 ]- [可选] 支持安装带参数
6 S/ M+ z4 w% S# k8 C - `-l` 监听地址" {7 P- @! S/ s0 D2 ~' T, [$ s( l/ w- t& }
- `-f` 同步间隔时间(秒)
$ `' @1 s( w; Q5 Y9 k/ h! d& E. Z. r - `-cacheTimes` 间隔N次与服务商比对8 U" ]! r& o- }2 }2 Z8 z! b
- `-c` 自定义配置文件路径
$ E0 z- \: g! k7 y; L4 \% u4 o - `-noweb` 不启动web服务1 Y% f% H/ `) J7 c' f
- `-skipVerify` 跳过证书验证) d+ B. {+ n! h/ m
- `-dns` 自定义 DNS 服务器
! u* }8 p7 m* T- [可选] 参考示例 D' S0 i+ E: n: a4 Z
- 10分钟同步一次, 并指定了配置文件地址
& i- G& l! F4 [ ```bash
' N3 T" M8 v* g9 u ./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml4 A$ L; p2 [6 \8 m) G) f5 B
```
1 y8 t: {8 \, W. U0 L" q) m; X - 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流
0 J& B0 j* Y4 [9 {0 n ```bash; G) n- u- S' V* y7 u9 I9 `
./ddns-go -s install -f 10 -cacheTimes 180
' U; u+ I! P: L+ }9 M- N5 f0 c ```* e. \$ v0 D. B
- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):& ~; [8 e3 q6 |4 A% `
2 J& m) e9 N) v; g% ^/ K. M W( u
```bash
/ p9 S9 ]) T& J8 Y8 ] brew install ddns-go
3 _. v B D& d, S* C X# j" c* C ```
3 L& i- ~' H3 A% q- y4 R7 a7 x1 m, c! w! I% v' b3 f
## Docker中使用
3 K2 B' V u5 q8 O8 L7 u8 r6 C8 [- c
- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件
n# c3 b. Q5 o* w; y3 Q1 s( u! U: e0 ~4 H
```bash5 x! A5 q, Z8 q2 N! ?
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go
9 c3 P, Q4 w' D5 i X+ w' ?6 H ```- @. v0 t }/ f' r" E
" Y% s% D6 e! `6 o: H! S0 S
- 在浏览器中打开`http://主机IP:9876`,并修改你的配置$ }0 }3 ^: A: A( w% V6 k- a% E
- ]- K$ j* y1 X. |. p- [可选] 使用 `ghcr.io` 镜像
" P% Q$ _( d3 }. y8 r% e4 ^- C( M- t, v1 l1 Z z
```bash
; ~" }+ Y' u* q+ H# D docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go
! b& P6 L0 v1 \; m( ]( S ```
$ L4 p# B, n! J
' {# T! V# k! c! e% e# @4 a- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒). j' Y! ^! T. z
, d" P7 m" N1 g# T: | ```bash4 B, r, N: l* t. G
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 6001 u# f- B3 J* q) ~. r9 u; q
```
0 A/ z: T* B. x; ]0 \7 ~
1 g1 j3 `* g- D, M! d, }8 N- [可选] 不使用docker host模式: B- K& I" _" v& I# d5 \0 F1 ]0 G U
7 w! m( f3 A" i7 f0 {* o9 {
```bash
/ @3 r4 F [' u3 m' K' Y docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go3 x0 R1 @. ~! V9 B. q7 B
```5 Z5 [/ {6 \" C( ]
0 e! b" r2 ~0 `) j' Y1 K## 使用IPv6
% b4 \0 z2 Y8 ^% b% Z% ]
5 G, C5 s7 X+ U$ e+ ]5 n" v- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv68 D# ?- j' }# g+ z J! V
- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`
& Q) k J# i7 j- 群晖:" A; |% H( p$ X/ B
- 套件中心下载docker并打开7 p! x- x$ a1 u0 R) I
- 注册表中搜索`ddns-go`并下载
' N& E* |3 b8 q' S! w - 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`$ d" c, y, h$ n; d9 @
- 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功5 b1 ~1 L8 L8 Q4 U" W2 m
- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用)
* u0 n6 A3 b$ f6 d4 n& s F" U- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv67 o$ a6 i$ A( E* H1 z
K* N( C/ t$ ^# L: r4 _( ?
## Webhook9 I8 f" g" z1 C; h
0 V% ?. v4 i# ^% V1 U, j9 r- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL5 `- T+ g( k: Z
- 支持的变量 Z, y+ M5 F% ?' A1 x
; e+ y; z. Z- c1 i! k* W: h
| 变量名 | 说明 |
% E6 f1 E) k) W" _. j | ---- | ---- |
+ v' D% O1 S1 _1 Y | #{ipv4Addr} | 新的IPv4地址 |
1 f3 J" w# v& b! K! j& A: s | #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`|
0 t! [3 L$ u2 a | #{ipv4Domains} | IPv4的域名,多个以`,`分割 |9 {) u$ K( e( L- E
| #{ipv6Addr} | 新的IPv6地址 |+ \3 V& V. A) c: F$ T
| #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|
- \" R4 I8 o' m/ m j0 V | #{ipv6Domains} | IPv6的域名,多个以`,`分割 |
9 M3 M2 K4 D; Q0 Z( D
, M/ m1 k1 _ u8 W4 C! z' Z- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求/ h9 i" Q( u; }' s* f6 }
- <details><summary>Server酱</summary>9 _" e' Y7 t+ W$ h
9 C; U# R& P1 O- W6 l1 V- {
```
! Z* @! j" u' G, u' c https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
{( W5 r3 v* u8 s# n; I' `5 ~ ```4 x/ Y; m1 O3 Z5 V+ k1 U) v. t
- <details><summary>Bark</summary>/ C/ Q7 v4 k% _- t8 ^5 k
7 p! ]/ Y" \. f8 ^( p ```2 @; u" u3 a. o
https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result} j5 g+ d2 z) x( P4 t" E; @6 v3 d; _6 |
```
% G: e4 _8 \+ x4 M </details>% e/ k5 [5 m! n! c: [7 U6 W$ O/ w/ B
- <details><summary>钉钉</summary>! V5 M e* w: X4 b4 p' r( K) F2 a
9 ]: [1 a* l1 h @' Y
- 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义( a: W0 `4 K' }" d: F, j- _. x
- 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`4 {( q+ O7 \8 |1 @8 M4 a. g" g
- URL中输入钉钉给你的 `Webhook地址`4 B7 _8 q& N8 p2 N
- RequestBody中输入
& `3 N5 {+ x% `6 b- d% a ```json8 n. P% w& S+ S# J0 Z5 o
{- N2 y( m* Y' ]7 u. H
"msgtype": "markdown",
- _7 t6 \1 ^" d5 L$ N8 Z) l "markdown": {9 e! `0 Y' P Q2 D! Q4 b. J
"title": "你的公网IP变了",' |' x4 Y& f* F+ q! Z: T6 e
"text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n": {& J G8 s$ S" [
}; d5 N$ F+ q4 I% w4 l: b' j
}* s5 p$ f) o4 V7 f
```
5 b) l! ^6 b1 ]/ W: g1 R6 @ </details>7 F8 `7 I4 T0 b
- <details><summary>飞书</summary>
: C7 ]- R7 J% M) z! b8 S' F8 U
: B5 T; P: z' S! A0 E8 e - 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人
" g+ W" m" z( v% v6 d6 a - 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
}' g! y) a% | - URL中输入飞书给你的 `Webhook地址`5 s C0 R7 w4 |
- RequestBody中输入3 D, F) e L1 f
```json3 R4 C4 z* a/ h* H L, C
{$ _: e6 [, o. C' J
"msg_type": "post",
9 i7 p3 r+ ^9 S. Y+ Q6 t5 P( k( ~ "content": {
! q" E/ s' O& X1 A3 {4 _( ] "post": {( f$ u5 R# _+ F/ ]5 T8 B4 U) i% G* [
"zh_cn": {
, X8 `/ O5 h* _* m: k9 B" o "title": "你的公网IP变了",8 f4 o: E. ?9 ^5 _
"content": [
& Y( d& _1 a# z% c ` [
/ p% @' q' B- t4 H7 L {% a- H+ }7 z1 S( z
"tag": "text",4 z7 B3 m4 w# \+ x
"text": "IPv4地址:#{ipv4Addr}"
1 w9 m1 i Z$ C3 f1 \( Z }# J; `6 @7 A; o2 t; M& b/ b1 C; {
],
( U/ h; p& u1 ?: B" Y" s% g [
( V' g8 @+ K+ @# |/ z1 d {* P& g/ U' N* Q0 J. q. ]
"tag": "text",
) _5 q% c% i5 c o$ G$ ^% |5 ^, L( I "text": "域名更新结果:#{ipv4Result}"
_/ H5 E, R; Y/ o: v }
3 y* a& l* y0 L7 ?$ `) E4 e* e ]
$ Z% D: Y8 I& O5 ?, {5 C# v4 i ]
3 A0 s! Y- C; _" }# U' k" k }
& k5 N- m, S: T2 r) q8 t }& A( q8 w% J* K8 Y- R
}9 Q$ F- q6 [/ Y' R
} Q, ]& I. Z! K6 C, D c
```
, r% E& }1 ? S4 @ </details>: N ^) E. ~# x
- <details><summary>Telegram</summary>) o4 b& I3 n! ]8 {" u
5 i0 m8 i3 K3 ~: |2 O3 W+ Q
[ddns-telegram-bot]
& Q9 U! o1 N, x9 } </details> v! {# m u8 N5 [1 V/ h
- <details><summary>plusplus 推送加</summary>
; s7 E8 u! g/ \1 ~1 S. J A$ e% |% o# V5 V; A% A# e# D7 G
- [获取token](https://www.pushplus.plus/push1.html)
% _) u* j# l/ \1 v9 | - URL中输入 `https://www.pushplus.plus/send`
8 |; E N" o5 ~) W: H8 } - RequestBody中输入
. q5 P+ P/ O4 ~$ I4 B1 B9 [ ```json
5 d& Y+ a( n8 H& ^2 [' B6 P {
" }" S1 F( x2 M* `5 X$ R "token": "your token",/ Q3 H$ E2 W& S% s
"title": "你的公网IP变了",* ]5 w2 ~/ E$ b2 W$ a
"content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"+ ^( C- i; X3 j Q
} X* s5 ?9 N( z" E+ w; r
```! m9 i, | h3 R3 y n4 u6 @
</details>
" b/ P- N# F( S- <details><summary>Discord</summary>
$ E5 `% I: e$ z S( O, i. K& |' O8 s2 T
- Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址% j9 @! m" _: V- J/ R4 S; ?
- URL中输入Discord复制的 `Webhook网址`& _5 u$ l+ }$ C
- RequestBody中输入" q& E/ Y U3 s0 q3 {
```json$ ~9 B" i+ s" D4 \3 a: ^, X+ ^
{* {: m! Y i. o1 `) v& \
"content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}."," @) I. D" y( B
"embeds": [" f- ^ U# w. p, o+ l& C
{
7 o" H# B( b! L, n "description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",
1 H6 O8 `+ R8 o5 m2 {1 S+ Q. Y) ~ "color": 15258703,+ S E8 e" a; e" N* \0 _
"author": {/ E- j% i( _6 a& B5 F% C/ l+ G
"name": "DDNS"+ [6 p, b) _! k7 @) |4 S7 r. q
},' ^! l |5 r' b0 n
"footer": {
1 e- l. Y* U+ T7 X) \# o" O "text": "DDNS #{ipv4Result}"* s: p) E- m0 M9 s* ?
} Q, I; _ P8 K- L8 D
}
; R/ L3 W; k8 R5 U ]) r/ ~2 @- O+ a3 E# ~) m4 E7 k
}
" D! P( L& t# ~& }: P2 O1 l( v ```
) j. ]1 M3 ]2 K </details>8 a& ~5 ]& Q. F' v( G8 m' U
4 Y$ U! D- o( X6 |
## Callback
3 c' K2 P' @5 `7 O- N8 o
& D: l2 i2 ~# ~( D t- 通过自定义回调可支持更多的第三方DNS服务商
8 d; o* E, L. x# F- 配置的域名有几行, 就会回调几次! P0 ~2 ]/ I' H) B- E
- 支持的变量. n# k$ d* |3 L) A6 w, T
# W! b% ?1 ~; l% e+ x g( i% t | 变量名 | 说明 |/ }: H% a$ M$ n6 t6 p% S1 |; n0 A
| ---- | ---- |
1 q# V& ?+ h# I Y( @ | #{ip} | 新的IPv4/IPv6地址 |
/ W6 C6 g; ~& N4 l; ~; A+ ] | #{domain} | 当前域名 |
* M6 }7 A% W: z( v. I* e) A4 @" w | #{recordType} | 记录类型 `A`或`AAAA` |# I0 F" z; n/ D3 B! d
| #{ttl} | TTL |
7 G* O N3 t4 J- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求6 v; x1 q! \' [4 L/ ^
- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|