From 3ca03fd4a935a0e333f6f06b3c223c325e27fb5d Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Fri, 2 Sep 2022 18:25:34 -0500 Subject: [PATCH] fix: Allow disabling built-in DERP server --- cli/server.go | 8 ++++++-- tailnet/derpmap.go | 42 +++++++++++++++++++++++------------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/cli/server.go b/cli/server.go index 40e738bad4107..f1c654f9ac629 100644 --- a/cli/server.go +++ b/cli/server.go @@ -329,7 +329,7 @@ func Server(newAPI func(*coderd.Options) *coderd.API) *cobra.Command { validatedAutoImportTemplates[i] = v } - derpMap, err := tailnet.NewDERPMap(ctx, &tailcfg.DERPRegion{ + defaultRegion := &tailcfg.DERPRegion{ RegionID: derpServerRegionID, RegionCode: derpServerRegionCode, RegionName: derpServerRegionName, @@ -341,7 +341,11 @@ func Server(newAPI func(*coderd.Options) *coderd.API) *cobra.Command { STUNPort: -1, ForceHTTP: accessURLParsed.Scheme == "http", }}, - }, derpServerSTUNAddrs, derpConfigURL) + } + if !derpServerEnabled { + defaultRegion = nil + } + derpMap, err := tailnet.NewDERPMap(ctx, defaultRegion, derpServerSTUNAddrs, derpConfigURL) if err != nil { return xerrors.Errorf("create derp map: %w", err) } diff --git a/tailnet/derpmap.go b/tailnet/derpmap.go index 9c8122238cec7..cbc03cec4140b 100644 --- a/tailnet/derpmap.go +++ b/tailnet/derpmap.go @@ -15,22 +15,24 @@ import ( // NewDERPMap constructs a DERPMap from a set of STUN addresses and optionally a remote // URL to fetch a mapping from e.g. https://controlplane.tailscale.com/derpmap/default. func NewDERPMap(ctx context.Context, region *tailcfg.DERPRegion, stunAddrs []string, remoteURL string) (*tailcfg.DERPMap, error) { - for index, stunAddr := range stunAddrs { - host, rawPort, err := net.SplitHostPort(stunAddr) - if err != nil { - return nil, xerrors.Errorf("split host port for %q: %w", stunAddr, err) - } - port, err := strconv.Atoi(rawPort) - if err != nil { - return nil, xerrors.Errorf("parse port for %q: %w", stunAddr, err) + if region != nil { + for index, stunAddr := range stunAddrs { + host, rawPort, err := net.SplitHostPort(stunAddr) + if err != nil { + return nil, xerrors.Errorf("split host port for %q: %w", stunAddr, err) + } + port, err := strconv.Atoi(rawPort) + if err != nil { + return nil, xerrors.Errorf("parse port for %q: %w", stunAddr, err) + } + region.Nodes = append([]*tailcfg.DERPNode{{ + Name: fmt.Sprintf("%dstun%d", region.RegionID, index), + RegionID: region.RegionID, + HostName: host, + STUNOnly: true, + STUNPort: port, + }}, region.Nodes...) } - region.Nodes = append([]*tailcfg.DERPNode{{ - Name: fmt.Sprintf("%dstun%d", region.RegionID, index), - RegionID: region.RegionID, - HostName: host, - STUNOnly: true, - STUNPort: port, - }}, region.Nodes...) } derpMap := &tailcfg.DERPMap{ @@ -51,10 +53,12 @@ func NewDERPMap(ctx context.Context, region *tailcfg.DERPRegion, stunAddrs []str return nil, xerrors.Errorf("fetch derpmap: %w", err) } } - _, conflicts := derpMap.Regions[region.RegionID] - if conflicts { - return nil, xerrors.Errorf("the default region ID conflicts with a remote region from %q", remoteURL) + if region != nil { + _, conflicts := derpMap.Regions[region.RegionID] + if conflicts { + return nil, xerrors.Errorf("the default region ID conflicts with a remote region from %q", remoteURL) + } + derpMap.Regions[region.RegionID] = region } - derpMap.Regions[region.RegionID] = region return derpMap, nil }