tailnet

package
v0.27.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 1, 2023 License: AGPL-3.0 Imports: 52 Imported by: 0

Documentation

Index

Constants

View Source
const (
	WorkspaceAgentSSHPort             = 1
	WorkspaceAgentReconnectingPTYPort = 2
	WorkspaceAgentSpeedtestPort       = 3
)
View Source
const LoggerName = "coord"
View Source
const WriteTimeout = time.Second * 5

WriteTimeout is the amount of time we wait to write a node update to a connection before we declare it hung. It is exported so that tests can use it.

Variables

View Source
var ErrMultiAgentClosed = xerrors.New("multiagent is closed")
View Source
var ErrWouldBlock = xerrors.New("would block")

Functions

func CoordinatorHTTPDebug added in v0.15.3

func CoordinatorHTTPDebug(
	agentSocketsMap map[uuid.UUID]Queue,
	agentToConnectionSocketsMap map[uuid.UUID]map[uuid.UUID]Queue,
	agentNameCache *lru.Cache[uuid.UUID, string],
) func(w http.ResponseWriter, _ *http.Request)

func IP

func IP() netip.Addr

IP generates a random IP with a static service prefix.

func IPFromUUID added in v0.26.2

func IPFromUUID(uid uuid.UUID) netip.Addr

IP generates a new IP from a UUID.

func Logger

func Logger(logger slog.Logger) tslogger.Logf

Logger converts the Tailscale logging function to use slog.

func NewDERPMap

func NewDERPMap(ctx context.Context, region *tailcfg.DERPRegion, stunAddrs []string, remoteURL, localPath string, disableSTUN bool) (*tailcfg.DERPMap, error)

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 ServeCoordinator

func ServeCoordinator(conn net.Conn, updateNodes func(node []*Node) error) (func(node *Node), <-chan error)

ServeCoordinator matches the RW structure of a coordinator to exchange node messages.

func WithWebsocketSupport added in v0.18.1

func WithWebsocketSupport(s *derp.Server, base http.Handler) (http.Handler, func())

WithWebsocketSupport returns an http.Handler that upgrades connections to the "derp" subprotocol to WebSockets and passes them to the DERP server. Taken from: https://github.com/tailscale/tailscale/blob/e3211ff88ba85435f70984cf67d9b353f3d650d8/cmd/derper/websocket.go#L21

Types

type Conn

type Conn struct {
	// contains filtered or unexported fields
}

Conn is an actively listening Wireguard connection.

func NewConn

func NewConn(options *Options) (conn *Conn, err error)

NewConn constructs a new Wireguard server that will accept connections from the addresses provided.

func (*Conn) Addresses added in v0.26.2

func (c *Conn) Addresses() []netip.Prefix

func (*Conn) AwaitReachable added in v0.12.7

func (c *Conn) AwaitReachable(ctx context.Context, ip netip.Addr) bool

AwaitReachable pings the provided IP continually until the address is reachable. It's the callers responsibility to provide a timeout, otherwise this function will block forever.

func (*Conn) BlockEndpoints added in v0.25.0

func (c *Conn) BlockEndpoints() bool

BlockEndpoints returns whether or not P2P is blocked.

func (*Conn) Close

func (c *Conn) Close() error

Close shuts down the Wireguard connection.

func (*Conn) Closed

func (c *Conn) Closed() <-chan struct{}

Closed is a channel that ends when the connection has been closed.

func (*Conn) DERPMap added in v0.13.5

func (c *Conn) DERPMap() *tailcfg.DERPMap

DERPMap returns the currently set DERP mapping.

func (*Conn) DialContextTCP

func (c *Conn) DialContextTCP(ctx context.Context, ipp netip.AddrPort) (*gonet.TCPConn, error)

func (*Conn) DialContextUDP

func (c *Conn) DialContextUDP(ctx context.Context, ipp netip.AddrPort) (*gonet.UDPConn, error)

func (*Conn) Listen

func (c *Conn) Listen(network, addr string) (net.Listener, error)

Listen listens for connections only on the Tailscale network.

func (*Conn) MagicsockServeHTTPDebug added in v0.23.1

func (c *Conn) MagicsockServeHTTPDebug(w http.ResponseWriter, r *http.Request)

func (*Conn) Node added in v0.13.5

func (c *Conn) Node() *Node

Node returns the last node that was sent to the node callback.

func (*Conn) NodeAddresses added in v0.18.1

func (c *Conn) NodeAddresses(publicKey key.NodePublic) ([]netip.Prefix, bool)

NodeAddresses returns the addresses of a node from the NetworkMap.

func (*Conn) Ping

Ping sends a Disco ping to the Wireguard engine. The bool returned is true if the ping was performed P2P.

func (*Conn) SetAddresses added in v0.26.2

func (c *Conn) SetAddresses(ips []netip.Prefix) error

func (*Conn) SetBlockEndpoints added in v0.25.0

func (c *Conn) SetBlockEndpoints(blockEndpoints bool)

SetBlockEndpoints sets whether or not to block P2P endpoints. This setting will only apply to new peers.

func (*Conn) SetConnStatsCallback added in v0.17.2

func (c *Conn) SetConnStatsCallback(maxPeriod time.Duration, maxConns int, dump func(start, end time.Time, virtual, physical map[netlogtype.Connection]netlogtype.Counts))

SetConnStatsCallback sets a callback to be called after maxPeriod or maxConns, whichever comes first. Multiple calls overwrites the callback.

func (*Conn) SetDERPMap

func (c *Conn) SetDERPMap(derpMap *tailcfg.DERPMap)

SetDERPMap updates the DERPMap of a connection.

func (*Conn) SetDERPRegionDialer added in v0.20.0

func (c *Conn) SetDERPRegionDialer(dialer func(ctx context.Context, region *tailcfg.DERPRegion) net.Conn)

SetDERPRegionDialer updates the dialer to use for connecting to DERP regions.

func (*Conn) SetNodeCallback

func (c *Conn) SetNodeCallback(callback func(node *Node))

func (*Conn) Status

func (c *Conn) Status() *ipnstate.Status

Status returns the current ipnstate of a connection.

func (*Conn) UpdateNodes

func (c *Conn) UpdateNodes(nodes []*Node, replacePeers bool) error

UpdateNodes connects with a set of peers. This can be constantly updated, and peers will continually be reconnected as necessary. If replacePeers is true, all peers will be removed before adding the new ones.

type Coordinator

type Coordinator interface {
	// ServeHTTPDebug serves a debug webpage that shows the internal state of
	// the coordinator.
	ServeHTTPDebug(w http.ResponseWriter, r *http.Request)
	// Node returns an in-memory node by ID.
	Node(id uuid.UUID) *Node
	// ServeClient accepts a WebSocket connection that wants to connect to an agent
	// with the specified ID.
	ServeClient(conn net.Conn, id uuid.UUID, agent uuid.UUID) error
	// ServeAgent accepts a WebSocket connection to an agent that listens to
	// incoming connections and publishes node updates.
	// Name is just used for debug information. It can be left blank.
	ServeAgent(conn net.Conn, id uuid.UUID, name string) error
	// Close closes the coordinator.
	Close() error

	ServeMultiAgent(id uuid.UUID) MultiAgentConn
}

Coordinator exchanges nodes with agents to establish connections. ┌──────────────────┐ ┌────────────────────┐ ┌───────────────────┐ ┌──────────────────┐ │tailnet.Coordinate├──►│tailnet.AcceptClient│◄─►│tailnet.AcceptAgent│◄──┤tailnet.Coordinate│ └──────────────────┘ └────────────────────┘ └───────────────────┘ └──────────────────┘ Coordinators have different guarantees for HA support.

func NewCoordinator

func NewCoordinator(logger slog.Logger) Coordinator

NewCoordinator constructs a new in-memory connection coordinator. This coordinator is incompatible with multiple Coder replicas as all node data is in-memory.

type MultiAgent added in v0.26.2

type MultiAgent struct {
	ID uuid.UUID

	AgentIsLegacyFunc func(agentID uuid.UUID) bool
	OnSubscribe       func(enq Queue, agent uuid.UUID) (*Node, error)
	OnUnsubscribe     func(enq Queue, agent uuid.UUID) error
	OnNodeUpdate      func(id uuid.UUID, node *Node) error
	OnRemove          func(id uuid.UUID)
	// contains filtered or unexported fields
}

func (*MultiAgent) AgentIsLegacy added in v0.26.2

func (m *MultiAgent) AgentIsLegacy(agentID uuid.UUID) bool

func (*MultiAgent) Close added in v0.26.2

func (m *MultiAgent) Close() error

func (*MultiAgent) CoordinatorClose added in v0.26.2

func (m *MultiAgent) CoordinatorClose() error

func (*MultiAgent) Enqueue added in v0.26.2

func (m *MultiAgent) Enqueue(nodes []*Node) error

func (*MultiAgent) Init added in v0.26.2

func (m *MultiAgent) Init() *MultiAgent

func (*MultiAgent) IsClosed added in v0.26.2

func (m *MultiAgent) IsClosed() bool

func (*MultiAgent) Name added in v0.26.2

func (m *MultiAgent) Name() string

func (*MultiAgent) NextUpdate added in v0.26.2

func (m *MultiAgent) NextUpdate(ctx context.Context) ([]*Node, bool)

func (*MultiAgent) Overwrites added in v0.26.2

func (m *MultiAgent) Overwrites() int64

func (*MultiAgent) Stats added in v0.26.2

func (m *MultiAgent) Stats() (start int64, lastWrite int64)

func (*MultiAgent) SubscribeAgent added in v0.26.2

func (m *MultiAgent) SubscribeAgent(agentID uuid.UUID) error

func (*MultiAgent) UniqueID added in v0.26.2

func (m *MultiAgent) UniqueID() uuid.UUID

func (*MultiAgent) UnsubscribeAgent added in v0.26.2

func (m *MultiAgent) UnsubscribeAgent(agentID uuid.UUID) error

func (*MultiAgent) UpdateSelf added in v0.26.2

func (m *MultiAgent) UpdateSelf(node *Node) error

type MultiAgentConn added in v0.26.2

type MultiAgentConn interface {
	UpdateSelf(node *Node) error
	SubscribeAgent(agentID uuid.UUID) error
	UnsubscribeAgent(agentID uuid.UUID) error
	NextUpdate(ctx context.Context) ([]*Node, bool)
	AgentIsLegacy(agentID uuid.UUID) bool
	Close() error
	IsClosed() bool
}

type Node

type Node struct {
	// ID is used to identify the connection.
	ID tailcfg.NodeID `json:"id"`
	// AsOf is the time the node was created.
	AsOf time.Time `json:"as_of"`
	// Key is the Wireguard public key of the node.
	Key key.NodePublic `json:"key"`
	// DiscoKey is used for discovery messages over DERP to establish
	// peer-to-peer connections.
	DiscoKey key.DiscoPublic `json:"disco"`
	// PreferredDERP is the DERP server that peered connections should meet at
	// to establish.
	PreferredDERP int `json:"preferred_derp"`
	// DERPLatency is the latency in seconds to each DERP server.
	DERPLatency map[string]float64 `json:"derp_latency"`
	// DERPForcedWebsocket contains a mapping of DERP regions to
	// error messages that caused the connection to be forced to
	// use WebSockets. We don't use WebSockets by default because
	// they are less performant.
	DERPForcedWebsocket map[int]string `json:"derp_forced_websockets"`
	// Addresses are the IP address ranges this connection exposes.
	Addresses []netip.Prefix `json:"addresses"`
	// AllowedIPs specify what addresses can dial the connection. We allow all
	// by default.
	AllowedIPs []netip.Prefix `json:"allowed_ips"`
	// Endpoints are ip:port combinations that can be used to establish
	// peer-to-peer connections.
	Endpoints []string `json:"endpoints"`
}

Node represents a node in the network.

type Options

type Options struct {
	Addresses  []netip.Prefix
	DERPMap    *tailcfg.DERPMap
	DERPHeader *http.Header

	// BlockEndpoints specifies whether P2P endpoints are blocked.
	// If so, only DERPs can establish connections.
	BlockEndpoints bool
	Logger         slog.Logger
	ListenPort     uint16
}

type Queue added in v0.26.2

type Queue interface {
	UniqueID() uuid.UUID
	Enqueue(n []*Node) error
	Name() string
	Stats() (start, lastWrite int64)
	Overwrites() int64
	// CoordinatorClose is used by the coordinator when closing a Queue. It
	// should skip removing itself from the coordinator.
	CoordinatorClose() error
	Close() error
}

type TrackedConn added in v0.15.3

type TrackedConn struct {
	// contains filtered or unexported fields
}

func NewTrackedConn added in v0.23.1

func NewTrackedConn(ctx context.Context, cancel func(), conn net.Conn, id uuid.UUID, logger slog.Logger, overwrites int64) *TrackedConn

func (*TrackedConn) Close added in v0.23.1

func (t *TrackedConn) Close() error

Close the connection and cancel the context for reading node updates from the queue

func (*TrackedConn) CoordinatorClose added in v0.26.2

func (t *TrackedConn) CoordinatorClose() error

func (*TrackedConn) Enqueue added in v0.23.1

func (t *TrackedConn) Enqueue(n []*Node) (err error)

func (*TrackedConn) Name added in v0.15.3

func (t *TrackedConn) Name() string

func (*TrackedConn) Overwrites added in v0.15.3

func (t *TrackedConn) Overwrites() int64

func (*TrackedConn) SendUpdates added in v0.23.1

func (t *TrackedConn) SendUpdates()

SendUpdates reads node updates and writes them to the connection. Ends when writes hit an error or context is canceled.

func (*TrackedConn) Stats added in v0.26.2

func (t *TrackedConn) Stats() (start, lastWrite int64)

func (*TrackedConn) UniqueID added in v0.26.2

func (t *TrackedConn) UniqueID() uuid.UUID

Directories

Path Synopsis
Package tailnettest is a generated GoMock package.
Package tailnettest is a generated GoMock package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL