|
|
# ddns-go
3 L+ M; ]( N7 n7 V( P- e' `9 f+ d9 V& I+ w
自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。
9 D& @! y+ d+ @
( O7 G8 M& f2 N. R. E# B# m- [特性](#特性)( w1 ~; B7 `1 y
- [系统中使用](#系统中使用)
* W7 K% w5 `7 \: T$ j- [Docker中使用](#docker中使用)
0 O# r S7 |8 |, D' q- [使用IPv6](#使用ipv6)
n; R( f( _" m$ D9 |1 b8 _6 c- [Webhook](#webhook)
2 @! L$ R. R- N# \ K- [Callback](#callback); n u4 n: O/ q" s U
- [界面](#界面)0 i! l$ g* b$ E+ M
- [开发&自行编译](#开发自行编译)
" b" n' M W' T$ E( ]
2 N) \1 t; a- Z" t: I2 @## 特性
" F$ Y5 V$ C0 A+ e5 L/ q! U" ~$ Q2 f5 Y/ H; @ y7 J
- 支持Mac、Windows、Linux系统,支持ARM、x86架构
; j: T; t7 M9 T Q- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`" X6 H9 ]6 U- o6 c/ X9 G
- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP
6 d6 N( ]6 `9 i- 支持以服务的方式运行1 V1 a( _" r' O% G. y* S2 H
- 默认间隔5分钟同步一次" n1 g& y9 t% W3 B- }1 S% z
- 支持同时配置多个DNS服务商
( h) D+ E' O8 U3 R- 支持多个域名同时解析) M& T3 N5 H4 c" s3 b
- 支持多级域名, C0 u0 L2 E+ k e7 B: q
- 网页中配置,简单又方便,默认勾选`禁止从公网访问`
: x4 `* _+ O2 L, K# k6 j- 网页中方便快速查看最近50条日志9 B( V6 m' L! B" n4 m
- 支持Webhook通知' T$ G5 [8 `1 M$ }3 i+ J
- 支持TTL
% T7 ?- A, f# C1 o5 A' _' [- 支持部分DNS服务商[传递自定义参数]; G9 A E$ v! n- _$ V
$ k0 S; N% e: A8 K/ `. p6 t+ u
> [!NOTE]
0 N% O0 \7 k6 d> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。; c3 {' M8 W5 ]! s1 p' k S; _8 P
## 系统中使用
: X" f9 V2 c7 }$ t7 ]1 Z
* ^+ @! P5 P6 s% f7 t- 从 [Releases] 下载并解压 ddns-go
" C5 u+ v2 Z1 w+ U- 安装服务& z/ k( Z1 }( |7 i
- Mac/Linux: `sudo ./ddns-go -s install`5 o4 [9 [( P- _$ l
- Win(以管理员打开cmd): `.\ddns-go.exe -s install`& @% J2 ?6 G3 Z
- [可选] 服务卸载: A+ v, p5 v, E5 C0 q
- Mac/Linux: `sudo ./ddns-go -s uninstall`
* c8 V* ?' U9 y y7 S2 A - Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`
, [+ I J0 T' ^7 Z2 p: I3 ^; f% T2 f- [可选] 支持安装带参数
$ F/ A1 u& D7 k3 k, C, E9 O& l - `-l` 监听地址! {+ [* e7 `1 L$ L/ m3 ]
- `-f` 同步间隔时间(秒)' ~9 P! \1 D) ~0 `" h3 D/ u/ E
- `-cacheTimes` 间隔N次与服务商比对
/ k, N; @% k w$ g9 S - `-c` 自定义配置文件路径) z5 g/ n+ P- X4 m! f0 x
- `-noweb` 不启动web服务+ o+ X* F5 a& r& A9 s
- `-skipVerify` 跳过证书验证. ?7 u: z) g* }% e V( }* ~
- `-dns` 自定义 DNS 服务器
1 T, e6 F9 L" F( Y( M# |0 w' k- [可选] 参考示例
' r! n% i; Z7 U - 10分钟同步一次, 并指定了配置文件地址
/ W* [# K* W+ ] ```bash
7 r8 g$ V9 V( u! e ./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml' C# m8 Y# R+ ? ~
```
: _0 g8 w. X& b8 L" ~$ t - 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流
% z# v" }( Y& ?# q ```bash' d* I: ]0 E% ?# M
./ddns-go -s install -f 10 -cacheTimes 180/ `1 m" v' I5 s. D0 E4 v! W
```4 e6 f* T: N) i5 m0 _! h
- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):
, J" r- C$ y6 l" p( h: M9 `9 B# T; D- a& p. d7 r: `0 f
```bash
0 m, N; j9 _& d! ^6 L4 O brew install ddns-go
4 g4 [' j' U% Y3 E6 L ```: F/ r( `8 S! W9 T! e7 U. o, w
& S3 y1 z2 n6 P$ s# T## Docker中使用7 I& Q* m( Y/ n7 C6 J* S
. ^: V' p+ f8 `! e: X2 C/ `/ F- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件
; A# z8 {7 C# c% p. N( ?4 d) Y$ X' J# C
```bash
* g0 ]7 A, N1 R3 z. Z8 u5 p docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go. E8 N7 A T' z1 F' D
```/ r Q" Y$ }: O S# @
0 A! H3 {3 c. }- 在浏览器中打开`http://主机IP:9876`,并修改你的配置
; V/ P: | J7 i, u" {4 F1 }/ _' z( ]2 W% O; u3 t! y% Z1 y
- [可选] 使用 `ghcr.io` 镜像
8 v! T& U+ G4 }
4 p. U* g. ~' `" C ```bash
( Q! {7 A8 A4 g0 c. @; f docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go
* x+ V/ W& y+ x1 u9 @ ```
3 d% x; f% Y$ {$ v a
) U# T3 J2 h0 @% b- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒): ^2 l& v1 M( G6 ^
# C! W a' K$ C/ O* p$ x) v ```bash: L3 @: d/ a! U& G
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 600
' s8 o" |( _: r' u. I7 j& L ```
I8 a {# m% e; Z- }$ Y: P8 [, Y0 S/ ? N4 _8 m9 P
- [可选] 不使用docker host模式7 F1 z) F% C& G4 u! J. F L' U
8 K1 X) s& }9 g6 n6 @5 g5 ^" Z ```bash* [* L/ ~6 c9 ?3 I5 W7 {/ |
docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go% Y& m G) j6 k" m: P
```
4 o4 r8 W- M, W1 t3 g0 O
& p$ r' Z( |& Z% b6 o## 使用IPv6
" w! x7 y- z, H* l( } s4 |2 `& o. g9 I+ ]; _. X
- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv6) @/ Y9 c; {, ]
- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`
" n* K# p2 p8 O. \% Q- 群晖:& x9 \3 \2 A' [* ~# ]
- 套件中心下载docker并打开: g4 Y3 T! N0 _- N
- 注册表中搜索`ddns-go`并下载
. ]5 u$ b3 v" F3 T0 {. v8 G - 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`
, c$ x) E7 j/ ~2 r5 e* X - 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功: f A2 j6 D7 h6 b1 H
- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用)$ j0 P7 J* j ~) R3 o
- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv6
2 \8 q+ f9 F" F9 F0 x2 }& H+ j
8 _% k! d) M; i## Webhook
. j6 W- S) u% x4 y" e4 k0 d# f" L& O! F9 ^7 v4 E; j+ c T
- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL/ B; z+ Z: J- Y7 q& r+ [- n) Q
- 支持的变量" H* ]2 ^+ N. P5 `8 L
$ i* n8 f' t' g8 R( A | 变量名 | 说明 |
/ P! f% J$ m" S$ L0 j | ---- | ---- |
. w: r& _" X9 n: z; |$ k | #{ipv4Addr} | 新的IPv4地址 |
; A6 r0 z+ w) Y+ }3 b' z | #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`|
( K. a2 b/ ?$ N | #{ipv4Domains} | IPv4的域名,多个以`,`分割 |( o+ N% v+ e! Z( f z! {7 C
| #{ipv6Addr} | 新的IPv6地址 |
9 L) X, H4 v: Z | #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|
' i$ ~( u( ?. A9 d( q3 V2 A | #{ipv6Domains} | IPv6的域名,多个以`,`分割 |
) X' Y" R) g6 j( ~! y
: i+ s' Z8 q. D- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求
$ b& ~: G( V4 k- <details><summary>Server酱</summary>1 z8 ]; v1 t2 ^# N
" O3 f! ~( A) \ ```$ \+ o9 X. i# W2 g- ?6 h
https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
; X; l' W1 M. f7 F, J ```
* g% o# X, L- D, ^9 j- <details><summary>Bark</summary>
; D( j3 j- U Z) h0 ^1 l$ P4 L g0 x* z$ L& t
```
& z+ F! y$ B% F4 ~9 b# H! E https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
2 Y2 f" v% p: R ```
6 z( n9 ]$ c7 C, w1 W, i: ` </details>
K5 R3 l" ~$ E. l5 ~, \5 U* B- <details><summary>钉钉</summary>
+ Z5 p6 Z. l: h( A/ l, w. H+ o( i! F% l/ p+ `
- 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义$ R% Y% X2 V' a; x# n' c( ]
- 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`5 q' S; O, Q5 c7 t6 Y
- URL中输入钉钉给你的 `Webhook地址`
0 M/ @1 }8 J# H2 r+ g8 [: M - RequestBody中输入) Z# V; o4 G* v6 u( k& X
```json
0 q7 ?: k' Y9 H8 f1 E7 v {
* }! t8 S+ m0 e6 | "msgtype": "markdown",3 I: B$ g$ B! s+ Q
"markdown": {2 O3 c1 T+ j6 ]* @" \3 F7 X
"title": "你的公网IP变了",+ J9 w O. H" N
"text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
& |/ G, z+ d! i% D+ N' l& K }
8 @ W" S* |' z }- }. {6 G% `0 u1 E9 c
```
% \ i' X) d8 ^6 v </details>4 X& k( g& V$ c3 a
- <details><summary>飞书</summary>
$ a, n1 V1 b v" \% W+ _1 v1 U0 a N$ M" k5 U8 A
- 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人9 j3 G7 t: P: @" p# [
- 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
5 g: u- b Z3 a! h& m - URL中输入飞书给你的 `Webhook地址`
9 ^ P/ W* I8 V7 c - RequestBody中输入
+ N( H9 l; x2 z4 _7 r* T ```json
) B9 P. A( z+ I. v; s; [( U {
+ Q" |2 x& b2 R6 d: W, q" Z% t "msg_type": "post",: E; I& k4 ?2 k
"content": {
; { ^$ z# X% w$ l# j/ {. B "post": {) U) m/ x6 X" O" p* O/ F& g
"zh_cn": {
* i; e k' m( P, B( n "title": "你的公网IP变了",
5 C( v6 T8 C. P* g8 Q "content": [7 t6 O; E; T" T( c x
[
9 d: e9 P9 G" V H1 d3 O {$ f* i! i: Z5 T6 @, V
"tag": "text",+ y. H. L% {. K9 O6 X, Z( [
"text": "IPv4地址:#{ipv4Addr}"
/ M' r+ m+ Y; s5 b }
& Y+ s$ {! Z4 e' q# I ],$ F, O- `* b7 W! S. K6 N! _7 {+ V
[
& c. `& B* i3 V4 O9 L3 ?7 l* g! t {
' G4 Z. x3 S2 [ "tag": "text",
# b0 V# y8 g! G: S "text": "域名更新结果:#{ipv4Result}"* o; H/ E* Z G* n* O
}
3 ]/ y d' J7 d& R) D, t ]0 ?' F% z, t: A1 l$ |3 a# @$ M E# e& I
]
3 @% S0 k' g2 u+ e4 W5 r }! H' n( c7 p+ J. _, Z; M
}6 X% O4 \$ {& M5 E: Z' B7 R
}) ~/ g9 i3 I: m8 @! m# v. j+ u' S' |+ P
}, r' C* y" h& V9 I8 |
```; f3 r- I9 [' a+ L, Y
</details>
% }, q: @- Y, r' H+ {- <details><summary>Telegram</summary>
' x* n- J! o% J$ q$ ^0 ^) ?
3 r7 Y' C5 K; k/ Q# W* K [ddns-telegram-bot]" e3 T& R( s3 C$ U; \- w
</details>. ^( K9 g+ b8 T) S, C: u- {4 l5 K1 O
- <details><summary>plusplus 推送加</summary>" L# v* w$ {! F
- h7 a7 H+ ?8 H: B - [获取token](https://www.pushplus.plus/push1.html)4 x% z2 H+ X/ U: a# H! o1 x
- URL中输入 `https://www.pushplus.plus/send`
7 k0 }- ]) C8 k( r. j - RequestBody中输入
. F& Y/ G- c$ e8 C M ```json/ s% r+ [+ G; R1 m( F, R# e
{% U2 \& P4 d$ C* I
"token": "your token",
( \7 |( I n5 z3 N# k3 ~ "title": "你的公网IP变了",+ I% {/ ~; e( `: D4 Q$ J/ p
"content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
9 P4 y9 s) D/ w3 X* t- ]- ] }
& r) \. X; v' i; ]% S& A3 w ```) X- b0 X: X; G J x7 e9 J
</details>( S& r* p- E. W$ O/ i
- <details><summary>Discord</summary>
" k9 g" |) S* l( m
8 X$ p6 P# Y: P+ K - Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址/ ]: Z# z5 J+ ~. Y. }* t
- URL中输入Discord复制的 `Webhook网址`# i; `6 ~4 Y1 \7 }0 {
- RequestBody中输入; l9 V: m. M2 ]; v/ g+ f
```json
. b1 L& }$ o) D% T) L {
( d' s3 V- C' J+ b "content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}.",
6 K' t% K8 J2 U4 t% T2 O "embeds": [
; M4 h2 ?- u0 X {
* t. L( j2 [$ q' }/ R "description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",
* o, B$ q1 v4 n, n9 ? "color": 15258703,
" n( U m/ T& E9 i- l "author": {
" h. |& ~/ H7 }+ B+ E: K7 e "name": "DDNS"6 c( y( s. V, r% M2 m& D
},
, ?( a; H+ s5 w' C2 D; t "footer": {# s, n) h; _" l/ D* X2 H# [
"text": "DDNS #{ipv4Result}"
( l1 s* V$ G* `% [7 o) n }
* e- Y4 y; Q8 s0 w } d% Y; M" I, M {3 x
]+ n3 H% m: V1 w/ C" W
}
6 h9 Z3 E4 H: N/ u" i0 G# K6 | ```
# U+ Q3 k( y, G: b% O) n- ^ </details>2 ?- S/ N0 ^* k9 j
C( R( v, J' _; F( ?3 \3 X
## Callback0 x5 S8 Y8 {' `1 m
1 `1 z* ~+ X+ g( ?5 a4 v
- 通过自定义回调可支持更多的第三方DNS服务商 E+ R# w$ R$ e/ D( r. j
- 配置的域名有几行, 就会回调几次
/ q7 j, ]+ ~1 p1 N9 X, }5 A7 a- 支持的变量
( X9 G% Q0 R2 } q' S5 Q7 N4 _+ A; o0 s. w" j1 Y) S" p3 Q$ S
| 变量名 | 说明 |
- j$ V% z( l7 j) b" J2 h | ---- | ---- |. Y: o8 G t$ k& o2 {9 S" E% z. n$ @
| #{ip} | 新的IPv4/IPv6地址 |5 N; p1 E* q. M( _7 @
| #{domain} | 当前域名 |
& V9 \( v8 a" _/ v- A. l | #{recordType} | 记录类型 `A`或`AAAA` |
1 [3 J# x8 ?4 y6 r | #{ttl} | TTL |
) ^1 A8 m T: c* e. [, L* I- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求
% E# y% \( ?3 ~ \) o- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|