|
|
# ddns-go
7 p4 r L/ F9 }: o) C" u7 e* }; n1 M2 p0 f% e
自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。. ]/ T. L6 `% r0 ~0 y6 c
* D6 x; m" h! k- [特性](#特性)
" L0 D" _! A( r4 P* I0 |+ L- [系统中使用](#系统中使用)
- _4 U6 n; ^; E- [Docker中使用](#docker中使用)( i. I6 D, F( K2 W% p6 @: {
- [使用IPv6](#使用ipv6)
: P: h0 R" ^/ f `* o8 a/ r- [Webhook](#webhook)
j( S0 O$ k2 R( m* O' y* j- [Callback](#callback)$ a1 V1 R+ M/ m0 M- d; z$ d& i
- [界面](#界面)
: H- V2 i6 _0 D- [开发&自行编译](#开发自行编译)
( D* R0 V w4 ^2 i, [
! X% m: O2 ~9 F+ g7 T: L6 Z# k$ R( R## 特性
: S3 x. j, h+ p1 X) S- n) N0 I0 o/ G1 B1 n. O
- 支持Mac、Windows、Linux系统,支持ARM、x86架构! G7 F0 [/ P5 c2 H) g3 C
- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`# @, e# j' f, w# A( A9 N3 |. M
- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP
" Y$ E- L! N1 P# G- 支持以服务的方式运行' z/ R4 g4 y1 v7 j0 K( F# v' Q
- 默认间隔5分钟同步一次
- l; S2 x$ c6 K# K" T$ R4 d8 e# }& C- 支持同时配置多个DNS服务商% h8 ^+ a3 L2 O( N" A5 o/ ]
- 支持多个域名同时解析 S/ E# p; L/ c, b; X5 l4 L
- 支持多级域名9 a$ D8 z7 [ t* s
- 网页中配置,简单又方便,默认勾选`禁止从公网访问`6 `' i r# \- |$ j' G
- 网页中方便快速查看最近50条日志0 p1 ^1 I/ o- S! ~& \
- 支持Webhook通知) u% h& B3 }; G: d- O
- 支持TTL
' w9 G% \- I! I) i" j) N# w- 支持部分DNS服务商[传递自定义参数]
}- x R! O( H( T0 C2 T4 ^
+ O6 f$ l) Q- u7 K> [!NOTE]& D+ H5 V2 t$ N" e
> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。
" ^. s s, m% o1 ]## 系统中使用/ _) }7 u4 \0 ~ F4 }& l1 c
" U' D# C$ @% k5 o9 F* f
- 从 [Releases] 下载并解压 ddns-go( y1 H$ X$ S- A/ D1 B3 [
- 安装服务
9 b4 j; A- b$ x* M' a - Mac/Linux: `sudo ./ddns-go -s install`8 {" |2 s" p8 O$ a) u- P i
- Win(以管理员打开cmd): `.\ddns-go.exe -s install`7 u% @7 h% E# X
- [可选] 服务卸载
) L! `4 y7 t6 L. X3 a! [ - Mac/Linux: `sudo ./ddns-go -s uninstall`. k) f0 ^( @' ]: Z' J0 P# H
- Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`
8 g. Z8 T* T* @" T o! R- [可选] 支持安装带参数' R4 y7 o4 J/ d8 s0 G! b
- `-l` 监听地址5 j2 z6 s5 g" A( H( {( D
- `-f` 同步间隔时间(秒)
+ H! b4 H# w! U9 t - `-cacheTimes` 间隔N次与服务商比对# z P2 {+ i+ p
- `-c` 自定义配置文件路径( `( U: ]! S+ p) B5 M8 i: J
- `-noweb` 不启动web服务
8 b( f& S ^4 S - `-skipVerify` 跳过证书验证" b9 M( R) x& u9 r8 M. u
- `-dns` 自定义 DNS 服务器# o8 C7 l8 v. r% J
- [可选] 参考示例
( Q$ t* ^2 ^: g; ?: g9 t) Y7 k' s - 10分钟同步一次, 并指定了配置文件地址/ P( r* g m- L" I1 X* w! J6 _0 L
```bash& T7 t/ I5 _" a8 U! W; m7 U
./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml& ^3 b# Y9 k$ s; G6 W& U: _( F0 n& ^/ x
```/ l/ t; N5 I7 f8 M/ g* \( g
- 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流
! L. r: O9 i# y, X% H" m9 P' s. h ```bash
, v) l. |0 x4 j) s" c& d ./ddns-go -s install -f 10 -cacheTimes 180
o. `3 P) \+ t; m: d' N ```- J. q; g: x U) ]4 ~! r& S
- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):
" w1 |. O1 `9 l) \
0 V& D( Q# w1 X& h ```bash# u( ?* P! |' E, J- [
brew install ddns-go
z5 Q3 g# |1 L/ ]6 m) [ ```
& R4 E" u' C1 q
! n. C9 l- I6 C2 [## Docker中使用
6 m' v# D1 W4 i, ]1 O- s( @1 |$ g ?' D: Y) q" I
- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件4 W" f; L1 j1 B2 z
/ K% T/ x; Q) U& c3 F# [ ```bash- y, V8 M5 j+ t
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go/ f+ \$ ^) o8 n" @1 _
```& _" m* W$ v$ k2 z6 O! `1 Z* g Z
! W; m* h# f4 N" K. o! ?
- 在浏览器中打开`http://主机IP:9876`,并修改你的配置9 `& c/ t$ R" d/ {4 n ?1 w
; [0 F1 Y7 _" w; [& S1 k( S
- [可选] 使用 `ghcr.io` 镜像3 ]+ N" t% v. P# w- l9 q! M
, `& P9 e# o% H
```bash$ P0 g P; H% Q# f7 |0 R
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go& E$ Y: [+ V4 }7 n: ]
```: E6 H* K7 H7 l7 q0 a; g* N& m
, D- m6 f( `. U" L S% e$ E1 a' ~
- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒)/ R5 G: M, N- K6 h5 @# w
5 L1 _) R4 G% R3 F ```bash
, I) y X' B% w% ]8 i" k" O docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 600
4 ^+ T* u1 @6 A1 f$ g ``` g% Q% E/ u$ |, D
1 e7 D$ s2 o# G( m0 q$ c# G
- [可选] 不使用docker host模式5 x: b* }% s, D& [7 a$ S
. u: q! q! T- f) M
```bash
2 E8 L5 p+ ~; F) L9 q docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go
& ]! D2 b3 e. a ```" Y/ Y2 L/ x! ]8 R4 R
% q6 A. f; U$ R; N. R; D y## 使用IPv68 c7 z3 o* P6 @3 O$ d
4 @( _7 ]' [' R# c; i6 q
- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv6
- U2 w+ G- W6 a I# R- R- L8 M- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`
0 }/ N5 |' R/ @: W( `/ Y0 C1 q- 群晖:# d- q; ?! f/ \0 t0 Z$ F; e
- 套件中心下载docker并打开
5 F( \9 T; B. \7 w. k - 注册表中搜索`ddns-go`并下载9 d$ j* H4 }( p; X( @
- 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`& M. l# p1 v' P1 w& g% ~7 Y
- 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功
0 @7 Z: r x; `- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用)
- }+ m( A- X+ E' [0 g, M- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv6. |5 R0 j) t# r( j2 q5 \
5 W4 t7 k2 X3 u0 N& F2 Y0 _! a## Webhook
5 r3 k$ X5 h1 H: ^# P/ k
% y* ~, v9 Y1 w i( L- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL
6 X; A! t# A. K% c0 d- 支持的变量# n+ } T8 T. R2 y) q2 g) Q5 \! q2 _* d
4 ]& a2 k, G! Q* ^6 y* J" t
| 变量名 | 说明 |
' E+ c. T- C' y" m- Y# ~2 s | ---- | ---- |
1 R& }7 t8 t' e | #{ipv4Addr} | 新的IPv4地址 |# i1 M8 p/ e- K4 m) Q" W& V# W
| #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`|
* V& C U- X B1 ?) m& x4 g | #{ipv4Domains} | IPv4的域名,多个以`,`分割 |
; |% {+ j1 \; L r | #{ipv6Addr} | 新的IPv6地址 |# a4 P$ f0 }4 G: z( `8 H* x! U/ T
| #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|, x+ E2 o$ m+ S
| #{ipv6Domains} | IPv6的域名,多个以`,`分割 |
- u1 M- y ?$ ]" L e
' }3 {$ L; V3 Y# j/ J5 |3 ?; _- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求. O9 e/ ^: C Z( p5 Z& A
- <details><summary>Server酱</summary>
' _ y! O$ W3 r7 _8 k( o4 [! V$ g% o( F
```
# l! y, P% Z5 Y2 V2 I1 q. i https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
& T) Q! P- g6 z# Z* ?8 l' O$ E0 } ```) q& l6 V6 X+ h) G7 K' Z
- <details><summary>Bark</summary>
; U, U4 z0 d+ j* a5 e. v- b/ E9 j$ D+ F0 ? T
```
, _% s! W i* f8 k7 o: K# T4 k, ] https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}2 a, r2 V! P" o% Y8 Q3 I
```
7 C8 k9 d5 \5 i' U </details>
4 S- {7 x0 P9 ^) U( m1 a9 o- <details><summary>钉钉</summary>* c& Z1 M1 T4 Q9 o. @+ }# s
. A- l7 \+ I' q
- 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义$ n' t; D( ]* a/ N, W
- 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`! a' }7 g6 f" X! O& P4 j
- URL中输入钉钉给你的 `Webhook地址`
! J w. c( V: i! o8 t - RequestBody中输入
+ F1 h2 R! n: R' J6 l1 ] ```json: q" [5 V9 u9 N A- h
{
4 m \* J n* A "msgtype": "markdown",
2 t/ w% ^# ~2 E "markdown": {* H3 m6 R. q* z
"title": "你的公网IP变了",% \( g7 A/ n1 L N4 a5 r
"text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"5 J7 ]2 J- F" H! n6 S4 r
}
7 ^6 _% ^( C1 U+ I: G2 _ }
6 B& E5 j! N$ v/ @' ^5 W2 C ```
; o0 H& H6 z$ Q4 a </details>
- l0 q# L# Z5 g7 V) Z- <details><summary>飞书</summary>9 p5 Y% \7 u6 ~- X6 O' ]- _
# q( C6 t+ l: ~+ K - 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人
- x+ \2 p K O - 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`$ r$ I$ p2 K* \( |
- URL中输入飞书给你的 `Webhook地址`0 Q1 o: z+ H5 @
- RequestBody中输入: n: X/ S, k4 i1 W, h- w
```json
' r) W8 R# r1 g7 q1 m {2 n8 c. K3 [9 P O2 m- X
"msg_type": "post",4 I. G- z4 Y3 ^
"content": {
: y# t0 P% g6 K) j. ~' C "post": { m2 c5 H9 o+ z" i6 D3 J
"zh_cn": {$ C9 N3 O) }2 _! U9 E+ @
"title": "你的公网IP变了",& j* N4 l$ n4 w
"content": [
. r; A" E! q% J [
; z( Y) D5 ]/ O {
# S) l" H* R+ ^& r" S v "tag": "text",
" t) b8 D. _& O* f4 y1 x/ W "text": "IPv4地址:#{ipv4Addr}"
- F. E% v9 G7 x; g. l1 Y# W }+ ~* r6 c$ o" ~$ H7 B9 i
],
4 |, Y/ p9 ^8 q( ?5 N [
. P; A+ U1 ~: B8 O2 M2 @% Z8 L- q {
4 a. \. X9 B5 f3 S( g3 f "tag": "text",4 w$ k6 N: J- H3 t* L3 z
"text": "域名更新结果:#{ipv4Result}"7 T6 `9 j! q4 J& V" S6 K+ T$ T
}
, v) F' }2 T; n" C) O+ ]+ Y ]2 n5 `# _, t1 i6 j; p5 m# @* C- H
]
% E! z5 ^5 n$ R; W }
; {3 ^& U$ L, L! e. ]5 M- F }5 \) U4 T, M# g: Y* [7 I$ Q
}
$ c! E! e6 M4 _, [4 ] }- V3 u- V: t0 [5 T0 B& ~
```
" T# x5 ]- C$ V( l. i3 R. i </details>
1 x# A8 ]0 M! x Z$ O4 f$ Q- <details><summary>Telegram</summary>
. u% r: D; t: v6 n# g2 U# L0 r( S" A9 G
[ddns-telegram-bot]
8 l4 P3 D( A. g0 a </details>* Y# d/ k% v8 b" x8 Y
- <details><summary>plusplus 推送加</summary>9 g6 `3 `$ p6 |0 ], T1 p% e: o3 g- X
1 Y1 G5 \/ O, S
- [获取token](https://www.pushplus.plus/push1.html)
% y& H2 i2 M3 q - URL中输入 `https://www.pushplus.plus/send`
- {! Y. V) M4 H4 f - RequestBody中输入/ ?* _ s4 p& ~. ^- i- Y
```json$ t5 ~5 K& h' A) Q% [+ M. R
{& W( G) ^5 D7 S; c! W+ `
"token": "your token",1 c4 `- V j- W: ^6 j+ n1 c' k0 B3 A
"title": "你的公网IP变了",
# }, T$ _- }. ~( \( b0 P "content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
5 Z1 d, e: V* W1 r }1 \% z! A. C+ k* m3 V! A
```5 C( z. O4 U. `7 k8 c0 p1 v
</details>$ i: n2 _$ y, G; V& q
- <details><summary>Discord</summary>
- b; Q# [- J6 u7 T7 q
7 \7 f5 g. v# S+ y - Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址# O/ |/ T5 \8 d+ [6 p' ]0 ~% J
- URL中输入Discord复制的 `Webhook网址`
: a" a' a/ w6 I2 o1 K - RequestBody中输入3 O% K: X3 j1 k' @
```json# V$ {: E' G# W1 @$ n. y
{
# A$ c! @% x- X) d: e$ A% l "content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}.",$ f! a& T1 e' T& q
"embeds": [0 s+ ]" d4 O5 o; L
{
+ M/ ^8 O. x+ a, x9 M3 l "description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",
, S& d, Z3 ^& f! H "color": 15258703,* B0 @$ c/ Y: w; m2 B+ A. q
"author": {
& m+ i/ j. ?; t, O& V "name": "DDNS"
1 P" T9 S# I7 o( S },3 U5 S5 u7 e0 n" d& Q0 G
"footer": {
# U/ D- H% p+ K/ p5 ^$ h( W) J "text": "DDNS #{ipv4Result}"
. {+ C. v) f. b) B }
& }9 C7 s% y% W' W/ T' J* b! y }
, J0 j5 v0 J* K q- w: [2 I& s ]6 |) |& o& G8 m: o1 V7 N( ~! L
}
) t5 f, k- R- P/ s' X/ f+ { ```+ h" r: Z# W# W& U) U2 o" ^
</details> z* g( c( c0 R, N9 w* g
# s' f: l' ?5 b; s## Callback
4 V1 d" N6 |- ~+ E6 x$ |5 B; D* S1 N* g- i
- 通过自定义回调可支持更多的第三方DNS服务商
, _1 H! u2 z, L: [. }4 V- 配置的域名有几行, 就会回调几次- N- G( _$ I' @( Q6 [( D
- 支持的变量
/ l/ _' n1 s$ J+ V! o! V2 Q5 V8 ~: G3 |# C$ h7 u
| 变量名 | 说明 | N1 {2 x* b% a. `
| ---- | ---- |
( s% z" f/ t. T2 K) S | #{ip} | 新的IPv4/IPv6地址 |
# K" E/ \" P" h9 @ | #{domain} | 当前域名 |0 \2 o; X3 i1 z9 L5 K* a
| #{recordType} | 记录类型 `A`或`AAAA` |
+ }) A5 J$ @; J; ]2 E3 @ | #{ttl} | TTL |! f# [+ t4 ^. l# T" z) S( b
- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求& K2 d$ {* ?1 z9 K G8 N3 i- y
- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|