Skip to content

Commit 5e821d8

Browse files
committed
Proper AmneziaWG 2.0 support
1 parent 4e1bc1e commit 5e821d8

3 files changed

Lines changed: 52 additions & 19 deletions

File tree

go.mod

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
module jwg
22

3-
go 1.24.1
3+
go 1.26.1
44

55
require (
66
github.com/Jipok/go-persist v1.9.2
7-
github.com/Jipok/wgctrl-go v1.0.1
7+
github.com/Jipok/wgctrl-go v1.1.1
88
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
99
github.com/spf13/pflag v1.0.10
1010
)
@@ -13,12 +13,12 @@ require (
1313
github.com/goccy/go-json v0.10.5 // indirect
1414
github.com/google/go-cmp v0.7.0 // indirect
1515
github.com/mdlayher/genetlink v1.3.2 // indirect
16-
github.com/mdlayher/netlink v1.8.0 // indirect
16+
github.com/mdlayher/netlink v1.9.0 // indirect
1717
github.com/mdlayher/socket v0.5.1 // indirect
1818
github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect
19-
golang.org/x/crypto v0.46.0 // indirect
20-
golang.org/x/net v0.48.0 // indirect
21-
golang.org/x/sync v0.19.0 // indirect
22-
golang.org/x/sys v0.39.0 // indirect
19+
golang.org/x/crypto v0.49.0 // indirect
20+
golang.org/x/net v0.52.0 // indirect
21+
golang.org/x/sync v0.20.0 // indirect
22+
golang.org/x/sys v0.42.0 // indirect
2323
golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb // indirect
2424
)

go.sum

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
github.com/Jipok/go-persist v1.9.2 h1:K4piO63D5gL/l6YjvqvUStAN0JK7292xJ2jQgzTXatg=
22
github.com/Jipok/go-persist v1.9.2/go.mod h1:n/n+Ka7kgwWMuWxGHGKygI8wb4+RSqpjGkusa+POa9g=
3-
github.com/Jipok/wgctrl-go v1.0.1 h1:6pOk4qTEz/dYsCicDwXQ8Ks6cnADrZeqVy8SpYlV4hk=
4-
github.com/Jipok/wgctrl-go v1.0.1/go.mod h1:GrJJ7jsDCnIgf2t9mjYNF7KxmOT6codxbglM1XJx1K8=
3+
github.com/Jipok/wgctrl-go v1.1.0 h1:XZXuXuqqDq1XFllR7aYka+ucHVKSssraYZP/8+1DhqY=
4+
github.com/Jipok/wgctrl-go v1.1.0/go.mod h1:GrJJ7jsDCnIgf2t9mjYNF7KxmOT6codxbglM1XJx1K8=
5+
github.com/Jipok/wgctrl-go v1.1.1 h1:2a4scbjGZ6kACYmOGN/gWZ81en6G/r5dq7YHYQQUG0c=
6+
github.com/Jipok/wgctrl-go v1.1.1/go.mod h1:GrJJ7jsDCnIgf2t9mjYNF7KxmOT6codxbglM1XJx1K8=
57
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
68
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
79
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
810
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
911
github.com/mdlayher/genetlink v1.3.2 h1:KdrNKe+CTu+IbZnm/GVUMXSqBBLqcGpRDa0xkQy56gw=
1012
github.com/mdlayher/genetlink v1.3.2/go.mod h1:tcC3pkCrPUGIKKsCsp0B3AdaaKuHtaxoJRz3cc+528o=
11-
github.com/mdlayher/netlink v1.8.0 h1:e7XNIYJKD7hUct3Px04RuIGJbBxy1/c4nX7D5YyvvlM=
12-
github.com/mdlayher/netlink v1.8.0/go.mod h1:UhgKXUlDQhzb09DrCl2GuRNEglHmhYoWAHid9HK3594=
13+
github.com/mdlayher/netlink v1.9.0 h1:G8+GLq2x3v4D4MVIqDdNUhTUC7TKiCy/6MDkmItfKco=
14+
github.com/mdlayher/netlink v1.9.0/go.mod h1:YBnl5BXsCoRuwBjKKlZ+aYmEoq0r12FDA/3JC+94KDg=
1315
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
1416
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
1517
github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE924+mUcZuXKLBHA35U7LN621Bws=
@@ -20,13 +22,13 @@ github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1
2022
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
2123
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
2224
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
23-
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
24-
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
25-
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
26-
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
27-
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
28-
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
29-
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
30-
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
25+
golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
26+
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
27+
golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
28+
golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
29+
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
30+
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
31+
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
32+
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
3133
golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb h1:whnFRlWMcXI9d+ZbWg+4sHnLp52d5yiIPUxMBSt4X9A=
3234
golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb/go.mod h1:rpwXGsirqLqN2L0JDJQlwOboGHmptD5ZD6T2VmcqhTw=

main.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ type ServerConfig struct {
9393
AmnezH2 string // ResponseHeader (magic)
9494
AmnezH3 string // CookieHeader (magic)
9595
AmnezH4 string // TransportHeader (magic)
96+
AmnezI1 string // Init Packet Magic
97+
AmnezI2 string // Response Packet Magic
98+
AmnezI3 string // Cookie Packet Magic
99+
AmnezI4 string // Transport Packet Magic
100+
AmnezI5 string // Additional obfuscation
96101
}
97102

98103
// PeerData holds all necessary information about a peer, including its
@@ -353,6 +358,7 @@ func main() {
353358
config.AmnezH2 = *tempWgCfg.H2
354359
config.AmnezH3 = *tempWgCfg.H3
355360
config.AmnezH4 = *tempWgCfg.H4
361+
config.AmnezI1 = *tempWgCfg.I1
356362

357363
configDirty = true
358364
}
@@ -385,6 +391,24 @@ func main() {
385391
}
386392
}
387393

394+
if config.AmnezH1 != "" && !strings.Contains(config.AmnezH1, "-") {
395+
fmt.Printf("\n%s%s======================================================================%s\n", colorRed, colorBold, colorReset)
396+
fmt.Printf("%s%s[CRITICAL WARNING] VULNERABLE AMNEZIA WG CONFIGURATION DETECTED!%s\n\n", colorRed, colorBold, colorReset)
397+
398+
fmt.Printf("%sYour server is currently using legacy AmneziaWG 1.5 obfuscation parameters.%s\n", colorYellow, colorReset)
399+
fmt.Printf("These parameters use static headers and are %svulnerable to DPI heuristic blocking%s.\n\n", colorRed, colorReset)
400+
401+
fmt.Printf("It is strictly recommended to generate new AWG 2.0 parameters (ranged\n")
402+
fmt.Printf("headers and zero-collision padding) to ensure connection stability.\n\n")
403+
404+
fmt.Printf("How to upgrade:\n")
405+
fmt.Printf("1. Delete the current database (this will reset the server keys and peers).\n")
406+
fmt.Printf(" %srm %s%s\n", colorCyan, dbPath, colorReset)
407+
fmt.Printf("2. Run this tool again to generate a fresh, secure configuration.\n")
408+
fmt.Printf("3. Add your peers and scan the new QR codes on all devices.\n")
409+
fmt.Printf("%s%s======================================================================%s\n\n", colorRed, colorBold, colorReset)
410+
}
411+
388412
// --- Action Router ---
389413
if command == "show" {
390414
runShowPeer(peerName)
@@ -479,6 +503,10 @@ func main() {
479503
configWg.H2 = strPtr(config.AmnezH2)
480504
configWg.H3 = strPtr(config.AmnezH3)
481505
configWg.H4 = strPtr(config.AmnezH4)
506+
507+
if config.AmnezI1 != "" { // Amnezia 2.0 marker
508+
configWg.I1 = strPtr(config.AmnezI1)
509+
}
482510
}
483511

484512
if err := wgClient.ConfigureDevice(argIface, configWg); err != nil {
@@ -1107,6 +1135,9 @@ func printClientConfig(peerName string, peerData PeerData, serverPublicKey wgtyp
11071135
amneziaParamsBuilder.WriteString(fmt.Sprintf("H2 = %s\n", config.AmnezH2))
11081136
amneziaParamsBuilder.WriteString(fmt.Sprintf("H3 = %s\n", config.AmnezH3))
11091137
amneziaParamsBuilder.WriteString(fmt.Sprintf("H4 = %s\n", config.AmnezH4))
1138+
if config.AmnezI1 != "" {
1139+
amneziaParamsBuilder.WriteString(fmt.Sprintf("I1 = %s\n", config.AmnezI1))
1140+
}
11101141
}
11111142

11121143
clientConfig := fmt.Sprintf(`[Interface]

0 commit comments

Comments
 (0)