Documentation ¶
Index ¶
- Constants
- Variables
- func GetDNSConfig() (*tailcfg.DNSConfig, string)
- func IsCLIConfigured() bool
- func LoadConfig(path string, isFile bool) error
- type ACLConfig
- type APIKey
- type CLIConfig
- type Config
- type DERPConfig
- type HostInfo
- type IPPrefix
- type IPPrefixes
- type LetsEncryptConfig
- type LogConfig
- type LogTailConfig
- type Node
- func (node *Node) CanAccess(filter []tailcfg.FilterRule, node2 *Node) bool
- func (node *Node) DiscoPublicKey() (key.DiscoPublic, error)
- func (node *Node) GetFQDN(dnsConfig *tailcfg.DNSConfig, baseDomain string) (string, error)
- func (node *Node) GetHostInfo() tailcfg.Hostinfo
- func (node *Node) IsEphemeral() bool
- func (node Node) IsExpired() bool
- func (node *Node) IsOnline() bool
- func (node *Node) MachinePublicKey() (key.MachinePublic, error)
- func (node *Node) NodePublicKey() (key.NodePublic, error)
- func (node *Node) Proto() *v1.Node
- func (node Node) String() string
- type NodeAddresses
- func (na NodeAddresses) AppendToIPSet(build *netipx.IPSetBuilder)
- func (na NodeAddresses) InIPSet(set *netipx.IPSet) bool
- func (na NodeAddresses) Prefixes() []netip.Prefix
- func (na *NodeAddresses) Scan(destination interface{}) error
- func (na NodeAddresses) Sort()
- func (na NodeAddresses) StringSlice() []string
- func (na NodeAddresses) Value() (driver.Value, error)
- type Nodes
- type OIDCConfig
- type PreAuthKey
- type PreAuthKeyACLTag
- type Route
- type Routes
- type StateUpdate
- type StateUpdateType
- type StringList
- type TLSConfig
- type User
Constants ¶
Variables ¶
var ( ErrNodeAddressesInvalid = errors.New("failed to parse node addresses") ErrHostnameTooLong = errors.New("hostname too long") )
var ( ExitRouteV4 = netip.MustParsePrefix("0.0.0.0/0") ExitRouteV6 = netip.MustParsePrefix("::/0") )
var ErrCannotParsePrefix = errors.New("cannot parse prefix")
Functions ¶
func GetDNSConfig ¶
func IsCLIConfigured ¶
func IsCLIConfigured() bool
func LoadConfig ¶
Types ¶
type ACLConfig ¶
type ACLConfig struct {
PolicyPath string
}
func GetACLConfig ¶
func GetACLConfig() ACLConfig
type APIKey ¶
type APIKey struct { ID uint64 `gorm:"primary_key"` Prefix string `gorm:"uniqueIndex"` Hash []byte CreatedAt *time.Time Expiration *time.Time LastSeen *time.Time }
APIKey describes the datamodel for API keys used to remotely authenticate with headscale.
type Config ¶
type Config struct { ServerURL string Addr string MetricsAddr string GRPCAddr string GRPCAllowInsecure bool EphemeralNodeInactivityTimeout time.Duration NodeUpdateCheckInterval time.Duration IPPrefixes []netip.Prefix PrivateKeyPath string NoisePrivateKeyPath string BaseDomain string Log LogConfig DisableUpdateCheck bool DERP DERPConfig DBtype string DBpath string DBhost string DBport int DBname string DBuser string DBpass string DBssl string TLS TLSConfig ACMEURL string ACMEEmail string DNSConfig *tailcfg.DNSConfig UnixSocket string UnixSocketPermission fs.FileMode OIDC OIDCConfig LogTail LogTailConfig RandomizeClientPort bool CLI CLIConfig ACL ACLConfig }
Config contains the initial Headscale configuration.
func GetHeadscaleConfig ¶
type DERPConfig ¶
type DERPConfig struct { ServerEnabled bool ServerRegionID int ServerRegionCode string ServerRegionName string STUNAddr string URLs []url.URL Paths []string AutoUpdate bool UpdateFrequency time.Duration }
func GetDERPConfig ¶
func GetDERPConfig() DERPConfig
type HostInfo ¶
This is a "wrapper" type around tailscales Hostinfo to allow us to add database "serialization" methods. This allows us to use a typed values throughout the code and not have to marshal/unmarshal and error check all over the code.
type IPPrefixes ¶
func (*IPPrefixes) Scan ¶
func (i *IPPrefixes) Scan(destination interface{}) error
type LetsEncryptConfig ¶
type LogConfig ¶
func GetLogConfig ¶
func GetLogConfig() LogConfig
type LogTailConfig ¶
type LogTailConfig struct {
Enabled bool
}
func GetLogTailConfig ¶
func GetLogTailConfig() LogTailConfig
type Node ¶
type Node struct { ID uint64 `gorm:"primary_key"` MachineKey string `gorm:"type:varchar(64);unique_index"` NodeKey string DiscoKey string IPAddresses NodeAddresses // Hostname represents the name given by the Tailscale // client during registration Hostname string // Givenname represents either: // a DNS normalized version of Hostname // a valid name set by the User // // GivenName is the name used in all DNS related // parts of headscale. GivenName string `gorm:"type:varchar(63);unique_index"` UserID uint User User `gorm:"foreignKey:UserID"` RegisterMethod string ForcedTags StringList // TODO(kradalby): This seems like irrelevant information? AuthKeyID uint AuthKey *PreAuthKey LastSeen *time.Time Expiry *time.Time HostInfo HostInfo Endpoints StringList Routes []Route CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time }
Node is a Headscale client.
func (*Node) DiscoPublicKey ¶
func (node *Node) DiscoPublicKey() (key.DiscoPublic, error)
func (*Node) GetHostInfo ¶
GetHostInfo returns a Hostinfo struct for the node.
func (*Node) IsEphemeral ¶
IsEphemeral returns if the node is registered as an Ephemeral node. https://tailscale.com/kb/1111/ephemeral-nodes/
func (*Node) IsOnline ¶
IsOnline returns if the node is connected to Headscale. This is really a naive implementation, as we don't really see if there is a working connection between the client and the server.
func (*Node) MachinePublicKey ¶
func (node *Node) MachinePublicKey() (key.MachinePublic, error)
func (*Node) NodePublicKey ¶
func (node *Node) NodePublicKey() (key.NodePublic, error)
type NodeAddresses ¶
func (NodeAddresses) AppendToIPSet ¶
func (na NodeAddresses) AppendToIPSet(build *netipx.IPSetBuilder)
AppendToIPSet adds the individual ips in NodeAddresses to a given netipx.IPSetBuilder.
func (NodeAddresses) Prefixes ¶
func (na NodeAddresses) Prefixes() []netip.Prefix
func (*NodeAddresses) Scan ¶
func (na *NodeAddresses) Scan(destination interface{}) error
func (NodeAddresses) Sort ¶
func (na NodeAddresses) Sort()
func (NodeAddresses) StringSlice ¶
func (na NodeAddresses) StringSlice() []string
type OIDCConfig ¶
type PreAuthKey ¶
type PreAuthKey struct { ID uint64 `gorm:"primary_key"` Key string UserID uint User User Reusable bool Ephemeral bool `gorm:"default:false"` Used bool `gorm:"default:false"` ACLTags []PreAuthKeyACLTag CreatedAt *time.Time Expiration *time.Time }
PreAuthKey describes a pre-authorization key usable in a particular user.
func (*PreAuthKey) Proto ¶
func (key *PreAuthKey) Proto() *v1.PreAuthKey
type PreAuthKeyACLTag ¶
PreAuthKeyACLTag describes an autmatic tag applied to a node when registered with the associated PreAuthKey.
type Route ¶
type Route struct { gorm.Model NodeID uint64 Node Node Prefix IPPrefix Advertised bool Enabled bool IsPrimary bool }
func (*Route) IsExitRoute ¶
type StateUpdate ¶
type StateUpdate struct { // The type of update Type StateUpdateType // Changed must be set when Type is StatePeerChanged and // contain the Node IDs of nodes that have changed. Changed Nodes // Removed must be set when Type is StatePeerRemoved and // contain a list of the nodes that has been removed from // the network. Removed []tailcfg.NodeID // DERPMap must be set when Type is StateDERPUpdated and // contain the new DERP Map. DERPMap tailcfg.DERPMap }
StateUpdate is an internal message containing information about a state change that has happened to the network.
type StateUpdateType ¶
type StateUpdateType int
const ( StateFullUpdate StateUpdateType = iota StatePeerChanged StatePeerRemoved StateDERPUpdated )
type StringList ¶
type StringList []string
func (*StringList) Scan ¶
func (i *StringList) Scan(destination interface{}) error
type TLSConfig ¶
type TLSConfig struct { CertPath string KeyPath string LetsEncrypt LetsEncryptConfig }
func GetTLSConfig ¶
func GetTLSConfig() TLSConfig
type User ¶
User is the way Headscale implements the concept of users in Tailscale
At the end of the day, users in Tailscale are some kind of 'bubbles' or users that contain our machines.