mirror of https://github.com/tailscale/tailscale/
tailcfg: add DERP map structures
Updates #387 Updates #388 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>pull/390/head
parent
5ec7ac1d02
commit
cff53c6e6d
@ -0,0 +1,93 @@
|
|||||||
|
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package tailcfg
|
||||||
|
|
||||||
|
// DERPMap describes the set of DERP packet relay servers that are available.
|
||||||
|
type DERPMap struct {
|
||||||
|
// Regions is the set of geographic regions running DERP node(s).
|
||||||
|
//
|
||||||
|
// It's keyed by the DERPRegion.RegionID.
|
||||||
|
//
|
||||||
|
// The numbers are not necessarily contiguous.
|
||||||
|
Regions map[int]*DERPRegion
|
||||||
|
}
|
||||||
|
|
||||||
|
// DERPRegion is a geographic region running DERP relay node(s).
|
||||||
|
//
|
||||||
|
// Client nodes discover which region they're closest to, advertise
|
||||||
|
// that "home" DERP region (previously called "home node", when there
|
||||||
|
// was only 1 node per region) and maintain a persistent connection
|
||||||
|
// that region as long as it's the closest. Client nodes will further
|
||||||
|
// connect to other regions as necessary to communicate with peers
|
||||||
|
// advertising other regions as their homes.
|
||||||
|
type DERPRegion struct {
|
||||||
|
// RegionID is a unique integer for a geographic region.
|
||||||
|
//
|
||||||
|
// It corresponds to the legacy derpN.tailscale.com hostnames
|
||||||
|
// used by older clients. (Older clients will continue to resolve
|
||||||
|
// derpN.tailscale.com when contacting peers, rather than use
|
||||||
|
// the server-provided DERPMap)
|
||||||
|
//
|
||||||
|
// RegionIDs must be non-zero, positive, and guaranteed to fit
|
||||||
|
// in a JavaScript number.
|
||||||
|
RegionID int
|
||||||
|
|
||||||
|
// RegionCode is a short name for the region. It's usually a popular
|
||||||
|
// city or airport code in the region: "nyc", "sf", "sin",
|
||||||
|
// "fra", etc.
|
||||||
|
RegionCode string
|
||||||
|
|
||||||
|
// Nodes are the DERP nodes running in this region, in
|
||||||
|
// priority order for the current client. Client TLS
|
||||||
|
// connections should ideally only go to the first entry
|
||||||
|
// (falling back to the second if necessary). STUN packets
|
||||||
|
// should go to the first 1 or 2.
|
||||||
|
//
|
||||||
|
// If nodes within a region route packets amongst themselves,
|
||||||
|
// but not to other regions. That said, each user/domain
|
||||||
|
// should get a the same preferred node order, so if all nodes
|
||||||
|
// for a user/network pick the first one (as they should, when
|
||||||
|
// things are healthy), the inter-cluster routing is minimal
|
||||||
|
// to zero.
|
||||||
|
Nodes []*DERPNode
|
||||||
|
}
|
||||||
|
|
||||||
|
// DERPNode describes a DERP packet relay node running within a DERPRegion.
|
||||||
|
type DERPNode struct {
|
||||||
|
// Name is a unique node name (across all regions).
|
||||||
|
// It is not a host name.
|
||||||
|
// It's typically of the form "1b", "2a", "3b", etc. (region
|
||||||
|
// ID + suffix within that region)
|
||||||
|
Name string
|
||||||
|
|
||||||
|
// RegionID is the RegionID of the DERPRegion that this node
|
||||||
|
// is running in.
|
||||||
|
RegionID int
|
||||||
|
|
||||||
|
// HostName is the DERP node's hostname.
|
||||||
|
//
|
||||||
|
// It is required but need not be unique; multiple nodes may
|
||||||
|
// have the same HostName but vary in configuration otherwise.
|
||||||
|
HostName string
|
||||||
|
|
||||||
|
// CertName optionally specifies the expected TLS cert common
|
||||||
|
// name. If empty, HostName is used. If CertName is non-empty,
|
||||||
|
// HostName is only used for the TCP dial (if IPv4/IPv6 are
|
||||||
|
// not present) + TLS ClientHello.
|
||||||
|
CertName string `json:",omitempty"`
|
||||||
|
|
||||||
|
// CertFingerprint, if non-empty, specifies the expected
|
||||||
|
// lowercase hex of the SHA-256 of the TLS server's offered
|
||||||
|
// certificate. If empty, the system default RootCAs are used.
|
||||||
|
CertFingerprint []string `json:",omitempty"`
|
||||||
|
|
||||||
|
// IPv4 optionally forces an IPv4 address to use, instead of using DNS.
|
||||||
|
// If empty, A record(s) from DNS lookups of HostName are used.
|
||||||
|
IPv4 string `json:",omitempty"`
|
||||||
|
|
||||||
|
// IPv6 optionally forces an IPv6 address to use, instead of using DNS.
|
||||||
|
// If empty, AAAA record(s) from DNS lookups of HostName are used.
|
||||||
|
IPv6 string `json:",omitempty"`
|
||||||
|
}
|
Loading…
Reference in New Issue