|
|
# ddns-go
Z' O# z% x$ f
, J# Y8 N$ A/ }自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。( z6 C& S$ _5 `1 G
- t2 U* R& `* d! r& I- [特性](#特性)8 @( \1 M# l& K2 _
- [系统中使用](#系统中使用)
( z5 ?% E- f& x/ I. F- [Docker中使用](#docker中使用)$ b0 f1 A& ?) a& i, d5 {0 ?- ~
- [使用IPv6](#使用ipv6)
( }0 \* B1 W) y1 T4 f: I- [Webhook](#webhook)
. q2 X8 r3 N9 O; ` P4 d- [Callback](#callback)% X8 P- X* a9 G' ~! F1 }$ p
- [界面](#界面)
: u8 J4 k1 [3 k- [开发&自行编译](#开发自行编译)3 U$ }! f2 b3 {5 z
) l0 B2 f8 M, _9 `& w7 {## 特性
& G7 n7 p) H+ s: y, m2 w) t, ]6 X- A; Y4 m
- 支持Mac、Windows、Linux系统,支持ARM、x86架构
" n4 O( g5 U- o. [$ f- u2 U0 M- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`
/ h- Y, A- C* ]8 E% Z' w- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP
: ]" t2 A; ` ]) _- a- 支持以服务的方式运行8 t0 o$ g( M) w
- 默认间隔5分钟同步一次
: r! {) z4 ~9 n/ |5 [- 支持同时配置多个DNS服务商" r- X% h$ s+ H: l d' o5 X
- 支持多个域名同时解析8 L! B7 O3 d( `3 P3 J. U
- 支持多级域名+ M/ f+ f4 g- |
- 网页中配置,简单又方便,默认勾选`禁止从公网访问`- [5 s6 H4 M2 R; A9 E# @8 o
- 网页中方便快速查看最近50条日志
0 i/ n& c* t/ g: H2 m- 支持Webhook通知
: N; F( {7 ^) w) R2 J9 p- 支持TTL
% j/ ]4 L8 _% ^- a3 Y. _/ M; F- 支持部分DNS服务商[传递自定义参数]% r0 r, K$ `6 H- Y* X% s* d/ d
! q8 ]' d. A. w q
> [!NOTE]- H9 w' c: F q! S
> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。9 Z8 N' ]* f% n( w
## 系统中使用
8 u5 d) B! p( g$ { |( ^
, t: v( z1 E H9 \$ f- 从 [Releases] 下载并解压 ddns-go5 |# X4 n* l- _, Z0 z/ f! \
- 安装服务
! Q2 v! t9 G1 ~7 N/ Y* S1 [ - Mac/Linux: `sudo ./ddns-go -s install`
- Y+ l, `4 [$ F9 ?" F4 U - Win(以管理员打开cmd): `.\ddns-go.exe -s install`
3 l9 w! z8 W G% Y- [可选] 服务卸载. g( c9 O# z: O, z; J2 F
- Mac/Linux: `sudo ./ddns-go -s uninstall`
# y9 r* }6 r! k" V# V: g$ ] - Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`
1 I' ? ~& H& F! u* e- [可选] 支持安装带参数
: e& m- I2 }3 q/ ~% [5 p - `-l` 监听地址$ O# R5 u" K- t+ R# }
- `-f` 同步间隔时间(秒)
; q: L( |7 Y. a6 X5 n% I5 ] - `-cacheTimes` 间隔N次与服务商比对
4 W- f) t4 M3 Z8 i6 E0 s - `-c` 自定义配置文件路径
) c2 `0 p! e9 T! J - `-noweb` 不启动web服务7 H; [2 A+ h9 `# l
- `-skipVerify` 跳过证书验证 e3 G% M) [; e$ k: `
- `-dns` 自定义 DNS 服务器
- N6 c4 ?0 M! B" F1 Y- [可选] 参考示例8 h9 n* V& I3 N8 ^# r6 ~* R
- 10分钟同步一次, 并指定了配置文件地址) Q* s9 F' c' R; M9 C8 y
```bash1 l2 ^( @, [0 y- Q
./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml
- W$ d7 y# Z. y, r, E; h; n ```
6 I! J- d z( y. R - 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流
' G2 g% x/ P0 f) j ```bash
. ^4 r9 O. _+ }. E ./ddns-go -s install -f 10 -cacheTimes 1802 j7 o4 f) {% U7 k# r) _' K
```
1 }; B5 e. K# t1 H8 z- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):/ i! W8 k0 T( D G' N/ W1 a% e
$ J% Y% N6 j, A1 T" f. v7 w* x ```bash
% {$ R5 _! z0 Y9 k g- R, P brew install ddns-go
& s7 P2 a F, Y; \ ```3 u! H8 @ G9 s: c
% q& B5 o$ z. m& C
## Docker中使用3 ~" M [; g! m5 ^/ I; O
1 ?7 H( S B* _) @. m. {- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件
$ h; O. |" w: d L+ }" l+ ^) A+ o5 C( O
```bash7 Q, H3 U! K9 ]1 ?/ }$ Y
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go- F/ z1 q& S6 b; i( U
```
0 B' x& Q3 {3 L7 k k) A) e3 B8 P, {) D, T" v0 ], s0 C8 l
- 在浏览器中打开`http://主机IP:9876`,并修改你的配置
g% m8 A, a2 G4 K4 i: |" i' d% P! ?8 R' z0 A
- [可选] 使用 `ghcr.io` 镜像6 K) s& X- x4 j# ]2 A1 e1 r/ @* r
+ ]. X& L; N0 D' B; A
```bash
' w& F5 K6 G' u8 n docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go
, G1 {( T2 I, V3 d$ D ```$ Y2 t# F- W- e* S. K
: z) p% x# d1 F
- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒)
. |6 y d; F: y k* Y
) n4 P3 o5 i- H ```bash
8 a" }. L" q* H+ }( m/ a, }1 | docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 600
# N3 U. j' F! i) F ```! }9 J. A8 W% R
6 w; ~7 d% g8 |5 y% v% V! E- [可选] 不使用docker host模式
% z+ J3 J0 G0 @: k8 P0 ?( i9 v1 E6 n# \' ]1 G
```bash% ?+ ?$ x2 a# Y, f; {
docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go
$ j4 v( ]" M4 t2 q0 W) N; F ```2 @! N% M) Z& P% Z/ N( P6 G1 j
1 _3 Z) P% w' a3 a" p) m) Q3 E## 使用IPv64 W/ C6 I- N9 D) V+ F
8 h9 P' m/ {: ~& _* L$ R4 z: s- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv6- a7 i( h! e* y$ \9 t& r5 y
- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`
5 j0 J% g: ^) h, [- 群晖:; {) |6 B7 |" w( T$ q4 {, P
- 套件中心下载docker并打开
$ \" u9 z; r! f - 注册表中搜索`ddns-go`并下载2 {* _8 j! T7 x0 ^& y0 @* s3 c
- 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`
/ x6 \8 F" \% i" W7 H. K0 E1 l9 Y! ~ - 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功. a, S+ T, }6 p% E% r/ k U
- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用)
) W6 W' J0 y* c- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv6& y) w- d1 W: ]8 S* G
7 P* d& Z7 U" y, ^, S
## Webhook8 d7 J* n' M. N* a
8 U. ^5 P* b! N% o7 E
- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL
% p7 ~; y9 z$ Z! ^" G; U- 支持的变量
4 |: g/ C! ]) k7 b- k6 Z# f9 h% ]$ ] O# l
| 变量名 | 说明 |8 @: E- y* x; F! |
| ---- | ---- |
0 o) \+ |% m2 a! a: R | #{ipv4Addr} | 新的IPv4地址 |2 q* `9 F; o+ r/ N4 R" B
| #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`|
4 L, y1 c8 u _4 z$ D+ E! n6 s+ P | #{ipv4Domains} | IPv4的域名,多个以`,`分割 |' d' B+ b1 F" q! v
| #{ipv6Addr} | 新的IPv6地址 |) S& |' N: l$ f( ]: K* f* H
| #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|
) }4 @; i8 D' b5 f1 s1 J | #{ipv6Domains} | IPv6的域名,多个以`,`分割 |3 l6 K$ J" o) _$ u
1 e- H# |8 \5 k. B( F: o# c- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求
/ ^/ u; D9 U% F8 {, K }. F- <details><summary>Server酱</summary>
/ V( c; L% B. J! y: M+ O% @- {9 S- g8 Y; E4 N
```# }0 w8 n; K3 Y* l! U2 e# B
https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
* y* ?5 z: n1 Y4 s5 S; X+ b+ C ```, ]. P2 \- z% v) K% c$ b' X
- <details><summary>Bark</summary>
" Z) M' g1 O M% A$ h0 f% T+ @9 [, k2 y4 Y5 N
```/ u" \1 b2 _( M. b- g& ]
https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}/ u9 j+ p8 V. k1 l F& O4 K
```+ ^ l0 g% w* Z2 b5 @
</details>
7 q: R4 ~) ]0 R4 j9 j* b- <details><summary>钉钉</summary>
7 r0 n. t+ g1 e2 m3 U+ F7 x. _: p
% J5 _1 F. S7 v0 q; Q& N$ T - 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义* G- G5 t" P" o C$ z6 T7 G
- 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
3 o8 A7 h' \, B - URL中输入钉钉给你的 `Webhook地址`
5 L9 q' }) @" |9 ? - RequestBody中输入3 ?5 L' j r+ j+ q: a, V
```json% d7 y3 {* j( R1 Y
{. D) u7 u6 _& N5 L+ f7 r" I; t
"msgtype": "markdown",
' E' x( R4 E/ Y( p6 `& T2 o "markdown": {
% D6 N2 w9 F7 r' j8 h "title": "你的公网IP变了",7 ?7 H. d7 k" P
"text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
# ]' S& R8 Y9 B$ W- u* T }' L0 q$ L5 P, I
}
. B. d( G. K( ?' E+ D) i ```
4 G W* d/ Q: e0 A/ Z; g: Q </details>9 u( f6 F5 q$ D3 r- _/ V5 |# j8 f
- <details><summary>飞书</summary>
* u6 j4 w/ ]2 o* N
h( p6 j4 ? W& \7 m+ m2 r - 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人
2 |& `- ?( }! R( S' l2 X+ @ - 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
9 y2 Y" {+ b1 B8 F @; d - URL中输入飞书给你的 `Webhook地址`. C* z: M- g y- l* R0 P2 l' M
- RequestBody中输入, L& [3 L4 u, @
```json
4 Q4 w; r0 O5 J3 ]2 E {
; k2 y/ y+ R5 f* G "msg_type": "post",) q% _- L% E6 Y
"content": {+ e1 T- Q/ A% w; e
"post": {& T6 B, B% h& h: M* J2 N" V( u
"zh_cn": {
3 `) K. k' G; y# W$ Y' | "title": "你的公网IP变了",
% Q8 k# s3 Y" y* O9 Z0 _ "content": [
8 g- M+ B- i& n% c; Z8 }5 M# N [
) |( ^; J" O3 F& c' K) E {4 j3 L+ O6 B7 \8 ]( }. x
"tag": "text",
8 u; f9 }; Q% e6 `: u; e8 {. R" R/ N& | "text": "IPv4地址:#{ipv4Addr}": `! d3 X6 D6 B3 F4 A
}% Z( d, u4 c4 O2 ~' X4 z; ^
],
( {" F) @2 F2 e$ g$ ^; ^ [
0 k( }. L; Q7 K) y8 g- F7 E& |# \ {* y" t) @7 _. s: r
"tag": "text",
* f7 F+ R0 M) u7 k* X "text": "域名更新结果:#{ipv4Result}"
: ]8 G' Y. o( P+ T }! _& q, e5 B' M4 e$ d% f/ o& M7 A7 d
]
8 }2 ^8 K" g- U6 F& P1 ~4 S ]$ W' P ~7 w. p2 I
}
0 J( Y! A, b1 t" E% V& v* Q0 d% U }& k- Z% ? L5 o5 O* i9 T
}
4 B' n8 t3 j& a }2 ^- A4 s, |5 u! X. d1 @0 a
```
" Q; Z7 N, a" `' _- ?3 U! i- e </details>
$ ], [8 y. T. R6 M0 c7 _- <details><summary>Telegram</summary>/ ~' I. t$ ]; g- A
% \) q5 }3 M* P$ d! j" }. Q [ddns-telegram-bot]
j) ?6 F: G0 T! E d' e </details>
( @* I5 N% \& w- <details><summary>plusplus 推送加</summary>
1 E9 X4 B8 f! E/ s+ N- |+ F
( ~, ~' x& h6 U+ \ - [获取token](https://www.pushplus.plus/push1.html)5 ~! |9 ~9 y. z& t
- URL中输入 `https://www.pushplus.plus/send`3 L- q+ [4 L1 K2 n- W% A
- RequestBody中输入
; C9 d; e9 Z7 d2 I* X- c, N ```json, `) |- s2 z, ?- t. q9 @+ u
{4 J6 ?( l' c! h A
"token": "your token",
1 \4 e$ |4 S8 L* F6 |. M "title": "你的公网IP变了",
7 [. n; {% f* z& i8 G& c "content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
: i5 I K0 ?- S6 l- p }5 F i$ [. V: E9 T w5 h1 ~
```
8 j' m, ]" O0 z+ e0 T+ Q </details>' I' p* ?4 V2 y3 u) R0 b
- <details><summary>Discord</summary> b* B( k, N5 p: W2 @- M7 e
3 N; Q3 C3 P4 m ^+ B! e( D& k
- Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址# f @6 i8 n0 f) `
- URL中输入Discord复制的 `Webhook网址`
) ` n$ B- Z6 w0 B - RequestBody中输入5 I; c* q9 b. y/ ^
```json
1 a0 K: b- B9 k0 s9 U+ y8 H2 V {& u: l* e& M5 z
"content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}.", ~7 ^; i6 ~3 @, T' H
"embeds": [8 e8 L$ G. \- e- p/ u/ S% w6 o; V) N
{2 M$ m$ n/ U3 A- E8 z2 B
"description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",
8 H* B. W! o1 C& I "color": 15258703,1 {% m8 M' R: f; T. \
"author": {
& m' v& E# S1 A: O) i6 d "name": "DDNS"
2 u7 c2 W! K$ l. }; ^' G( \, b4 r },3 N% A, @% l# B T
"footer": {/ v9 s. a( q- I- O4 P f& N% `( T
"text": "DDNS #{ipv4Result}"
' d# c, j- u1 n/ @9 Z2 y. ~ }
% \6 v8 G0 @6 @; @$ k2 h4 L }
0 H6 i% a( ~% ]" s2 u ]
6 i5 i; e. n* `+ ]8 ^. M: s }
$ [! d' t' W( h& T% s- ] ```* u% A8 `7 h' P$ X) Q, N) B# f5 r
</details>& `6 f: R0 w! P" T2 ?3 ]
* o9 J, P! r% |9 x
## Callback$ j+ s; n9 x8 s, B7 D3 `
8 E! L7 ?8 i8 }8 l9 y
- 通过自定义回调可支持更多的第三方DNS服务商
2 z! j* \& d+ n4 j: ~- P- 配置的域名有几行, 就会回调几次% ?0 }, h; K- j, t C/ G/ H( T. ?
- 支持的变量
6 O! I9 ]/ e* K+ q4 _- N. r0 M3 ]0 I$ j7 G, m& ^
| 变量名 | 说明 |
9 {& M# ?3 e( v6 ?6 l8 | b | ---- | ---- |' h D# o3 a1 h8 |
| #{ip} | 新的IPv4/IPv6地址 |5 K* i$ ~+ H' i( `9 ]- ?
| #{domain} | 当前域名 |( Q. Q+ n5 M2 x2 l6 N. g
| #{recordType} | 记录类型 `A`或`AAAA` |
' A5 k( _" X T9 E | #{ttl} | TTL |! U9 a/ U$ I; \1 M& |1 X
- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求
, p! W4 H# h% {' B4 W8 @- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|