|
|
# ddns-go
) M# b2 [8 q8 K3 j$ g) V8 A6 Z8 Y" z
自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。
9 u8 I6 q& }% c6 v" p1 `
, p! R, Z; x( K, [- [特性](#特性)2 f7 M- q2 K% c( J5 k
- [系统中使用](#系统中使用)) x# d) r/ R) Z/ V" K: }
- [Docker中使用](#docker中使用)
; W8 ^$ Q6 f4 W/ `) L& p- [使用IPv6](#使用ipv6)
9 z# u2 T# P2 d5 G- [Webhook](#webhook)
/ P7 `5 {3 x# U' f3 Q- [Callback](#callback)5 P/ h8 V" ]" u6 g. a( V' H! @3 e. |# T, k
- [界面](#界面)
+ s& Q# g4 c' b( u7 \: L; y, d. @- [开发&自行编译](#开发自行编译)
+ @. m( {! T8 p: G; r
# I! b5 @2 P ~0 A5 G: `; l( T## 特性1 H- u. q6 ?- Y" a
$ v5 u) x# G& q" H2 z- 支持Mac、Windows、Linux系统,支持ARM、x86架构7 O6 f/ ]. Y$ T
- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`
$ m1 t, F2 D9 h- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP3 f" O' ^+ ^2 m4 D" B+ h; u2 g
- 支持以服务的方式运行
# N" S, H0 W- n' w2 X' Q& H- 默认间隔5分钟同步一次
' X1 H: A+ W3 E# D4 ]+ V9 P1 Y# H- 支持同时配置多个DNS服务商
6 F! O4 p0 y4 }" X6 G: y- 支持多个域名同时解析. s. e( j8 n/ s5 ?$ s
- 支持多级域名1 w0 i. o4 l) L' P
- 网页中配置,简单又方便,默认勾选`禁止从公网访问`/ j+ m8 j) X5 n: Y+ X
- 网页中方便快速查看最近50条日志# m! H. S. N, X' R# Z& Z: u, z* Q
- 支持Webhook通知
+ n* d/ `* N* u6 |1 I/ }/ x! a c, a- 支持TTL9 h; X# m! |1 Q# u; |5 {+ T0 c9 A
- 支持部分DNS服务商[传递自定义参数]* `8 \( K8 V( J( w
- q7 h# V+ \! }: a4 o( ?
> [!NOTE]
- S/ X, Q( a0 K0 B/ u) c0 G9 z2 w> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。
, `/ i$ ^: U. W" Q" I7 C## 系统中使用
: }; k1 Y- v) \/ M" y/ S$ i6 \- q3 M1 I) M F" q
- 从 [Releases] 下载并解压 ddns-go* d5 p$ s' f1 g4 C3 ^ `# p
- 安装服务
1 a2 K* v, E, [" _6 U - Mac/Linux: `sudo ./ddns-go -s install`
3 p, N: [) `7 D8 c4 _; H - Win(以管理员打开cmd): `.\ddns-go.exe -s install`" Q4 b, G; \3 `) }% m
- [可选] 服务卸载
$ B9 @/ Y4 X9 z. l, L8 r - Mac/Linux: `sudo ./ddns-go -s uninstall`
* ^) ?8 n. Q5 x) `# w4 { - Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`
5 @6 G8 K: I/ y9 z& G7 s j- [可选] 支持安装带参数
1 v& ~2 J( q" V8 V q* [* p: _ - `-l` 监听地址
4 |- @1 m- |% E' o/ f3 m' q3 E3 H' ` - `-f` 同步间隔时间(秒)
, p8 @7 \$ `: u6 P - `-cacheTimes` 间隔N次与服务商比对" @3 `0 W$ d5 ^7 `
- `-c` 自定义配置文件路径
; o! v9 j5 o% F* X$ Z; V! Y - `-noweb` 不启动web服务
4 P: I7 v( q9 ? - `-skipVerify` 跳过证书验证* V- [1 ~ j0 q2 ~) e
- `-dns` 自定义 DNS 服务器
: P" T6 l& p6 F9 {' I- [可选] 参考示例0 a7 f' X' x9 a# n/ X% u3 M/ O
- 10分钟同步一次, 并指定了配置文件地址/ Y* a7 G+ L% H* u$ e5 x
```bash
5 }2 f4 y7 x p( X ./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml
7 B( X7 G0 G% Z0 `: w ```
6 U1 ?6 h6 h$ M - 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流
; B( z6 E0 J7 C. l1 t3 `+ I ```bash
% S B* h/ ]7 x$ A4 T- L! \7 N6 t2 M ./ddns-go -s install -f 10 -cacheTimes 1800 @6 k* n, I, a' ~/ t6 {9 y8 V
```* v! p2 n: V4 w
- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):
) J9 l& h6 _* \, }* q n/ O/ Y( O9 |6 Y: X, J& m" b2 W
```bash
' ]& m9 O; m- S) T! ] brew install ddns-go
. U! y5 X: S3 Y! Q( ?3 W; J ```
3 D9 M. @: g5 J5 [, \& o
: x& ~6 G8 e/ B- [) V4 Y: t## Docker中使用
6 @; J- A. F0 B$ Y& Y1 B$ D, M3 \- J6 m! P6 U( n
- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件
/ o3 Q' g* j G8 @) @$ I/ U4 L: D$ M; Q- ?+ S0 S7 y! R4 K
```bash
# F- U1 J4 I! r* O docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go+ ?8 e3 \6 F3 q5 F8 J
```
) ~6 \/ c/ |; a; T( C
8 H% z( L8 }% I5 A# F6 v- 在浏览器中打开`http://主机IP:9876`,并修改你的配置
Z( H7 l7 Q2 c$ L$ i1 p, Q& E
" H7 A3 {+ ~! i: I1 A K$ I- [可选] 使用 `ghcr.io` 镜像 ~5 _ w/ ]4 O V1 ]
/ O4 ?+ \, P1 w
```bash
3 t0 K3 S5 W$ Q docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go
9 ^% p% K$ S3 P ``` K6 e x" n# o
) y L; [) z# z8 y1 I4 _* x* o3 E A
- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒)$ A6 l6 H+ y1 ? [" o5 @( C
" l& \- \3 v8 e, c1 Y& j1 C. A
```bash7 e) m) J$ i' W6 L
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 600
@ l3 k' g Y9 ~+ q4 r0 F ```- I: ^) ~7 U* C, h
C; ]6 c! V$ x8 I! S d7 p- [可选] 不使用docker host模式
8 ]" k2 Y8 J2 g# N# _9 H! a. @ N: ]. t* ~2 T* U+ ^
```bash( F; e3 |' k* S7 ]. c3 w# g8 q8 a
docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go% ~9 Z/ B0 \$ c" A, U6 [- B1 B
```
( ~$ L8 g. e4 M- s' L6 M. {* @, X# }% q
## 使用IPv69 [# b+ O1 k) h" C7 i+ x1 }
) V, j" _! L0 |/ l6 D: p7 R
- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv6
6 \6 E$ j" u8 w# R |- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`
* m1 G# C3 o: \6 w4 a- 群晖:& r5 v1 L! m9 y0 W% x o, I
- 套件中心下载docker并打开. Y+ M2 M! d1 H/ C) N: k1 U
- 注册表中搜索`ddns-go`并下载9 b0 K. w$ I4 q! M* o1 F
- 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`
U7 B& ^4 U5 A: x - 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功' Y* Y& }: ?* z! ^4 @& ~1 A
- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用)
3 L0 F) c; N& P& f- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv6
& V6 h* J0 o# t# q* R7 }# C' j" V: H/ q: M: Q3 Y
## Webhook' @. ?" r1 @; a$ f( e# x3 r) s* F. { d
, N( O! \+ n6 j7 q" m
- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL8 N% S% A. V7 H5 }) \! t& J" z( h
- 支持的变量
, ]* Q; z8 a! ~- |- u/ x& T2 ^
. n/ ?- K% T( k* g- A8 a | 变量名 | 说明 |
2 _0 x9 B( G4 l, ~* J0 H& w | ---- | ---- |+ [. {9 `3 j8 a+ U" h9 y
| #{ipv4Addr} | 新的IPv4地址 |6 C) E/ G! e1 u9 C x9 x1 _
| #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`|9 ^ h3 W8 [+ y! [0 N u5 t
| #{ipv4Domains} | IPv4的域名,多个以`,`分割 |
5 d- b. `$ e8 T; |2 G | #{ipv6Addr} | 新的IPv6地址 |
3 [0 f3 O; G4 ]- c& v! w A! A | #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|
0 V l; k$ U% Z | #{ipv6Domains} | IPv6的域名,多个以`,`分割 |+ n2 v2 V! ~" q: n1 Y- p/ g
% ]9 A& P6 _1 S) u+ W, d- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求
4 |: s3 V8 u3 V. P x# P8 U- <details><summary>Server酱</summary>
2 s" I. `: i! g* _- u, j2 s( ], b3 s: G
```5 T. j* T+ i: l& X3 w2 d9 x/ }
https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}; L0 [" ~1 o3 d! h& i8 l+ w# _' T
```
9 Z9 f/ _0 v* t# v4 c4 {8 V- <details><summary>Bark</summary>
0 y7 p: e8 H/ L" K% {! S& P3 Z& Q
```
4 N5 o2 A. g w5 E- g https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}& @, A9 r* _8 d G
```. D8 E# ]8 f ?, B# I/ w
</details># G, T# l6 l d8 }# `. Z
- <details><summary>钉钉</summary>' i$ |3 d5 d" \. E9 ~
' n0 [) F8 U; C3 a - 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义7 K9 }6 P' @+ g ?
- 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
( D; }9 i+ \* Z - URL中输入钉钉给你的 `Webhook地址`0 I6 L0 G, \) K$ m: v! h. c
- RequestBody中输入7 E) a/ \* ^$ l3 W- ~) c' T! Y
```json/ }0 P: q9 P( Z! F% O" _& L
{
' z' {4 x9 W* V+ ^ ~& E "msgtype": "markdown",
+ d4 V- U0 h5 |0 D l7 f "markdown": {
2 H0 f2 h4 t' G G& |0 V i; W "title": "你的公网IP变了",
' Z( v7 D* r4 Y! k/ ~ "text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"0 u9 }. s- j/ J% Q* n% w; A( ]- W
}
& O( y2 `" ]7 C6 [8 X% a1 W }
- o& }4 X% X8 j* i% J' v ```
" H" B6 }5 X3 w) J </details>' @2 l, ]# t+ v& q/ D: W8 U$ y
- <details><summary>飞书</summary>
: Z% y8 a, U0 [+ M4 j' f2 ?; _* y2 ^9 V! g
- 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人% Z3 N. N8 Q% f, ^" i6 g: k! |
- 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`$ X' C1 O3 ?5 T( g
- URL中输入飞书给你的 `Webhook地址` Y1 W2 x6 N5 j$ m8 d
- RequestBody中输入# ?& N! y& E0 a3 b5 D& W6 i( w
```json: t; E4 S: d- `3 o7 G% w: R
{: e6 Y* V1 s0 E! q8 U
"msg_type": "post",
& c7 j) d* T. j' { "content": {4 X& R2 e% Y' ?5 K+ A% P( C
"post": {, W7 n' C. G, O/ T
"zh_cn": {
' m$ g1 N1 ^, S0 N "title": "你的公网IP变了",: c- {$ b8 ^* Y Y9 `/ v9 U
"content": [6 ]; w2 L+ G; R
[6 d6 h0 U. C+ e+ ~% x6 I
{
+ N/ f; G* V$ T "tag": "text",3 ?) j* v! ^ r# f
"text": "IPv4地址:#{ipv4Addr}"8 j; \% O) M4 s# ~7 C) e+ y6 r5 \
}
8 n {6 O% q n( t3 M ],
% U7 r8 e+ y# T# ^+ A [
2 [) e v% y, m9 J$ S" O$ \) B {
. O8 M* `+ E3 N) U5 S9 c, O+ j "tag": "text",
( L0 e( f. F: u( l4 ?" z "text": "域名更新结果:#{ipv4Result}"
- v" o$ w; [$ F: }) J }* i6 [3 l9 t; w4 o8 F1 Y
]& g1 Y/ F2 B, F A
]
9 j* j# S) w" ] }
' S! b( U: J! Y; Y& P2 X }
; y# {! [; P$ b }
0 N T' [6 ^, T/ c3 s& z1 j }
" O7 s# O; h( u' Q8 ^+ R ```; S- I6 | {$ j0 l' A% q- n
</details>
( c% j# X/ O, J2 I, f( D) e- <details><summary>Telegram</summary>
, L6 h* D1 d$ w! l5 h9 c8 z3 g n9 [# B/ _9 G; d/ Y
[ddns-telegram-bot]
/ C9 a; e+ \- Q0 M- ?- r% J) c </details>4 {$ g5 Q0 y3 ]( D4 J0 h1 Y; N
- <details><summary>plusplus 推送加</summary>7 ^1 ^! \3 T9 S4 r8 U! R
# ^5 P8 b/ F6 O
- [获取token](https://www.pushplus.plus/push1.html)( z5 y: V/ ?' m5 B( P4 Y& [. ^/ y
- URL中输入 `https://www.pushplus.plus/send`$ Y; [. _; y c0 o7 F% C7 l4 O
- RequestBody中输入: W! I; C& o$ k
```json
; W- m' m' s8 w/ v$ D! } {
/ |2 _: X9 Y3 Y- F5 Z" Q "token": "your token",8 T) D0 ], }$ G
"title": "你的公网IP变了",- Y9 a, E& V$ |- [% B
"content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"7 u% W$ R( l {6 K# M9 h
}1 v L* |( V7 \8 @
```
% l# f( {+ f& `9 h5 ~, F4 e$ h8 t </details>
# z/ q3 A! g" j5 _$ c' t1 j" R- <details><summary>Discord</summary>
2 N+ u9 k' x# B7 s5 S9 s9 ~; z. m+ ?8 z
- Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址
+ p& k: x- Z% J4 u3 A - URL中输入Discord复制的 `Webhook网址`
" a$ _8 n% d7 x2 Y: B - RequestBody中输入
0 [( Z" M ^0 m; u+ x ```json
( m* U% _( S( c9 x* V3 K9 w {8 Q4 g5 `) T7 Z
"content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}.",
7 o! |: ~ O1 r4 F4 ^ "embeds": [* ^$ W5 D. M6 s5 O
{$ N0 @8 b- R% S( c
"description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",
3 Q" z5 D; I4 l# v* F4 f "color": 15258703,3 e- B4 r% i. m! |( {
"author": {
9 u$ G' m! ?( b8 G6 d9 g o "name": "DDNS"( o( } T9 t( ^# s! v/ p
},6 p* _( `% m* s- Q/ x
"footer": {4 L, K: t8 U) o% d2 b
"text": "DDNS #{ipv4Result}"6 a2 j; P2 d, ^" @8 B" \7 V
}
" O5 f% Z8 A# a/ k- L1 [5 H }
4 o) K/ e& s" i { Y7 z5 [; U ]) m- p/ q! q3 x
}
1 \- y8 X6 X0 `+ b5 H z8 Y) G ```& a% v4 ?4 J. w k3 h, l4 h
</details>: C. b. w, n0 s- }$ k
, e- }9 p. c' {3 d& l9 C$ G+ `## Callback
2 S7 R, x T7 N* o' t: }3 p9 i& q6 z: F
- 通过自定义回调可支持更多的第三方DNS服务商
0 E( G- m7 A5 O4 T- ?. r' r+ Q- 配置的域名有几行, 就会回调几次
M( P/ D0 J J* ~( n9 M- 支持的变量
7 |/ i `$ y' j5 `. Y' y) N. q% M- i8 N' ]8 c$ c, h; ], g6 N
| 变量名 | 说明 |6 ] O- b6 s/ l
| ---- | ---- |% q/ }$ w; l4 n+ R$ v4 L2 i; f) h, b
| #{ip} | 新的IPv4/IPv6地址 |
. V' N4 ~% j8 q; U | #{domain} | 当前域名 |" M& s9 f# a$ D
| #{recordType} | 记录类型 `A`或`AAAA` |' z7 Y! ~9 h" Y8 R+ `5 L7 ?% m
| #{ttl} | TTL |) Y- v6 u# l% [. E2 J6 j( W
- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求$ f. |) j& U3 k
- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|