tailnet
packageThis package is not in the latest version of its module.
Details
Validgo.mod file
The Go module system was introduced in Go 1.11 and is the official dependency management solution for Go.
Redistributable license
Redistributable licenses place minimal restrictions on how software can be used, modified, and redistributed.
Tagged version
Modules with tagged versions give importers more predictable builds.
Stable version
When a project reaches major version v1 it is considered stable.
- Learn more about best practices
Repository
Links
Documentation¶
Index¶
- Constants
- Variables
- func CompareDERPMaps(a *tailcfg.DERPMap, b *tailcfg.DERPMap) bool
- func DERPMapFromProto(derpMap *proto.DERPMap) *tailcfg.DERPMap
- func DERPMapToProto(derpMap *tailcfg.DERPMap) *proto.DERPMap
- func DERPNodeFromProto(node *proto.DERPMap_Region_Node) *tailcfg.DERPNode
- func DERPNodeToProto(node *tailcfg.DERPNode) *proto.DERPMap_Region_Node
- func DERPRegionFromProto(region *proto.DERPMap_Region) *tailcfg.DERPRegion
- func DERPRegionToProto(region *tailcfg.DERPRegion) *proto.DERPMap_Region
- func IsDRPCUnimplementedError(err error) bool
- func Logger(logger interface{ ... }) tslogger.Logf
- func NewDERPMap(ctx context.Context, region *tailcfg.DERPRegion, stunAddrs []string, ...) (*tailcfg.DERPMap, error)
- func NewDRPCClient(conn net.Conn, logger slog.Logger) (proto.DRPCTailnetClient, error)
- func NodeID(uid uuid.UUID) tailcfg.NodeID
- func NodeToProto(n *Node) (*proto.Node, error)
- func RecvCtx[A any](ctx context.Context, c <-chan A) (a A, err error)
- func STUNRegions(baseRegionID int, stunAddrs []string) ([]*tailcfg.DERPRegion, error)
- func SendCtx[A any](ctx context.Context, c chan<- A, a A) (err error)
- func SingleNodeUpdate(id uuid.UUID, node *Node, reason string) (*proto.CoordinateResponse, error)
- func UUIDToByteSlice(u uuid.UUID) []byte
- func WithStreamID(ctx context.Context, streamID StreamID) context.Context
- func WithWebsocketSupport(s *derp.Server, base http.Handler) (http.Handler, func())
- func WorkspaceStatusToProto(status codersdk.WorkspaceStatus) proto.Workspace_Status
- type Agent
- type AgentCoordinateeAuth
- type AuthorizationError
- type BasicCoordination
- type BasicCoordinationController
- type BasicTelemetryController
- type ClientCoordinateeAuth
- type ClientService
- type ClientServiceOptions
- type ClientUserCoordinateeAuth
- type CloserWaiter
- type Conn
- func (c *Conn) AwaitReachable(ctx context.Context, ip netip.Addr) bool
- func (c *Conn) Close() error
- func (c *Conn) Closed() <-chan struct{}
- func (c *Conn) DERPMap() *tailcfg.DERPMap
- func (c *Conn) DialContextTCP(ctx context.Context, ipp netip.AddrPort) (*gonet.TCPConn, error)
- func (c *Conn) DialContextUDP(ctx context.Context, ipp netip.AddrPort) (*gonet.UDPConn, error)
- func (c *Conn) GetBlockEndpoints() bool
- func (c *Conn) GetKnownPeerIDs() []uuid.UUID
- func (c *Conn) GetNetInfo() *tailcfg.NetInfo
- func (c *Conn) GetPeerDiagnostics(peerID uuid.UUID) PeerDiagnostics
- func (c *Conn) InstallCaptureHook(f capture.Callback)
- func (c *Conn) Listen(network, addr string) (net.Listener, error)
- func (c *Conn) MagicsockServeHTTPDebug(w http.ResponseWriter, r *http.Request)
- func (c *Conn) MagicsockSetDebugLoggingEnabled(enabled bool)
- func (c *Conn) Node() *Node
- func (c *Conn) NodeAddresses(publicKey key.NodePublic) ([]netip.Prefix, bool)
- func (c *Conn) Ping(ctx context.Context, ip netip.Addr) (time.Duration, bool, *ipnstate.PingResult, error)
- func (c *Conn) SendConnectedTelemetry(ip netip.Addr, application string)
- func (c *Conn) SendDisconnectedTelemetry()
- func (c *Conn) SendSpeedtestTelemetry(throughputMbits float64)
- func (c *Conn) SetAddresses(ips []netip.Prefix) error
- func (c *Conn) SetAllPeersLost()
- func (c *Conn) SetBlockEndpoints(blockEndpoints bool)
- func (c *Conn) SetConnStatsCallback(maxPeriod time.Duration, maxConns int, dump func(start, end time.Time, ...))
- func (c *Conn) SetDERPForceWebSockets(v bool)
- func (c *Conn) SetDERPMap(derpMap *tailcfg.DERPMap)
- func (c *Conn) SetDERPRegionDialer(dialer func(ctx context.Context, region *tailcfg.DERPRegion) net.Conn)
- func (c *Conn) SetDNSHosts(hosts map[dnsname.FQDN][]netip.Addr) error
- func (c *Conn) SetNodeCallback(callback func(node *Node))
- func (c *Conn) SetTunnelDestination(id uuid.UUID)
- func (c *Conn) Status() *ipnstate.Status
- func (c *Conn) UpdatePeers(updates []*proto.CoordinateResponse_PeerUpdate) error
- type ControlProtocolClients
- type ControlProtocolDialer
- type Controller
- type ControllerOpt
- type Coordinatee
- type CoordinateeAuth
- type CoordinationController
- type Coordinator
- type CoordinatorClient
- type CoordinatorV2
- type DERPClient
- type DERPController
- type DERPFromDRPCWrapper
- type DERPMapSetter
- type DNSHostsSetter
- type DNSNameOptions
- type DRPCService
- func (s *DRPCService) Coordinate(stream proto.DRPCTailnet_CoordinateStream) error
- func (s *DRPCService) PostTelemetry(_ context.Context, req *proto.TelemetryRequest) (*proto.TelemetryResponse, error)
- func (s *DRPCService) RefreshResumeToken(ctx context.Context, _ *proto.RefreshResumeTokenRequest) (*proto.RefreshResumeTokenResponse, error)
- func (s *DRPCService) StreamDERPMaps(_ *proto.StreamDERPMapsRequest, stream proto.DRPCTailnet_StreamDERPMapsStream) error
- func (s *DRPCService) WorkspaceUpdates(req *proto.WorkspaceUpdatesRequest, ...) error
- type HTMLDebug
- type HTMLPeer
- type HTMLTunnel
- type InvalidAddressBitsError
- type InvalidNodeAddressError
- type NetworkTelemetryBatcher
- type Node
- type Options
- type PeerDiagnostics
- type ResumeTokenClient
- type ResumeTokenController
- type ResumeTokenKeyProvider
- type ResumeTokenProvider
- type ResumeTokenSigningKey
- type ServicePrefix
- type SingleTailnetCoordinateeAuth
- type StreamID
- type Subscription
- type TelemetryClient
- type TelemetryController
- type TelemetrySink
- type TelemetryStore
- type TunnelAllOption
- type TunnelAllWorkspaceUpdatesController
- type TunnelAuthorizer
- type TunnelSrcCoordController
- type UpdateKind
- type UpdatesHandler
- type Workspace
- type WorkspaceUpdate
- type WorkspaceUpdatesClient
- type WorkspaceUpdatesController
- type WorkspaceUpdatesProvider
Constants¶
const (CoderDNSSuffix = "coder"CoderDNSSuffixFQDN =dnsname.FQDN(CoderDNSSuffix + "."))
CoderDNSSuffix is the default DNS suffix that we append to Coder DNSrecords.
const (WorkspaceAgentSSHPort = 1WorkspaceAgentReconnectingPTYPort = 2WorkspaceAgentSpeedtestPort = 3WorkspaceAgentStandardSSHPort = 22)
const (// ResponseBufferSize is the max number of responses to buffer per connection before we start// dropping updatesResponseBufferSize = 512// RequestBufferSize is the max number of requests to buffer per connectionRequestBufferSize = 32CloseErrOverwritten = "peer ID overwritten by new connection"CloseErrCoordinatorClose = "coordinator closed"ReadyForHandshakeError = "ready for handshake error")
const (TelemetryApplicationSSHstring = "ssh"TelemetryApplicationSpeedteststring = "speedtest"TelemetryApplicationVSCodestring = "vscode")
const (DefaultResumeTokenExpiry = 24 *time.Hour)
const DisableSTUN = "disable"
const EnvMagicsockDebugLogging = "CODER_MAGICSOCK_DEBUG_LOGGING"
EnvMagicsockDebugLogging enables super-verbose logging for the magicsockinternals. A logger must be supplied to the connection with the debug levelenabled.
With this disabled, you still get a lot of output if you have a valid loggerwith the debug level enabled.
const IsCoderConnectEnabledFmtString = "is.coder--connect--enabled--right--now.%s."
A FQDN to be mapped to `tsaddr.CoderServiceIPv6`. This address can be usedwhen you want to know if Coder Connect is running, but are not trying toconnect to a specific known workspace.
const LoggerName = "coord"
Variables¶
var (ErrClosed =xerrors.New("coordinator is closed")ErrWouldBlock =xerrors.New("would block")ErrAlreadyRemoved =xerrors.New("already removed"))
var ErrConnClosed =xerrors.New("connection closed")
var ErrUnsupportedVersion =xerrors.New("unsupported version")
Functions¶
funcCompareDERPMaps¶
CompareDERPMaps returns true if the given DERPMaps are equivalent. Orderingof slices is ignored.
If the first map is nil, the second map must also be nil for them to beconsidered equivalent. If the second map is nil, the first map can be anyvalue and the function will return true.
funcDERPNodeFromProto¶added inv2.6.0
func DERPNodeFromProto(node *proto.DERPMap_Region_Node) *tailcfg.DERPNode
funcDERPNodeToProto¶added inv2.6.0
func DERPNodeToProto(node *tailcfg.DERPNode) *proto.DERPMap_Region_Node
funcDERPRegionFromProto¶added inv2.6.0
func DERPRegionFromProto(region *proto.DERPMap_Region) *tailcfg.DERPRegion
funcDERPRegionToProto¶added inv2.6.0
func DERPRegionToProto(region *tailcfg.DERPRegion) *proto.DERPMap_Region
funcIsDRPCUnimplementedError¶added inv2.18.0
IsDRPCUnimplementedError returns true if the error indicates the RPC called is not implementedby the server.
funcNewDERPMap¶
func NewDERPMap(ctxcontext.Context, region *tailcfg.DERPRegion, stunAddrs []string, remoteURL, localPathstring, disableSTUNbool) (*tailcfg.DERPMap,error)
NewDERPMap constructs a DERPMap from a set of STUN addresses and optionally a remoteURL to fetch a mapping from e.g.https://controlplane.tailscale.com/derpmap/default.
funcNewDRPCClient¶added inv2.6.0
funcNodeID¶
NodeID creates a Tailscale NodeID from the last 8 bytes of a UUID. It ensuresthe returned NodeID is always positive.
funcSTUNRegions¶
func STUNRegions(baseRegionIDint, stunAddrs []string) ([]*tailcfg.DERPRegion,error)
funcSingleNodeUpdate¶added inv2.4.0
funcUUIDToByteSlice¶added inv2.4.0
funcWithStreamID¶added inv2.6.0
funcWithWebsocketSupport¶
WithWebsocketSupport returns an http.Handler that upgradesconnections to the "derp" subprotocol to WebSockets andpasses them to the DERP server.Taken from:https://github.com/tailscale/tailscale/blob/e3211ff88ba85435f70984cf67d9b353f3d650d8/cmd/derper/websocket.go#L21
funcWorkspaceStatusToProto¶added inv2.18.0
func WorkspaceStatusToProto(statuscodersdk.WorkspaceStatus)proto.Workspace_Status
Types¶
typeAgentCoordinateeAuth¶added inv2.9.0
AgentCoordinateeAuth disallows all tunnels, since agents are not allowed to initiate their own tunnels
func (AgentCoordinateeAuth)Authorize¶added inv2.9.0
func (aAgentCoordinateeAuth) Authorize(_context.Context, req *proto.CoordinateRequest)error
typeAuthorizationError¶added inv2.22.0
type AuthorizationError struct {Wrappederror}
func (AuthorizationError)Error¶added inv2.22.0
func (eAuthorizationError) Error()string
func (AuthorizationError)Unwrap¶added inv2.22.0
func (eAuthorizationError) Unwrap()error
typeBasicCoordination¶added inv2.18.0
type BasicCoordination struct {sync.MutexClientCoordinatorClient// contains filtered or unexported fields}
BasicCoordination handles:
1. Sending local node updates to the control plane2. Reading remote updates from the control plane and programming them into the Coordinatee.
It does *not* handle adding any Tunnels, but these can be handled by composingBasicCoordinationController with a more advanced controller.
func (*BasicCoordination)Close¶added inv2.18.0
func (c *BasicCoordination) Close(ctxcontext.Context) (retErrerror)
Close the coordination gracefully. If the context expires before the remote API server has hungup on us, we forcibly close the Client connection.
func (*BasicCoordination)SendErr¶added inv2.18.0
func (c *BasicCoordination) SendErr(errerror)
SendErr is not part of the CloserWaiter interface, and is intended to be called internally, orby Controllers that use BasicCoordinationController in composition. It triggers Wait() toreport the error if an error has not already been reported.
func (*BasicCoordination)Wait¶added inv2.18.0
func (c *BasicCoordination) Wait() <-chanerror
Wait for the Coordination to complete
typeBasicCoordinationController¶added inv2.18.0
type BasicCoordinationController struct {Loggerslog.LoggerCoordinateeCoordinateeSendAcksbool}
BasicCoordinationController handles the basic coordination operations common to all types oftailnet consumers:
- sending local node updates to the Coordinator
- receiving peer node updates and programming them into the Coordinatee (e.g. tailnet.Conn)
- (optionally) sending ReadyToHandshake acknowledgements for peer updates.
It is designed to be used on its own, or composed into more advanced CoordinationControllers.
func (*BasicCoordinationController)New¶added inv2.18.0
func (c *BasicCoordinationController) New(clientCoordinatorClient)CloserWaiter
New satisfies the method on the CoordinationController interface
func (*BasicCoordinationController)NewCoordination¶added inv2.18.0
func (c *BasicCoordinationController) NewCoordination(clientCoordinatorClient) *BasicCoordination
NewCoordination creates a BasicCoordination
typeBasicTelemetryController¶added inv2.18.0
funcNewBasicTelemetryController¶added inv2.18.0
func NewBasicTelemetryController(loggerslog.Logger) *BasicTelemetryController
func (*BasicTelemetryController)New¶added inv2.18.0
func (b *BasicTelemetryController) New(clientTelemetryClient)
func (*BasicTelemetryController)SendTelemetryEvent¶added inv2.18.0
func (b *BasicTelemetryController) SendTelemetryEvent(event *proto.TelemetryEvent)
typeClientCoordinateeAuth¶added inv2.9.0
ClientCoordinateeAuth allows connecting to a single, given agent
func (ClientCoordinateeAuth)Authorize¶added inv2.9.0
func (cClientCoordinateeAuth) Authorize(_context.Context, req *proto.CoordinateRequest)error
typeClientService¶added inv2.6.0
type ClientService struct {Loggerslog.LoggerCoordPtr *atomic.Pointer[Coordinator]// contains filtered or unexported fields}
ClientService is a tailnet coordination service that accepts a connection and version from atailnet client, and support versions 2.x of the Tailnet API protocol.
funcNewClientService¶added inv2.6.0
func NewClientService(optionsClientServiceOptions) (*ClientService,error,)
NewClientService returns a ClientService based on the given Coordinator pointer. The pointer isloaded on each processed connection.
func (*ClientService)ServeClient¶added inv2.6.0
func (ClientService)ServeConnV2¶added inv2.7.0
typeClientServiceOptions¶added inv2.14.0
type ClientServiceOptions struct {Loggerslog.LoggerCoordPtr *atomic.Pointer[Coordinator]DERPMapUpdateFrequencytime.DurationDERPMapFn func() *tailcfg.DERPMapNetworkTelemetryHandler func(batch []*proto.TelemetryEvent)ResumeTokenProviderResumeTokenProviderWorkspaceUpdatesProviderWorkspaceUpdatesProvider}
typeClientUserCoordinateeAuth¶added inv2.18.0
type ClientUserCoordinateeAuth struct {AuthTunnelAuthorizer}
func (ClientUserCoordinateeAuth)Authorize¶added inv2.18.0
func (aClientUserCoordinateeAuth) Authorize(ctxcontext.Context, req *proto.CoordinateRequest)error
typeCloserWaiter¶added inv2.18.0
typeConn¶
type Conn struct {// contains filtered or unexported fields}
Conn is an actively listening Wireguard connection.
funcNewConn¶
NewConn constructs a new Wireguard server that will accept connections from the addresses provided.
func (*Conn)AwaitReachable¶
AwaitReachable pings the provided IP continually until theaddress is reachable. It's the callers responsibility to providea timeout, otherwise this function will block forever.
func (*Conn)Closed¶
func (c *Conn) Closed() <-chan struct{}
Closed is a channel that ends when the connection hasbeen closed.
func (*Conn)DialContextTCP¶
func (*Conn)DialContextUDP¶
func (*Conn)GetBlockEndpoints¶added inv2.9.0
func (*Conn)GetKnownPeerIDs¶added inv2.15.0
func (*Conn)GetNetInfo¶added inv2.15.0
func (*Conn)GetPeerDiagnostics¶added inv2.9.0
func (c *Conn) GetPeerDiagnostics(peerIDuuid.UUID)PeerDiagnostics
func (*Conn)InstallCaptureHook¶added inv2.8.0
func (*Conn)MagicsockServeHTTPDebug¶
func (c *Conn) MagicsockServeHTTPDebug(whttp.ResponseWriter, r *http.Request)
func (*Conn)MagicsockSetDebugLoggingEnabled¶
func (*Conn)NodeAddresses¶
NodeAddresses returns the addresses of a node from the NetworkMap.
func (*Conn)Ping¶
func (c *Conn) Ping(ctxcontext.Context, ipnetip.Addr) (time.Duration,bool, *ipnstate.PingResult,error)
Ping sends a ping to the Wireguard engine.The bool returned is true if the ping was performed P2P.
func (*Conn)SendConnectedTelemetry¶added inv2.14.0
SendConnectedTelemetry should be called when connection to a peer with the given IP is established.
func (*Conn)SendDisconnectedTelemetry¶added inv2.14.0
func (c *Conn) SendDisconnectedTelemetry()
func (*Conn)SendSpeedtestTelemetry¶added inv2.14.0
func (*Conn)SetAllPeersLost¶added inv2.7.1
func (c *Conn) SetAllPeersLost()
SetAllPeersLost marks all peers lost; typically used when we disconnect from a coordinator.
func (*Conn)SetBlockEndpoints¶
SetBlockEndpoints sets whether to block P2P endpoints. This settingwill only apply to new peers.
func (*Conn)SetConnStatsCallback¶
func (c *Conn) SetConnStatsCallback(maxPeriodtime.Duration, maxConnsint, dump func(start, endtime.Time, virtual, physical map[netlogtype.Connection]netlogtype.Counts))
SetConnStatsCallback sets a callback to be called after maxPeriod ormaxConns, whichever comes first. Multiple calls overwrites the callback.
func (*Conn)SetDERPForceWebSockets¶added inv2.1.3
func (*Conn)SetDERPMap¶
SetDERPMap updates the DERPMap of a connection.
func (*Conn)SetDERPRegionDialer¶
func (c *Conn) SetDERPRegionDialer(dialer func(ctxcontext.Context, region *tailcfg.DERPRegion)net.Conn)
SetDERPRegionDialer updates the dialer to use for connecting to DERP regions.
func (*Conn)SetDNSHosts¶added inv2.18.0
SetDNSHosts replaces the map of DNS hosts for the connection.
func (*Conn)SetNodeCallback¶
func (*Conn)SetTunnelDestination¶added inv2.11.0
func (*Conn)UpdatePeers¶added inv2.7.1
func (c *Conn) UpdatePeers(updates []*proto.CoordinateResponse_PeerUpdate)error
UpdatePeers connects with a set of peers. This can be constantly updated,and peers will continually be reconnected as necessary.
typeControlProtocolClients¶added inv2.18.0
type ControlProtocolClients struct {Closerio.CloserCoordinatorCoordinatorClientDERPDERPClientResumeTokenResumeTokenClientTelemetryTelemetryClientWorkspaceUpdatesWorkspaceUpdatesClient}
ControlProtocolClients represents an abstract interface to the tailnet control plane via a setof protocol clients. The Closer should close all the clients (e.g. by closing the underlyingconnection).
typeControlProtocolDialer¶added inv2.18.0
type ControlProtocolDialer interface {// Dial connects to the tailnet control plane and returns clients for the different control// sub-protocols (coordination, DERP maps, resume tokens, and telemetry). If the// ResumeTokenController is not nil, the dialer should query for a resume token and use it to// dial, if available.Dial(ctxcontext.Context, rResumeTokenController) (ControlProtocolClients,error)}
typeController¶added inv2.18.0
type Controller struct {DialerControlProtocolDialerCoordCtrlCoordinationControllerDERPCtrlDERPControllerResumeTokenCtrlResumeTokenControllerTelemetryCtrlTelemetryControllerWorkspaceUpdatesCtrlWorkspaceUpdatesController// contains filtered or unexported fields}
A Controller connects to the tailnet control plane, and then uses the control protocols toprogram a tailnet.Conn in production (in test it could be an interface simulating the Conn). Itdelegates this task to sub-controllers responsible for the main areas of the tailnet controlprotocol: coordination, DERP map updates, resume tokens, telemetry, and workspace updates.
funcNewController¶added inv2.18.0
func NewController(loggerslog.Logger, dialerControlProtocolDialer, opts ...ControllerOpt) *Controller
NewController creates a new Controller without running it
func (*Controller)Closed¶added inv2.18.0
func (c *Controller) Closed() <-chan struct{}
func (*Controller)Run¶added inv2.18.0
func (c *Controller) Run(ctxcontext.Context)
Run dials the API and uses it with the provided controllers.
typeControllerOpt¶added inv2.18.0
type ControllerOpt func(*Controller)
funcWithGracefulTimeout¶added inv2.18.0
func WithGracefulTimeout(timeouttime.Duration)ControllerOpt
funcWithTestClock¶added inv2.18.0
func WithTestClock(clockquartz.Clock)ControllerOpt
typeCoordinatee¶added inv2.7.1
type Coordinatee interface {UpdatePeers([]*proto.CoordinateResponse_PeerUpdate)errorSetAllPeersLost()SetNodeCallback(func(*Node))// SetTunnelDestination indicates to tailnet that the peer id is a// destination.SetTunnelDestination(iduuid.UUID)}
Coordinatee is something that can be coordinated over the Coordinate protocol. Usually this is aConn.
typeCoordinateeAuth¶added inv2.9.0
type CoordinateeAuth interface {Authorize(ctxcontext.Context, req *proto.CoordinateRequest)error}
typeCoordinationController¶added inv2.18.0
type CoordinationController interface {New(CoordinatorClient)CloserWaiter}
A CoordinationController accepts connections to the control plane, and handles the Coordinationprotocol on behalf of some Coordinatee (tailnet.Conn in production). This is the "glue" codebetween them.
funcNewAgentCoordinationController¶added inv2.18.0
func NewAgentCoordinationController(loggerslog.Logger, coordinateeCoordinatee,)CoordinationController
NewAgentCoordinationController creates a CoordinationController for Coder Agents, which nevercreate tunnels and always send ReadyToHandshake acknowledgements.
typeCoordinator¶
type Coordinator interface {CoordinatorV2}
Coordinator exchanges nodes with agents to establish connections.┌──────────────────┐ ┌────────────────────┐ ┌───────────────────┐ ┌──────────────────┐│tailnet.Coordinate├──►│tailnet.AcceptClient│◄─►│tailnet.AcceptAgent│◄──┤tailnet.Coordinate│└──────────────────┘ └────────────────────┘ └───────────────────┘ └──────────────────┘Coordinators have different guarantees for HA support.
funcNewCoordinator¶
func NewCoordinator(loggerslog.Logger)Coordinator
NewCoordinator constructs a new in-memory connection coordinator. Thiscoordinator is incompatible with multiple Coder replicas as all node data isin-memory.
typeCoordinatorClient¶added inv2.18.0
type CoordinatorClient interface {Close()errorSend(*proto.CoordinateRequest)errorRecv() (*proto.CoordinateResponse,error)}
CoordinatorClient is an abstraction of the Coordinator's control protocol interface from theperspective of a protocol client (i.e. the Coder Agent is also a client of this interface).
funcNewInMemoryCoordinatorClient¶added inv2.18.0
func NewInMemoryCoordinatorClient(loggerslog.Logger,clientIDuuid.UUID,authCoordinateeAuth,coordinatorCoordinator,)CoordinatorClient
NewInMemoryCoordinatorClient creates a coordination client that uses channels to connect to alocal Coordinator. (The typical alternative is a DRPC-based client.)
typeCoordinatorV2¶added inv2.5.0
type CoordinatorV2 interface {// ServeHTTPDebug serves a debug webpage that shows the internal state of// the coordinator.ServeHTTPDebug(whttp.ResponseWriter, r *http.Request)// Node returns a node by peer ID, if known to the coordinator. Returns nil if unknown.Node(iduuid.UUID) *NodeClose()errorCoordinate(ctxcontext.Context, iduuid.UUID, namestring, aCoordinateeAuth) (chan<- *proto.CoordinateRequest, <-chan *proto.CoordinateResponse)}
CoordinatorV2 is the interface for interacting with the coordinator via the 2.0 tailnet API.
typeDERPClient¶added inv2.18.0
DERPClient is an abstraction of the stream of DERPMap updates from the control plane.
typeDERPController¶added inv2.18.0
type DERPController interface {New(DERPClient)CloserWaiter}
A DERPController accepts connections to the control plane, and handles the DERPMap updatesdelivered over them by programming the data plane (tailnet.Conn or some test interface).
funcNewBasicDERPController¶added inv2.18.0
func NewBasicDERPController(loggerslog.Logger, setterDERPMapSetter)DERPController
typeDERPFromDRPCWrapper¶added inv2.18.0
type DERPFromDRPCWrapper struct {Clientproto.DRPCTailnet_StreamDERPMapsClient}
func (*DERPFromDRPCWrapper)Close¶added inv2.18.0
func (w *DERPFromDRPCWrapper) Close()error
typeDERPMapSetter¶added inv2.18.0
typeDNSHostsSetter¶added inv2.18.0
DNSHostsSetter is something that you can set a mapping of DNS names to IPs on. It's the subsetof the tailnet.Conn that we use to configure DNS records.
typeDNSNameOptions¶added inv2.22.0
type DNSNameOptions struct {Suffixstring}
typeDRPCService¶added inv2.6.0
type DRPCService struct {CoordPtr *atomic.Pointer[Coordinator]Loggerslog.LoggerDerpMapUpdateFrequencytime.DurationDerpMapFn func() *tailcfg.DERPMapNetworkTelemetryHandler func(batch []*proto.TelemetryEvent)ResumeTokenProviderResumeTokenProviderWorkspaceUpdatesProviderWorkspaceUpdatesProvider}
DRPCService is the dRPC-based, version 2.x of the tailnet API and implements proto.DRPCClientServer
func (*DRPCService)Coordinate¶added inv2.7.0
func (s *DRPCService) Coordinate(streamproto.DRPCTailnet_CoordinateStream)error
func (*DRPCService)PostTelemetry¶added inv2.13.0
func (s *DRPCService) PostTelemetry(_context.Context, req *proto.TelemetryRequest) (*proto.TelemetryResponse,error)
func (*DRPCService)RefreshResumeToken¶added inv2.15.0
func (s *DRPCService) RefreshResumeToken(ctxcontext.Context, _ *proto.RefreshResumeTokenRequest) (*proto.RefreshResumeTokenResponse,error)
func (*DRPCService)StreamDERPMaps¶added inv2.6.0
func (s *DRPCService) StreamDERPMaps(_ *proto.StreamDERPMapsRequest, streamproto.DRPCTailnet_StreamDERPMapsStream)error
func (*DRPCService)WorkspaceUpdates¶added inv2.18.0
func (s *DRPCService) WorkspaceUpdates(req *proto.WorkspaceUpdatesRequest, streamproto.DRPCTailnet_WorkspaceUpdatesStream)error
typeHTMLDebug¶
type HTMLDebug struct {Peers []HTMLPeerTunnels []HTMLTunnel}
typeHTMLTunnel¶added inv2.5.0
typeInvalidAddressBitsError¶added inv2.22.0
type InvalidAddressBitsError struct {Bitsint}
func (InvalidAddressBitsError)Error¶added inv2.22.0
func (eInvalidAddressBitsError) Error()string
typeInvalidNodeAddressError¶added inv2.22.0
type InvalidNodeAddressError struct {Addrstring}
func (InvalidNodeAddressError)Error¶added inv2.22.0
func (eInvalidNodeAddressError) Error()string
typeNetworkTelemetryBatcher¶added inv2.14.0
type NetworkTelemetryBatcher struct {// contains filtered or unexported fields}
funcNewNetworkTelemetryBatcher¶added inv2.14.0
func NewNetworkTelemetryBatcher(clkquartz.Clock, frequencytime.Duration, maxSizeint, batchFn func(batch []*proto.TelemetryEvent)) *NetworkTelemetryBatcher
func (*NetworkTelemetryBatcher)Close¶added inv2.14.0
func (b *NetworkTelemetryBatcher) Close()error
func (*NetworkTelemetryBatcher)Handler¶added inv2.14.0
func (b *NetworkTelemetryBatcher) Handler(events []*proto.TelemetryEvent)
typeNode¶
type Node struct {// ID is used to identify the connection.IDtailcfg.NodeID `json:"id"`// AsOf is the time the node was created.AsOftime.Time `json:"as_of"`// Key is the Wireguard public key of the node.Keykey.NodePublic `json:"key"`// DiscoKey is used for discovery messages over DERP to establish// peer-to-peer connections.DiscoKeykey.DiscoPublic `json:"disco"`// PreferredDERP is the DERP server that peered connections should meet at// to establish.PreferredDERPint `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.
funcOnlyNodeUpdates¶added inv2.4.0
func OnlyNodeUpdates(resp *proto.CoordinateResponse) ([]*Node,error)
typeOptions¶
type Options struct {IDuuid.UUIDAddresses []netip.PrefixDERPMap *tailcfg.DERPMapDERPHeader *http.Header// DERPForceWebSockets determines whether websockets is always used for DERP// connections, rather than trying `Upgrade: derp` first and potentially// falling back. This is useful for misbehaving proxies that prevent// fallback due to odd behavior, like Azure App Proxy.DERPForceWebSocketsbool// BlockEndpoints specifies whether P2P endpoints are blocked.// If so, only DERPs can establish connections.BlockEndpointsboolLoggerslog.LoggerListenPortuint16// CaptureHook is a callback that captures Disco packets and packets sent// into the tailnet tunnel.CaptureHookcapture.Callback// ForceNetworkUp forces the network to be considered up. magicsock will not// do anything if it thinks it can't reach the internet.ForceNetworkUpbool// Network Telemetry Client Type: CLI | Agent | coderdClientTypeproto.TelemetryEvent_ClientType// TelemetrySink is optional.TelemetrySinkTelemetrySink// DNSConfigurator is optional, and is passed to the underlying wireguard// engine.DNSConfiguratordns.OSConfigurator// Router is optional, and is passed to the underlying wireguard engine.Routerrouter.Router// TUNDev is optional, and is passed to the underlying wireguard engine.TUNDevtun.Device// WireguardMonitor is optional, and is passed to the underlying wireguard// engine.WireguardMonitor *netmon.Monitor// DNSMatchDomain is the DNS suffix to use as a match domain. Only relevant for TUN connections that configure the// OS DNS resolver.DNSMatchDomainstring}
typePeerDiagnostics¶added inv2.9.0
type PeerDiagnostics struct {// PreferredDERP is 0 if we are not connected to a DERP region. If non-zero, we are connected to// the given region as our home or "preferred" DERP.PreferredDERPintDERPRegionNames map[int]string// SentNode is true if we have successfully transmitted our local Node via the most recently set// NodeCallback.SentNodebool// ReceivedNode is the last Node we received for the peer, or nil if we haven't received the node.ReceivedNode *tailcfg.Node// LastWireguardHandshake is the last time we completed a wireguard handshakeLastWireguardHandshaketime.Time}
PeerDiagnostics is a checklist of human-readable conditions necessary to establish an encryptedtunnel to a peer via a Conn
typeResumeTokenClient¶added inv2.18.0
type ResumeTokenClient interface {RefreshResumeToken(ctxcontext.Context, in *proto.RefreshResumeTokenRequest) (*proto.RefreshResumeTokenResponse,error)}
typeResumeTokenController¶added inv2.18.0
type ResumeTokenController interface {New(ResumeTokenClient)CloserWaiterToken() (string,bool)}
funcNewBasicResumeTokenController¶added inv2.18.0
func NewBasicResumeTokenController(loggerslog.Logger, clockquartz.Clock)ResumeTokenController
typeResumeTokenKeyProvider¶added inv2.15.0
type ResumeTokenKeyProvider struct {// contains filtered or unexported fields}
func (ResumeTokenKeyProvider)GenerateResumeToken¶added inv2.15.0
func (pResumeTokenKeyProvider) GenerateResumeToken(ctxcontext.Context, peerIDuuid.UUID) (*proto.RefreshResumeTokenResponse,error)
func (ResumeTokenKeyProvider)VerifyResumeToken¶added inv2.15.0
VerifyResumeToken parses a signed tailnet resume token with the given key andreturns the payload. If the token is invalid or expired, an error isreturned.
typeResumeTokenProvider¶added inv2.15.0
type ResumeTokenProvider interface {GenerateResumeToken(ctxcontext.Context, peerIDuuid.UUID) (*proto.RefreshResumeTokenResponse,error)VerifyResumeToken(ctxcontext.Context, tokenstring) (uuid.UUID,error)}
funcNewInsecureTestResumeTokenProvider¶added inv2.15.0
func NewInsecureTestResumeTokenProvider()ResumeTokenProvider
NewInsecureTestResumeTokenProvider returns a ResumeTokenProvider that uses arandom key with short expiry for testing purposes. If any errors occur whilegenerating the key, the function panics.
funcNewResumeTokenKeyProvider¶added inv2.15.0
func NewResumeTokenKeyProvider(keyjwtutils.SigningKeyManager, clockquartz.Clock, expirytime.Duration)ResumeTokenProvider
typeResumeTokenSigningKey¶added inv2.15.0
type ResumeTokenSigningKey [64]byte
funcGenerateResumeTokenSigningKey¶added inv2.15.0
func GenerateResumeTokenSigningKey() (ResumeTokenSigningKey,error)
typeServicePrefix¶added inv2.17.0
type ServicePrefix [6]byte
var (// TailscaleServicePrefix is the IPv6 prefix for all tailnet nodes since it was first added to// Coder. It is identical to the service prefix Tailscale.com uses. With the introduction of// CoderVPN, we would like to stop using the Tailscale prefix so that we don't conflict with// Tailscale if both are installed at the same time. However, there are a large number of agents// and clients using this prefix, so we need to carefully manage deprecation and eventual// removal.// fd7a:115c:a1e0:://48TailscaleServicePrefixServicePrefix = [6]byte{0xfd, 0x7a, 0x11, 0x5c, 0xa1, 0xe0}// CoderServicePrefix is the Coder-specific IPv6 prefix for tailnet nodes, which we are in the// process of migrating to. It allows Coder to run alongside Tailscale without conflicts even// if both are set up as TUN interfaces into the OS (e.g. CoderVPN).// fd60:627a:a42b::/48CoderServicePrefixServicePrefix = [6]byte{0xfd, 0x60, 0x62, 0x7a, 0xa4, 0x2b})
func (ServicePrefix)AddrFromUUID¶added inv2.17.0
func (pServicePrefix) AddrFromUUID(uiduuid.UUID)netip.Addr
AddrFromUUID returns an IPv6 address corresponding to the given UUID in the service prefix.
func (ServicePrefix)AsNetip¶added inv2.18.0
func (pServicePrefix) AsNetip()netip.Prefix
func (ServicePrefix)PrefixFromUUID¶added inv2.17.0
func (pServicePrefix) PrefixFromUUID(uiduuid.UUID)netip.Prefix
PrefixFromUUID returns a single IPv6 /128 prefix corresponding to the given UUID.
func (ServicePrefix)RandomAddr¶added inv2.17.0
func (pServicePrefix) RandomAddr()netip.Addr
RandomAddr returns a random IP address in the service prefix.
func (ServicePrefix)RandomPrefix¶added inv2.17.0
func (pServicePrefix) RandomPrefix()netip.Prefix
RandomPrefix returns a single IPv6 /128 prefix within the service prefix.
typeSingleTailnetCoordinateeAuth¶added inv2.9.0
type SingleTailnetCoordinateeAuth struct{}
SingleTailnetCoordinateeAuth allows all tunnels, since Coderd and wsproxy are allowed to initiate a tunnel to any agent
func (SingleTailnetCoordinateeAuth)Authorize¶added inv2.9.0
func (SingleTailnetCoordinateeAuth) Authorize(context.Context, *proto.CoordinateRequest)error
typeStreamID¶added inv2.6.0
type StreamID struct {NamestringIDuuid.UUIDAuthCoordinateeAuth}
StreamID identifies the caller of the CoordinateTailnet RPC. We store thison the context, since the information is extracted at the HTTP layer forremote clients of the API, or set outside tailnet for local clients (e.g.Coderd's single_tailnet)
typeSubscription¶added inv2.18.0
type Subscription interface {io.CloserUpdates() <-chan *proto.WorkspaceUpdate}
typeTelemetryClient¶added inv2.18.0
type TelemetryClient interface {PostTelemetry(ctxcontext.Context, in *proto.TelemetryRequest) (*proto.TelemetryResponse,error)}
typeTelemetryController¶added inv2.18.0
type TelemetryController interface {New(TelemetryClient)}
typeTelemetrySink¶added inv2.14.0
type TelemetrySink interface {// SendTelemetryEvent sends a telemetry event to some external sink.SendTelemetryEvent(event *proto.TelemetryEvent)}
TelemetrySink allows tailnet.Conn to send network telemetry to the Coderserver.
typeTelemetryStore¶added inv2.14.0
type TelemetryStore struct {// contains filtered or unexported fields}
Responsible for storing and anonymizing networking telemetry state.
typeTunnelAllOption¶added inv2.18.0
type TunnelAllOption func(t *TunnelAllWorkspaceUpdatesController)
funcWithDNS¶added inv2.18.0
func WithDNS(dDNSHostsSetter, ownerUsernamestring, optionsDNSNameOptions)TunnelAllOption
WithDNS configures the tunnelAllWorkspaceUpdatesController to set DNS names for all workspacesand agents it learns about.
funcWithHandler¶added inv2.19.0
func WithHandler(hUpdatesHandler)TunnelAllOption
typeTunnelAllWorkspaceUpdatesController¶added inv2.19.0
type TunnelAllWorkspaceUpdatesController struct {// contains filtered or unexported fields}
funcNewTunnelAllWorkspaceUpdatesController¶added inv2.18.0
func NewTunnelAllWorkspaceUpdatesController(loggerslog.Logger, c *TunnelSrcCoordController, opts ...TunnelAllOption,) *TunnelAllWorkspaceUpdatesController
NewTunnelAllWorkspaceUpdatesController creates a WorkspaceUpdatesController that creates tunnels(via the TunnelSrcCoordController) to all agents received over the WorkspaceUpdates RPC. If aDNSHostSetter is provided, it also programs DNS hosts based on the agent and workspace names.
func (*TunnelAllWorkspaceUpdatesController)CurrentState¶added inv2.19.0
func (t *TunnelAllWorkspaceUpdatesController) CurrentState() (WorkspaceUpdate,error)
func (*TunnelAllWorkspaceUpdatesController)New¶added inv2.19.0
func (t *TunnelAllWorkspaceUpdatesController) New(clientWorkspaceUpdatesClient)CloserWaiter
typeTunnelAuthorizer¶added inv2.18.0
typeTunnelSrcCoordController¶added inv2.18.0
type TunnelSrcCoordController struct {*BasicCoordinationController// contains filtered or unexported fields}
funcNewTunnelSrcCoordController¶added inv2.18.0
func NewTunnelSrcCoordController(loggerslog.Logger, coordinateeCoordinatee,) *TunnelSrcCoordController
NewTunnelSrcCoordController creates a CoordinationController for peers that are exclusivelytunnel sources (that is, they create tunnel --- Coder clients not workspaces).
func (*TunnelSrcCoordController)AddDestination¶added inv2.18.0
func (c *TunnelSrcCoordController) AddDestination(destuuid.UUID)
func (*TunnelSrcCoordController)New¶added inv2.18.0
func (c *TunnelSrcCoordController) New(clientCoordinatorClient)CloserWaiter
func (*TunnelSrcCoordController)RemoveDestination¶added inv2.18.0
func (c *TunnelSrcCoordController) RemoveDestination(destuuid.UUID)
func (*TunnelSrcCoordController)SyncDestinations¶added inv2.18.0
func (c *TunnelSrcCoordController) SyncDestinations(destinations []uuid.UUID)
typeUpdatesHandler¶added inv2.19.0
type UpdatesHandler interface {Update(WorkspaceUpdate)error}
UpdatesHandler is anything that expects a stream of workspace update diffs.
typeWorkspace¶added inv2.19.0
type Workspace struct {IDuuid.UUIDNamestringStatusproto.Workspace_Status// contains filtered or unexported fields}
typeWorkspaceUpdate¶added inv2.19.0
type WorkspaceUpdate struct {UpsertedWorkspaces []*WorkspaceUpsertedAgents []*AgentDeletedWorkspaces []*WorkspaceDeletedAgents []*AgentKindUpdateKind}
func (*WorkspaceUpdate)Clone¶added inv2.19.0
func (w *WorkspaceUpdate) Clone()WorkspaceUpdate
typeWorkspaceUpdatesClient¶added inv2.18.0
type WorkspaceUpdatesClient interface {Close()errorRecv() (*proto.WorkspaceUpdate,error)}
typeWorkspaceUpdatesController¶added inv2.18.0
type WorkspaceUpdatesController interface {New(WorkspaceUpdatesClient)CloserWaiter}
typeWorkspaceUpdatesProvider¶added inv2.18.0
Source Files¶
Directories¶
Path | Synopsis |
---|---|
Package tailnettest is a generated GoMock package. | Package tailnettest is a generated GoMock package. |