@@ -60,7 +60,7 @@ func NewWithConfig(ctx context.Context, logger slog.Logger, cfg Config) (*Tunnel
60
60
61
61
tun , tnet , err := netstack .CreateNetTUN (
62
62
[]netip.Addr {server .ClientIP },
63
- []netip.Addr {},
63
+ []netip.Addr {netip . AddrFrom4 ([ 4 ] byte { 1 , 1 , 1 , 1 }) },
64
64
1280 ,
65
65
)
66
66
if err != nil {
@@ -71,19 +71,27 @@ func NewWithConfig(ctx context.Context, logger slog.Logger, cfg Config) (*Tunnel
71
71
if err != nil {
72
72
return nil , nil , xerrors .Errorf ("resolve endpoint: %w" , err )
73
73
}
74
+ // In IPv6, we need to enclose the address to in [] before passing to wireguard's endpoint key, like
75
+ // [2001:abcd::1]:8888. We'll use netip.AddrPort to correctly handle this.
76
+ wgAddr , err := netip .ParseAddr (wgip .String ())
77
+ if err != nil {
78
+ return nil , nil , xerrors .Errorf ("parse address: %w" , err )
79
+ }
80
+ wgEndpoint := netip .AddrPortFrom (wgAddr , cfg .Tunnel .WireguardPort )
74
81
75
- dev := device .NewDevice (tun , conn .NewDefaultBind (), device .NewLogger (device .LogLevelSilent , "" ))
76
- err = dev . IpcSet ( fmt .Sprintf (`private_key=%s
82
+ dev := device .NewDevice (tun , conn .NewDefaultBind (), device .NewLogger (device .LogLevelVerbose , "client " ))
83
+ setString := fmt .Sprintf (`private_key=%s
77
84
public_key=%s
78
- endpoint=[%s]:%d
85
+ endpoint=%s
79
86
persistent_keepalive_interval=21
80
87
allowed_ip=%s/128` ,
81
88
hex .EncodeToString (cfg .PrivateKey [:]),
82
89
server .ServerPublicKey ,
83
- wgip .IP .String (),
84
- cfg .Tunnel .WireguardPort ,
90
+ wgEndpoint .String (),
85
91
server .ServerIP .String (),
86
- ))
92
+ )
93
+ logger .Debug (ctx , "IpcSet" , slog .F ("kv" , setString ))
94
+ err = dev .IpcSet (setString )
87
95
if err != nil {
88
96
return nil , nil , xerrors .Errorf ("configure wireguard ipc: %w" , err )
89
97
}
0 commit comments