From 5f09db26555622cf869e24f0d6004c813f8b850b Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Wed, 20 Aug 2025 15:42:04 +0800 Subject: [PATCH] feat: support AmneziaWG v1.5 --- adapter/outbound/wireguard.go | 92 ++++++++++++++++++++++++++++------- docs/config.yaml | 10 ++++ go.mod | 2 +- go.sum | 4 +- 4 files changed, 87 insertions(+), 21 deletions(-) diff --git a/adapter/outbound/wireguard.go b/adapter/outbound/wireguard.go index 84ba1dbb..f59033fe 100644 --- a/adapter/outbound/wireguard.go +++ b/adapter/outbound/wireguard.go @@ -87,15 +87,26 @@ type WireGuardPeerOption struct { } type AmneziaWGOption struct { - JC int `proxy:"jc"` - JMin int `proxy:"jmin"` - JMax int `proxy:"jmax"` - S1 int `proxy:"s1"` - S2 int `proxy:"s2"` - H1 uint32 `proxy:"h1"` - H2 uint32 `proxy:"h2"` - H3 uint32 `proxy:"h3"` - H4 uint32 `proxy:"h4"` + JC int `proxy:"jc,omitempty"` + JMin int `proxy:"jmin,omitempty"` + JMax int `proxy:"jmax,omitempty"` + S1 int `proxy:"s1,omitempty"` + S2 int `proxy:"s2,omitempty"` + H1 uint32 `proxy:"h1,omitempty"` + H2 uint32 `proxy:"h2,omitempty"` + H3 uint32 `proxy:"h3,omitempty"` + H4 uint32 `proxy:"h4,omitempty"` + + // AmneziaWG v1.5 + I1 string `proxy:"i1,omitempty"` + I2 string `proxy:"i2,omitempty"` + I3 string `proxy:"i3,omitempty"` + I4 string `proxy:"i4,omitempty"` + I5 string `proxy:"i5,omitempty"` + J1 string `proxy:"j1,omitempty"` + J2 string `proxy:"j2,omitempty"` + J3 string `proxy:"j3,omitempty"` + Itime int64 `proxy:"itime,omitempty"` } type wgSingErrorHandler struct { @@ -386,15 +397,60 @@ func (w *WireGuard) genIpcConf(ctx context.Context, updateOnly bool) (string, er if !updateOnly { ipcConf += "private_key=" + w.option.PrivateKey + "\n" if w.option.AmneziaWGOption != nil { - ipcConf += "jc=" + strconv.Itoa(w.option.AmneziaWGOption.JC) + "\n" - ipcConf += "jmin=" + strconv.Itoa(w.option.AmneziaWGOption.JMin) + "\n" - ipcConf += "jmax=" + strconv.Itoa(w.option.AmneziaWGOption.JMax) + "\n" - ipcConf += "s1=" + strconv.Itoa(w.option.AmneziaWGOption.S1) + "\n" - ipcConf += "s2=" + strconv.Itoa(w.option.AmneziaWGOption.S2) + "\n" - ipcConf += "h1=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H1), 10) + "\n" - ipcConf += "h2=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H2), 10) + "\n" - ipcConf += "h3=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H3), 10) + "\n" - ipcConf += "h4=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H4), 10) + "\n" + if w.option.AmneziaWGOption.JC != 0 { + ipcConf += "jc=" + strconv.Itoa(w.option.AmneziaWGOption.JC) + "\n" + } + if w.option.AmneziaWGOption.JMin != 0 { + ipcConf += "jmin=" + strconv.Itoa(w.option.AmneziaWGOption.JMin) + "\n" + } + if w.option.AmneziaWGOption.JMax != 0 { + ipcConf += "jmax=" + strconv.Itoa(w.option.AmneziaWGOption.JMax) + "\n" + } + if w.option.AmneziaWGOption.S1 != 0 { + ipcConf += "s1=" + strconv.Itoa(w.option.AmneziaWGOption.S1) + "\n" + } + if w.option.AmneziaWGOption.S2 != 0 { + ipcConf += "s2=" + strconv.Itoa(w.option.AmneziaWGOption.S2) + "\n" + } + if w.option.AmneziaWGOption.H1 != 0 { + ipcConf += "h1=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H1), 10) + "\n" + } + if w.option.AmneziaWGOption.H2 != 0 { + ipcConf += "h2=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H2), 10) + "\n" + } + if w.option.AmneziaWGOption.H3 != 0 { + ipcConf += "h3=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H3), 10) + "\n" + } + if w.option.AmneziaWGOption.H4 != 0 { + ipcConf += "h4=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H4), 10) + "\n" + } + if w.option.AmneziaWGOption.I1 != "" { + ipcConf += "i1=" + w.option.AmneziaWGOption.I1 + "\n" + } + if w.option.AmneziaWGOption.I2 != "" { + ipcConf += "i2=" + w.option.AmneziaWGOption.I2 + "\n" + } + if w.option.AmneziaWGOption.I3 != "" { + ipcConf += "i3=" + w.option.AmneziaWGOption.I3 + "\n" + } + if w.option.AmneziaWGOption.I4 != "" { + ipcConf += "i4=" + w.option.AmneziaWGOption.I4 + "\n" + } + if w.option.AmneziaWGOption.I5 != "" { + ipcConf += "i5=" + w.option.AmneziaWGOption.I5 + "\n" + } + if w.option.AmneziaWGOption.J1 != "" { + ipcConf += "j1=" + w.option.AmneziaWGOption.J1 + "\n" + } + if w.option.AmneziaWGOption.J2 != "" { + ipcConf += "j2=" + w.option.AmneziaWGOption.J2 + "\n" + } + if w.option.AmneziaWGOption.J3 != "" { + ipcConf += "j3=" + w.option.AmneziaWGOption.J3 + "\n" + } + if w.option.AmneziaWGOption.Itime != 0 { + ipcConf += "itime=" + strconv.FormatInt(int64(w.option.AmneziaWGOption.Itime), 10) + "\n" + } } } if len(w.option.Peers) > 0 { diff --git a/docs/config.yaml b/docs/config.yaml index 445c61a3..80af843b 100644 --- a/docs/config.yaml +++ b/docs/config.yaml @@ -857,6 +857,16 @@ proxies: # socks5 # h2: 67543 # h4: 32345 # h3: 123123 + # # AmneziaWG v1.5 + # i1: + # i2: + # i3: "" + # i4: "" + # i5: "" + # j1: + # j2: + # j3: + # itime: 60 # tuic - name: tuic diff --git a/go.mod b/go.mod index 6a78dfc3..5695c782 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905 github.com/klauspost/compress v1.17.9 // lastest version compatible with golang1.20 github.com/mdlayher/netlink v1.7.2 - github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab + github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a github.com/metacubex/bart v0.20.5 github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b github.com/metacubex/blake3 v0.1.0 diff --git a/go.sum b/go.sum index c17a985a..69811ad2 100644 --- a/go.sum +++ b/go.sum @@ -90,8 +90,8 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/ github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= -github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4= -github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI= +github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a h1:c1QSGpacSeQdBdWcEKZKGuWLcqIG2wxHEygAcXuDwS4= +github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY= github.com/metacubex/ascon v0.1.0 h1:6ZWxmXYszT1XXtwkf6nxfFhc/OTtQ9R3Vyj1jN32lGM= github.com/metacubex/ascon v0.1.0/go.mod h1:eV5oim4cVPPdEL8/EYaTZ0iIKARH9pnhAK/fcT5Kacc= github.com/metacubex/bart v0.20.5 h1:XkgLZ17QxfxkqKdGsojoM2Zu01mmHyyQSFzt2/calTM=