From 80a90f05f31f5e045d9035ea109597ce85fb471f Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Tue, 2 Sep 2025 21:43:27 +0800 Subject: [PATCH] feat: support AmneziaWG v2.0 --- adapter/outbound/wireguard.go | 62 +++++++++++++++++++---------------- docs/config.yaml | 33 +++++++++++-------- go.mod | 2 +- go.sum | 4 +-- 4 files changed, 56 insertions(+), 45 deletions(-) diff --git a/adapter/outbound/wireguard.go b/adapter/outbound/wireguard.go index f59033fe..ba6e99ee 100644 --- a/adapter/outbound/wireguard.go +++ b/adapter/outbound/wireguard.go @@ -87,26 +87,26 @@ type WireGuardPeerOption struct { } type AmneziaWGOption struct { - 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"` + 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"` + S3 int `proxy:"s3,omitempty"` // AmneziaWG v1.5 and v2 + S4 int `proxy:"s4,omitempty"` // AmneziaWG v1.5 and v2 + H1 string `proxy:"h1,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation + H2 string `proxy:"h2,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation + H3 string `proxy:"h3,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation + H4 string `proxy:"h4,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation + I1 string `proxy:"i1,omitempty"` // AmneziaWG v1.5 and v2 + I2 string `proxy:"i2,omitempty"` // AmneziaWG v1.5 and v2 + I3 string `proxy:"i3,omitempty"` // AmneziaWG v1.5 and v2 + I4 string `proxy:"i4,omitempty"` // AmneziaWG v1.5 and v2 + I5 string `proxy:"i5,omitempty"` // AmneziaWG v1.5 and v2 + J1 string `proxy:"j1,omitempty"` // AmneziaWG v1.5 only (removed in v2) + J2 string `proxy:"j2,omitempty"` // AmneziaWG v1.5 only (removed in v2) + J3 string `proxy:"j3,omitempty"` // AmneziaWG v1.5 only (removed in v2) + Itime int64 `proxy:"itime,omitempty"` // AmneziaWG v1.5 only (removed in v2) } type wgSingErrorHandler struct { @@ -412,17 +412,23 @@ func (w *WireGuard) genIpcConf(ctx context.Context, updateOnly bool) (string, er 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.S3 != 0 { + ipcConf += "s3=" + strconv.Itoa(w.option.AmneziaWGOption.S3) + "\n" } - if w.option.AmneziaWGOption.H2 != 0 { - ipcConf += "h2=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H2), 10) + "\n" + if w.option.AmneziaWGOption.S4 != 0 { + ipcConf += "s4=" + strconv.Itoa(w.option.AmneziaWGOption.S4) + "\n" } - if w.option.AmneziaWGOption.H3 != 0 { - ipcConf += "h3=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H3), 10) + "\n" + if w.option.AmneziaWGOption.H1 != "" { + ipcConf += "h1=" + w.option.AmneziaWGOption.H1 + "\n" } - if w.option.AmneziaWGOption.H4 != 0 { - ipcConf += "h4=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H4), 10) + "\n" + if w.option.AmneziaWGOption.H2 != "" { + ipcConf += "h2=" + w.option.AmneziaWGOption.H2 + "\n" + } + if w.option.AmneziaWGOption.H3 != "" { + ipcConf += "h3=" + w.option.AmneziaWGOption.H3 + "\n" + } + if w.option.AmneziaWGOption.H4 != "" { + ipcConf += "h4=" + w.option.AmneziaWGOption.H4 + "\n" } if w.option.AmneziaWGOption.I1 != "" { ipcConf += "i1=" + w.option.AmneziaWGOption.I1 + "\n" diff --git a/docs/config.yaml b/docs/config.yaml index d5b028e0..ae4cf71b 100644 --- a/docs/config.yaml +++ b/docs/config.yaml @@ -862,20 +862,25 @@ proxies: # socks5 # jmax: 501 # s1: 30 # s2: 40 - # h1: 123456 - # h2: 67543 - # h4: 32345 - # h3: 123123 - # # AmneziaWG v1.5 - # i1: - # i2: - # i3: "" - # i4: "" - # i5: "" - # j1: - # j2: - # j3: - # itime: 60 + # s3: 50 # AmneziaWG v1.5 and v2 + # s4: 5 # AmneziaWG v1.5 and v2 + # h1: 123456 # AmneziaWG v1.0 and v1.5 + # h2: 67543 # AmneziaWG v1.0 and v1.5 + # h3: 123123 # AmneziaWG v1.0 and v1.5 + # h4: 32345 # AmneziaWG v1.0 and v1.5 + # h1: 123456-123500 # AmneziaWG v2.0 only + # h2: 67543-67550 # AmneziaWG v2.0 only + # h3: 123123-123200 # AmneziaWG v2.0 only + # h4: 32345-32350 # AmneziaWG v2.0 only + # i1: # AmneziaWG v1.5 and v2 + # i2: # AmneziaWG v1.5 and v2 + # i3: "" # AmneziaWG v1.5 and v2 + # i4: "" # AmneziaWG v1.5 and v2 + # i5: "" # AmneziaWG v1.5 and v2 + # j1: # AmneziaWG v1.5 only (removed in v2) + # j2: # AmneziaWG v1.5 only (removed in v2) + # j3: # AmneziaWG v1.5 only (removed in v2) + # itime: 60 # AmneziaWG v1.5 only (removed in v2) # tuic - name: tuic diff --git a/go.mod b/go.mod index e8860a37..c84a713d 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-20250820070344-732c0c9d418a + github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281 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 f2d2b0ba..42ed1f80 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-20250820070344-732c0c9d418a h1:c1QSGpacSeQdBdWcEKZKGuWLcqIG2wxHEygAcXuDwS4= -github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY= +github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281 h1:09EM0sOLb2kfL0KETGhHujsBLB5iy5U/2yHRHsxf/pI= +github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281/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=