|
|
# ddns-go
8 T/ ?1 B1 P! u7 b6 ]7 b: P0 F3 {2 C" i6 N5 P) Y
自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。
6 d% R0 y, F4 d4 Q ~6 t" A; J: z& N5 Y G
- [特性](#特性)
/ v4 B3 B8 `6 q8 M9 G" C$ f- [系统中使用](#系统中使用)
2 ?5 q: \+ f; D) D& e- [Docker中使用](#docker中使用)- A5 q7 z) \: U" A
- [使用IPv6](#使用ipv6) N+ O) L0 N+ W! c' p6 Q7 y, m
- [Webhook](#webhook)
! {* z( |3 L/ z+ i* W0 o- [Callback](#callback)( M5 g. P( O. h8 s' L* k7 q
- [界面](#界面)/ L6 f5 j$ Q5 E! J
- [开发&自行编译](#开发自行编译)
2 X) a( s# I3 ?! _7 O6 E5 Q) P; @6 [ d: w' l s% _8 r! S, C# g; b
## 特性
8 p* J/ y$ e9 j
6 ^2 ^8 q7 [0 h( a( y7 p j- 支持Mac、Windows、Linux系统,支持ARM、x86架构
: Y& M. K! z1 c" p2 [% `% m- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`1 L1 ^: y2 h3 Y {/ b/ ~
- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP
3 `5 a/ U/ }% m% U- 支持以服务的方式运行$ b! u7 B0 a/ P1 S
- 默认间隔5分钟同步一次) W- x1 M: Q7 T7 U! T
- 支持同时配置多个DNS服务商$ f. q- ]$ d7 N& J+ i
- 支持多个域名同时解析+ q; Y$ Y' l9 z9 J
- 支持多级域名
" L1 U4 N, k Q3 J/ b* R! S- 网页中配置,简单又方便,默认勾选`禁止从公网访问`& G/ l# `& x' g4 _. H& g$ |
- 网页中方便快速查看最近50条日志
# D1 N% E4 f( x: v- 支持Webhook通知
0 F4 z; B8 I4 F- N6 T# z6 f6 S- 支持TTL
( d5 `0 e# x$ e. y: x4 `) `- 支持部分DNS服务商[传递自定义参数]
8 [5 W2 r6 e) F3 V+ C( b3 S+ w6 d9 \, K4 I8 y, I* F
> [!NOTE]
4 _- J. m4 l+ `3 _; n> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。$ O# L, i4 W0 M4 d, G
## 系统中使用
( d' v1 c$ I2 n T- C% Z6 {3 W4 t5 w0 t! J- y3 W- @
- 从 [Releases] 下载并解压 ddns-go
! @1 A6 b, c3 F5 v n! f- 安装服务1 s/ o! e% b+ V; Q
- Mac/Linux: `sudo ./ddns-go -s install`* _4 r; ^0 \$ @; C9 ?( Q! y
- Win(以管理员打开cmd): `.\ddns-go.exe -s install`6 v* |, d4 Q* N) p: `+ V: i
- [可选] 服务卸载
4 H# G5 k1 a# V- o/ \, x! K3 G - Mac/Linux: `sudo ./ddns-go -s uninstall`
( {0 l+ `. y+ {! n7 L - Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`0 h( [: Z) L s
- [可选] 支持安装带参数
$ q; N$ V, s ^( b7 g( t8 }2 }7 ?8 n/ P8 Z - `-l` 监听地址
: q9 W5 l" a4 V! e, n2 D - `-f` 同步间隔时间(秒)
2 j5 H2 f4 w+ G0 U3 e% a9 c# D - `-cacheTimes` 间隔N次与服务商比对6 C8 C+ j- r2 s( j8 _" X
- `-c` 自定义配置文件路径8 D. N$ N2 o, t+ o0 l( u
- `-noweb` 不启动web服务" C( d6 P B" a" V
- `-skipVerify` 跳过证书验证
0 _% B0 `$ [) K( t6 k - `-dns` 自定义 DNS 服务器; s8 f! Z j: k
- [可选] 参考示例
4 Y* y) g3 Y9 i: d$ H/ l9 ~ - 10分钟同步一次, 并指定了配置文件地址- X; o6 ` e1 V0 B$ K2 q! d
```bash
% B- k+ K( o( u7 \ ./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml
0 ~5 q' x" r& {: T ``` Z9 Z; W# a: p8 l% p1 T# o% |
- 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流
- \3 n" e+ U% ~& S- }' B5 c ```bash
8 }" |* Y$ A4 _* F% q ./ddns-go -s install -f 10 -cacheTimes 180% \% j9 Y1 ^. I) @; w- i* X
```7 C4 p: u' v7 y& J+ J, b# _
- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):' u n$ G6 R' V, g" E! {
E7 G' Y0 W x; T: L
```bash
) \1 k0 G; n4 w( v- B brew install ddns-go2 @- V0 L# ^. C6 Z
```
# X2 x3 P0 d" V0 \( n2 K. i: i# b0 ]; U/ Y2 t* T3 e8 Z9 W
## Docker中使用
1 c/ }& G j9 C! e2 u3 Q9 X
4 c* S5 k+ L, P. C+ z' D9 Z6 D" L- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件8 D. ?5 q; }8 [1 I2 o* k" }! y
9 O# M) ~4 [2 [
```bash3 o0 s1 U: ?7 d
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go/ y8 }7 i' R2 S- x# N% F* J
```! X- X" ^3 B' a0 N" J! {; \
$ b7 D( v* J s2 v t$ L6 X
- 在浏览器中打开`http://主机IP:9876`,并修改你的配置) {5 |/ Q4 N m2 Z4 z) g. K
; R5 L; \! N2 t
- [可选] 使用 `ghcr.io` 镜像& u. t% j% B Q: H* O3 q
! ~+ |: r1 K: Z
```bash
) H( e1 o# o9 o* i6 Z" j docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go
6 r" h' p J- Z/ C4 q ```
, u! m3 H* E8 O1 [
* K; l/ V% f9 H+ j% o) {- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒)
2 h: r. Y7 j: ]# p8 |- }+ ]$ ?: m4 ?& }" k
```bash9 W- p1 F/ t S" R0 u2 O) v' i
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 6005 U* Z" L. @( ]) ^2 z; |9 t
```
* \) b1 i4 `, D! K
) U- i( M& D/ x. [8 o- [可选] 不使用docker host模式) z$ o; n. ]1 f" w; v1 E+ Y C6 J
1 x1 |3 {. i0 Y8 h; C4 Q ```bash5 l7 v1 h. T) S
docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go
; r4 F- ^/ S, g, D ```, E% J- M3 m4 e, |
& f" o. h5 d [$ P+ c
## 使用IPv60 V' y `4 c4 ]6 r, F' d$ C: F
1 A/ v1 t5 v/ C6 Y2 r2 t" ~: c- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv6
0 y e, }# F* F! q6 B- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`8 {# ~- p. v& i) p5 f, I) w
- 群晖:
: L5 f5 V2 k, C, {# s - 套件中心下载docker并打开4 p/ s% e. i* z8 e E; p; Z: B
- 注册表中搜索`ddns-go`并下载; w2 Z. k( c# F# g4 r. l& z
- 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`- i) i0 d/ @2 ?# _& S. j
- 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功, t: a# }3 U2 t: `
- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用)2 Z3 i. }$ Z" I2 t" L: |- C
- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv6! U- y8 j' C! u1 h o8 G
2 o1 y3 C2 r7 v8 A: D/ \
## Webhook
. T5 ]8 s5 E' |$ c" C1 o
8 O8 ` J- e+ y- ?: n( W1 y2 o- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL. J0 t- M/ v& m$ i+ G6 ^% C i: s
- 支持的变量- } T2 L+ v: t! g, O7 h# N6 R
8 s* g+ I% Z! ]& J
| 变量名 | 说明 |; j) k+ F+ p; g8 I) y$ _ b
| ---- | ---- |1 Z) q5 l- n2 t \# F8 k0 ] Q6 g
| #{ipv4Addr} | 新的IPv4地址 |: j6 E5 N( Y9 e7 l% Y
| #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`|- E( m4 Z& G% O& c8 C* b" L
| #{ipv4Domains} | IPv4的域名,多个以`,`分割 |9 A0 v4 l$ ^2 i, |% q- T
| #{ipv6Addr} | 新的IPv6地址 |9 K% N3 C9 |# t2 S: u9 l
| #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|- H2 m* e, v, G8 v4 {. y
| #{ipv6Domains} | IPv6的域名,多个以`,`分割 |& ~3 j8 \9 ^# d/ X0 R
s0 h6 P9 V# \- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求% r$ w% S. C( Y- o+ Q) F/ t) p8 G
- <details><summary>Server酱</summary>0 B, ]2 Y0 U' N1 V
- n% p& H/ Z# J' A; M- }
```: F7 k4 o: P& H
https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
# k7 w5 K# n! }! U v ```
5 [5 X' T, o1 b7 u/ `% q- l- <details><summary>Bark</summary>7 c1 C3 Y( E5 m+ k& B
- V4 ]( j/ T) Q* L ```4 t2 A4 I. h$ d" h* R
https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
7 v/ |3 h# D5 V, H ```
( O! C/ V8 a! p+ s P </details>% {* K5 h6 Q9 Q' E7 o
- <details><summary>钉钉</summary>; {' n# U( C: O4 s% i* M
! V! ^2 r6 r; {- O# @9 Z
- 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义
$ V7 R: e3 @& R' F' J - 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
" j+ U! h" `$ o2 k, ]- V - URL中输入钉钉给你的 `Webhook地址`) q: |# t" o+ J, R7 L$ d* v/ s1 u
- RequestBody中输入
: q0 z; @! `9 {4 @4 M( u7 t* P ```json- ^/ P! ]4 |/ ^# g \( [) N- R
{
b4 `% u$ y/ \# S9 l "msgtype": "markdown",
% v9 n' Y0 P ~; x) Q "markdown": {% x7 a* K1 m& v
"title": "你的公网IP变了",
+ g4 V- R9 p0 C1 ? "text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
& V' ~) z5 L& ]$ l) Q- t9 w. c0 E }9 h4 t- D9 c& c m. `- ~& J
}
" l$ t% l6 P6 J% e% Q, H$ g ```
0 N( Z2 D) `) P3 t </details>+ h2 H# ?1 t! @. \ D ?! [: r
- <details><summary>飞书</summary>7 `1 \8 B# ?, m9 K# a2 [
6 V( a; s- s3 }: C6 g% m( M: F
- 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人* u+ m+ g# M% e( h
- 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`$ a6 [4 m5 z4 G6 N) U( a
- URL中输入飞书给你的 `Webhook地址`
+ y% ?! D j K/ W; C! f4 f - RequestBody中输入3 |7 b! B. l7 e* H7 f
```json
5 W+ F9 ~2 n" K! R# K2 R {$ J& O* Q9 t( o6 y
"msg_type": "post",- B4 M3 v& R2 E' a" w$ u! q; A
"content": {
9 E: D/ y: ]. h: X "post": {* Z$ Y4 ]! n- H( X* k8 V; p, M* {7 d$ {
"zh_cn": {
% Y! @7 |6 ~) X3 s "title": "你的公网IP变了",
" D P* Q3 A& e8 i "content": [! f2 n1 b0 |/ H$ E' t5 L0 x/ t+ w
[8 ~7 m; z0 u% ]6 ]5 e
{: r- k) m$ \1 K6 ]. `* `
"tag": "text",
% R4 [& ^2 z% @, | "text": "IPv4地址:#{ipv4Addr}"
: Y z( k& y+ U6 d# E& _7 S; y% t }( x$ Y8 v! y* o0 ^
],
9 t8 D1 ~! x- L1 f [
) t6 A% i1 I+ m {
7 X- C- w1 y1 G8 I6 d1 O y "tag": "text",% |0 }2 d( ]" M* W' I) v/ c" o
"text": "域名更新结果:#{ipv4Result}"
, {: G+ t% c s2 M }
' M' e& ?' W' j8 x$ j/ {8 ?6 I ]
, C1 F& U1 L- a# [/ t; e; c6 J ]
- u' _6 u: N/ k% Q- e. q/ v }
$ ]( A' S0 Q' S8 s2 v% D+ ?. e }
' l+ ]2 x0 @' |5 e }8 o S+ f J: r8 ?
}
( c& f; q* z& q3 g ```3 \! }$ ~; @( S8 E0 P" o( e$ }
</details>
5 L# Y/ Y5 ?4 z- <details><summary>Telegram</summary>
9 ~5 }& ^7 U5 i
& g) _5 d) B* r [ddns-telegram-bot]
: j5 H2 H* L) ^6 O! ^8 | </details>
; e2 x( m+ x$ `( X1 A, L8 E) [- <details><summary>plusplus 推送加</summary>
4 r. H: ]; T% ~# l8 g4 B; u( E% o: c0 A
- [获取token](https://www.pushplus.plus/push1.html)
( v5 L" a8 [! B. `8 X7 T \ - URL中输入 `https://www.pushplus.plus/send`5 J. T7 D: n% o% h. j: r
- RequestBody中输入
+ S# B* \$ |/ g, V5 D; [" D- O5 u ```json
; B, P5 b1 c/ R! }* Z/ _. [2 @1 y {) P* P$ i0 Z& J) W5 W
"token": "your token",
+ A# B8 b4 m) ?. P8 M "title": "你的公网IP变了",8 h2 v J6 ^% U2 x' `* K' Y
"content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"3 B# k* K# b3 o$ D
}
# O% e# x8 _$ H ```
D$ h/ T: G* \7 W: ~ </details>" F" |/ C$ D0 u- y
- <details><summary>Discord</summary>
$ j. g: H3 ?+ p
/ X/ t% p- X, g/ b - Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址 d, c% g) D% c+ G
- URL中输入Discord复制的 `Webhook网址`. g; ?* r% h0 e" N( B2 q' z
- RequestBody中输入& D' f/ M# N5 O$ x5 G( r5 T
```json7 w& }% h: t# p4 m" o; W6 d* I
{
$ B8 k5 \; u1 d4 O "content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}.",: c6 A: W& u1 j( H- D
"embeds": [
/ @' f) X( B+ X {
8 N& g8 l/ n; y+ Q1 a "description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",
1 L3 G ]1 [% s "color": 15258703,
! \( O" {7 [$ s* ^) C "author": {
9 H1 u q# D: W6 R: L "name": "DDNS"
" A( M6 s) m) J1 b0 d* A },4 J: H- R6 J0 o$ D% G6 m0 R+ r
"footer": {
+ h- ]4 j: `0 _0 t9 e "text": "DDNS #{ipv4Result}"4 x8 b* ?5 m7 a+ l# }2 q% E
}
8 K5 i$ f5 l) S& y3 e1 I, Z }! T) p, H- W0 ?: C$ C- Q
]2 l# i: ^0 Z; [: }
}1 G, l" M; q3 `& Q2 X3 P& a
```& _. }' T2 C$ p7 w% a- K
</details>$ V& d/ O* Q3 {: ~
) u9 M A5 F# K## Callback
$ F0 b, Q6 Y: A# [" Y3 K8 K
- r. _9 v4 v9 S6 C1 M- 通过自定义回调可支持更多的第三方DNS服务商2 p' M5 H( Q2 B% e# [
- 配置的域名有几行, 就会回调几次# C, E3 M7 Z; n& O1 ?6 e
- 支持的变量. x) u9 S% X# K6 w
8 f3 R( h, G: k# L: I6 @6 a | 变量名 | 说明 |. r. e9 Y! `6 u S4 K
| ---- | ---- |
% u" ]3 A- q8 n; y4 D | #{ip} | 新的IPv4/IPv6地址 |
5 W: ]3 x- Q& V/ i% e0 u | #{domain} | 当前域名 |
7 u3 H# A8 a1 V% R4 @* M H" A3 V- I | #{recordType} | 记录类型 `A`或`AAAA` |
5 w+ G0 [" ^2 @3 ]5 t/ F- [ | #{ttl} | TTL |; {( V/ [3 I8 [! h- O) p. G; L
- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求) c0 ^4 r6 `, ^* f& w4 a* C& f
- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|