mirror of
https://github.com/coder/coder.git
synced 2025-07-18 14:17:22 +00:00
chore: get TUN/DNS working on Windows for CoderVPN (#16310)
This commit is contained in:
@ -15,16 +15,16 @@ import (
|
||||
"time"
|
||||
"unicode"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/tailscale/wireguard-go/tun"
|
||||
"golang.org/x/xerrors"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
"tailscale.com/net/dns"
|
||||
"tailscale.com/net/netmon"
|
||||
"tailscale.com/util/dnsname"
|
||||
"tailscale.com/wgengine/router"
|
||||
|
||||
"github.com/google/uuid"
|
||||
|
||||
"cdr.dev/slog"
|
||||
"github.com/coder/coder/v2/coderd/util/ptr"
|
||||
"github.com/coder/coder/v2/tailnet"
|
||||
"github.com/coder/quartz"
|
||||
)
|
||||
@ -51,9 +51,8 @@ type Tunnel struct {
|
||||
// option is used, to avoid the tunnel using itself as a sink for it's own
|
||||
// logs, which could lead to deadlocks.
|
||||
clientLogger slog.Logger
|
||||
// router and dnsConfigurator may be nil
|
||||
router router.Router
|
||||
dnsConfigurator dns.OSConfigurator
|
||||
// the following may be nil
|
||||
networkingStackFn func(*Tunnel, *StartRequest, slog.Logger) (NetworkStack, error)
|
||||
}
|
||||
|
||||
type TunnelOption func(t *Tunnel)
|
||||
@ -169,21 +168,28 @@ func (t *Tunnel) handleRPC(req *request[*TunnelMessage, *ManagerMessage]) {
|
||||
}
|
||||
}
|
||||
|
||||
func UseAsRouter() TunnelOption {
|
||||
type NetworkStack struct {
|
||||
WireguardMonitor *netmon.Monitor
|
||||
TUNDevice tun.Device
|
||||
Router router.Router
|
||||
DNSConfigurator dns.OSConfigurator
|
||||
}
|
||||
|
||||
func UseOSNetworkingStack() TunnelOption {
|
||||
return func(t *Tunnel) {
|
||||
t.router = NewRouter(t)
|
||||
t.networkingStackFn = GetNetworkingStack
|
||||
}
|
||||
}
|
||||
|
||||
func UseAsLogger() TunnelOption {
|
||||
return func(t *Tunnel) {
|
||||
t.clientLogger = slog.Make(t)
|
||||
t.clientLogger = t.clientLogger.AppendSinks(t)
|
||||
}
|
||||
}
|
||||
|
||||
func UseAsDNSConfig() TunnelOption {
|
||||
func UseCustomLogSinks(sinks ...slog.Sink) TunnelOption {
|
||||
return func(t *Tunnel) {
|
||||
t.dnsConfigurator = NewDNSConfigurator(t)
|
||||
t.clientLogger = t.clientLogger.AppendSinks(sinks...)
|
||||
}
|
||||
}
|
||||
|
||||
@ -227,18 +233,28 @@ func (t *Tunnel) start(req *StartRequest) error {
|
||||
for _, h := range req.GetHeaders() {
|
||||
header.Add(h.GetName(), h.GetValue())
|
||||
}
|
||||
var networkingStack NetworkStack
|
||||
if t.networkingStackFn != nil {
|
||||
networkingStack, err = t.networkingStackFn(t, req, t.clientLogger)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("failed to create networking stack dependencies: %w", err)
|
||||
}
|
||||
} else {
|
||||
t.logger.Debug(t.ctx, "using default networking stack as no custom stack was provided")
|
||||
}
|
||||
|
||||
conn, err := t.client.NewConn(
|
||||
t.ctx,
|
||||
svrURL,
|
||||
apiToken,
|
||||
&Options{
|
||||
Headers: header,
|
||||
Logger: t.clientLogger,
|
||||
DNSConfigurator: t.dnsConfigurator,
|
||||
Router: t.router,
|
||||
TUNFileDescriptor: ptr.Ref(int(req.GetTunnelFileDescriptor())),
|
||||
UpdateHandler: t,
|
||||
Headers: header,
|
||||
Logger: t.clientLogger,
|
||||
DNSConfigurator: networkingStack.DNSConfigurator,
|
||||
Router: networkingStack.Router,
|
||||
TUNDevice: networkingStack.TUNDevice,
|
||||
WireguardMonitor: networkingStack.WireguardMonitor,
|
||||
UpdateHandler: t,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user