magicsock

package
v0.0.0-...-ded95ce Latest Latest
Warning

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

Go to latest
Published: Dec 14, 2022 License: BSD-3-Clause Imports: 60 Imported by: 0

Documentation

Overview

Package magicsock implements a socket that can change its communication path while in use, actively searching for the best way to communicate.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Conn

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

A Conn routes UDP packets and actively manages a list of its endpoints. It implements wireguard/conn.Bind.

func NewConn

func NewConn(opts Options) (*Conn, error)

NewConn creates a magic Conn listening on opts.Port. As the set of possible endpoints for a Conn changes, the callback opts.EndpointsFunc is called.

func (*Conn) Bind

func (c *Conn) Bind() conn.Bind

Bind returns the wireguard-go conn.Bind for c.

func (*Conn) Close

func (c *Conn) Close() error

Close closes the connection.

Only the first close does anything. Any later closes return nil.

func (*Conn) DERPs

func (c *Conn) DERPs() int

DERPs reports the number of active DERP connections.

func (*Conn) DiscoPublicKey

func (c *Conn) DiscoPublicKey() key.DiscoPublic

DiscoPublicKey returns the discovery public key.

func (*Conn) ExtractStatistics

func (c *Conn) ExtractStatistics() map[netlogtype.Connection]netlogtype.Counts

ExtractStatistics extracts and resets the counters for all active connections. It must be called periodically otherwise the memory used is unbounded.

The source is always a peer's tailscale IP address, while the destination is the peer's physical IP address and port. As a special case, packets routed through DERP use a destination address of 127.3.3.40 with the port being the DERP region. This node's tailscale IP address never appears in the returned map.

func (*Conn) LastRecvActivityOfNodeKey

func (c *Conn) LastRecvActivityOfNodeKey(nk key.NodePublic) string

LastRecvActivityOfNodeKey describes the time we last got traffic from this endpoint (updated every ~10 seconds).

func (*Conn) LocalPort

func (c *Conn) LocalPort() uint16

LocalPort returns the current IPv4 listener's port number.

func (*Conn) ParseEndpoint

func (c *Conn) ParseEndpoint(nodeKeyStr string) (conn.Endpoint, error)

ParseEndpoint is called by WireGuard to connect to an endpoint.

func (*Conn) PeerHasDiscoKey

func (c *Conn) PeerHasDiscoKey(k key.NodePublic) bool

PeerHasDiscoKey reports whether peer k supports discovery keys (client version 0.100.0+).

func (*Conn) Ping

func (c *Conn) Ping(peer *tailcfg.Node, res *ipnstate.PingResult, cb func(*ipnstate.PingResult))

Ping handles a "tailscale ping" CLI query.

func (*Conn) ReSTUN

func (c *Conn) ReSTUN(why string)

ReSTUN triggers an address discovery. The provided why string is for debug logging only.

func (*Conn) Rebind

func (c *Conn) Rebind()

Rebind closes and re-binds the UDP sockets and resets the DERP connection. It should be followed by a call to ReSTUN.

func (*Conn) Send

func (c *Conn) Send(b []byte, ep conn.Endpoint) error

func (*Conn) ServeHTTPDebug

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

ServeHTTPDebug serves an HTML representation of the innards of c for debugging.

It's accessible either from tailscaled's debug port (at /debug/magicsock) or via peerapi to a peer that's owned by the same user (so they can e.g. inspect their phones).

func (*Conn) SetDERPMap

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

SetDERPMap controls which (if any) DERP servers are used. A nil value means to disable DERP; it's disabled by default.

func (*Conn) SetDebugLoggingEnabled

func (c *Conn) SetDebugLoggingEnabled(v bool)

SetDebugLoggingEnabled controls whether spammy debug logging is enabled.

Note that this is currently independent from the log levels, even though they're pretty correlated: debugging logs should be [v1] (or higher), but some non-debug logs may also still have a [vN] annotation. The [vN] level controls which gets shown in stderr. The dlogf method, on the other hand, controls which gets even printed or uploaded at any level.

func (*Conn) SetNetInfoCallback

func (c *Conn) SetNetInfoCallback(fn func(*tailcfg.NetInfo))

func (*Conn) SetNetworkMap

func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap)

SetNetworkMap is called when the control client gets a new network map from the control server. It must always be non-nil.

It should not use the DERPMap field of NetworkMap; that's conditionally sent to SetDERPMap instead.

func (*Conn) SetNetworkUp

func (c *Conn) SetNetworkUp(up bool)

func (*Conn) SetPreferredPort

func (c *Conn) SetPreferredPort(port uint16)

SetPreferredPort sets the connection's preferred local port.

func (*Conn) SetPrivateKey

func (c *Conn) SetPrivateKey(privateKey key.NodePrivate) error

SetPrivateKey sets the connection's private key.

This is only used to be able prove our identity when connecting to DERP servers.

If the private key changes, any DERP connections are torn down & recreated when needed.

func (*Conn) SetStatisticsEnabled

func (c *Conn) SetStatisticsEnabled(enable bool)

SetStatisticsEnabled enables per-connection packet counters. Disabling statistics gathering does not reset the counters. ExtractStatistics must be called to reset the counters and be periodically called while enabled to avoid unbounded memory use.

func (*Conn) UpdatePeers

func (c *Conn) UpdatePeers(newPeers map[key.NodePublic]struct{})

UpdatePeers is called when the set of WireGuard peers changes. It then removes any state for old peers.

The caller passes ownership of newPeers map to UpdatePeers.

func (*Conn) UpdateStatus

func (c *Conn) UpdateStatus(sb *ipnstate.StatusBuilder)

type Options

type Options struct {
	// Logf optionally provides a log function to use.
	// Must not be nil.
	Logf logger.Logf

	// Port is the port to listen on.
	// Zero means to pick one automatically.
	Port uint16

	// EndpointsFunc optionally provides a func to be called when
	// endpoints change. The called func does not own the slice.
	EndpointsFunc func([]tailcfg.Endpoint)

	// DERPActiveFunc optionally provides a func to be called when
	// a connection is made to a DERP server.
	DERPActiveFunc func()

	// IdleFunc optionally provides a func to return how long
	// it's been since a TUN packet was sent or received.
	IdleFunc func() time.Duration

	// TestOnlyPacketListener optionally specifies how to create PacketConns.
	// Only used by tests.
	TestOnlyPacketListener nettype.PacketListener

	// NoteRecvActivity, if provided, is a func for magicsock to call
	// whenever it receives a packet from a a peer if it's been more
	// than ~10 seconds since the last one. (10 seconds is somewhat
	// arbitrary; the sole user just doesn't need or want it called on
	// every packet, just every minute or two for WireGuard timeouts,
	// and 10 seconds seems like a good trade-off between often enough
	// and not too often.)
	// The provided func is likely to call back into
	// Conn.ParseEndpoint, which acquires Conn.mu. As such, you should
	// not hold Conn.mu while calling it.
	NoteRecvActivity func(key.NodePublic)

	// LinkMonitor is the link monitor to use.
	// With one, the portmapper won't be used.
	LinkMonitor *monitor.Mon
}

Options contains options for Listen.

type RebindingUDPConn

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

RebindingUDPConn is a UDP socket that can be re-bound. Unix has no notion of re-binding a socket, so we swap it out for a new one.

func (*RebindingUDPConn) Close

func (c *RebindingUDPConn) Close() error

func (*RebindingUDPConn) LocalAddr

func (c *RebindingUDPConn) LocalAddr() *net.UDPAddr

func (*RebindingUDPConn) Port

func (c *RebindingUDPConn) Port() uint16

func (*RebindingUDPConn) ReadFrom

func (c *RebindingUDPConn) ReadFrom(b []byte) (int, net.Addr, error)

ReadFrom reads a packet from c into b. It returns the number of bytes copied and the source address.

func (*RebindingUDPConn) ReadFromNetaddr

func (c *RebindingUDPConn) ReadFromNetaddr(b []byte) (n int, ipp netip.AddrPort, err error)

ReadFromNetaddr reads a packet from c into b. It returns the number of bytes copied and the return address. It is identical to c.ReadFrom, except that it returns a netip.AddrPort instead of a net.Addr. ReadFromNetaddr is designed to work with specific underlying connection types. If c's underlying connection returns a non-*net.UPDAddr return address, ReadFromNetaddr will return an error. ReadFromNetaddr exists because it removes an allocation per read, when c's underlying connection is a net.UDPConn.

func (*RebindingUDPConn) WriteTo

func (c *RebindingUDPConn) WriteTo(b []byte, addr net.Addr) (int, error)

func (*RebindingUDPConn) WriteToUDPAddrPort

func (c *RebindingUDPConn) WriteToUDPAddrPort(b []byte, addr netip.AddrPort) (int, error)

Jump to

Keyboard shortcuts

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