Documentation
¶
Index ¶
- Constants
- Variables
- func DisableIPv6()
- func GetDefaultLocalIPv4() net.IP
- func GetDefaultLocalIPv6() net.IP
- func HasIPv6() bool
- func InitConfig(v *viper.Viper, name string)
- func InitializeOsResolver(guardAgainstNoNameservers bool) []string
- func IsDesktopPlatform() bool
- func LanQueryCtx(ctx context.Context) context.Context
- func Log(ctx context.Context, e *zerolog.Event, format string, v ...any)
- func LookupIP(domain string) []string
- func ResolverTypeFromEndpoint(endpoint string) string
- func Rfc1918Addresses() []string
- func SavedStaticDnsSettingsFilePath(iface *net.Interface) string
- func SavedStaticNameservers(iface *net.Interface) ([]string, string)
- func SelfDiscover() bool
- func SetCacheReply(answer, msg *dns.Msg, code int)
- func SetConfigName(v *viper.Viper, name string)
- func SetConfigNameWithPath(v *viper.Viper, name, configPath string)
- func SetDefaultLocalIPv4(ip net.IP)
- func SetDefaultLocalIPv6(ip net.IP)
- func ValidateConfig(validate *validator.Validate, cfg *Config) error
- type ClientInfo
- type ClientInfoCtxKey
- type Config
- type LanQueryCtxKey
- type LeaseFileFormat
- type ListenerConfig
- type ListenerPolicyConfig
- type NetworkConfig
- type ReqIdCtxKey
- type Resolver
- type Rule
- type ServiceConfig
- type UpstreamConfig
- func (uc *UpstreamConfig) BootstrapIPs() []string
- func (uc *UpstreamConfig) Context(ctx context.Context) (context.Context, context.CancelFunc)
- func (uc *UpstreamConfig) ErrorPing() error
- func (uc *UpstreamConfig) FallbackToDirectIP() bool
- func (uc *UpstreamConfig) Init()
- func (uc *UpstreamConfig) IsControlD() bool
- func (uc *UpstreamConfig) IsDiscoverable() bool
- func (uc *UpstreamConfig) Ping()
- func (uc *UpstreamConfig) ReBootstrap()
- func (uc *UpstreamConfig) SetCertPool(cp *x509.CertPool)
- func (uc *UpstreamConfig) SetupBootstrapIP()
- func (uc *UpstreamConfig) SetupTransport()
- func (uc *UpstreamConfig) String() string
- func (uc *UpstreamConfig) UID() string
- func (uc *UpstreamConfig) UpstreamSendClientInfo() bool
- func (uc *UpstreamConfig) VerifyDomain() string
Constants ¶
const ( // IpStackBoth indicates that ctrld will use either ipv4 or ipv6 for connecting to upstream, // depending on which stack is available when receiving the DNS query. IpStackBoth = "both" // IpStackV4 indicates that ctrld will use only ipv4 for connecting to upstream. IpStackV4 = "v4" // IpStackV6 indicates that ctrld will use only ipv6 for connecting to upstream. IpStackV6 = "v6" // IpStackSplit indicates that ctrld will use either ipv4 or ipv6 for connecting to upstream, // depending on the record type of the DNS query. IpStackSplit = "split" // FreeDnsDomain is the domain name of free ControlD service. FreeDnsDomain = "freedns.controld.com" // FreeDNSBoostrapIP is the IP address of freedns.controld.com. FreeDNSBoostrapIP = "76.76.2.11" // FreeDNSBoostrapIPv6 is the IPv6 address of freedns.controld.com. FreeDNSBoostrapIPv6 = "2606:1a40::11" // PremiumDnsDomain is the domain name of premium ControlD service. PremiumDnsDomain = "dns.controld.com" // PremiumDNSBoostrapIP is the IP address of dns.controld.com. PremiumDNSBoostrapIP = "76.76.2.22" // PremiumDNSBoostrapIPv6 is the IPv6 address of dns.controld.com. PremiumDNSBoostrapIPv6 = "2606:1a40::22" )
IpStackBoth ...
const ( // ResolverTypeDOH specifies DoH resolver. ResolverTypeDOH = "doh" // ResolverTypeDOH3 specifies DoH3 resolver. ResolverTypeDOH3 = "doh3" // ResolverTypeDOT specifies DoT resolver. ResolverTypeDOT = "dot" // ResolverTypeDOQ specifies DoQ resolver. ResolverTypeDOQ = "doq" // ResolverTypeOS specifies OS resolver. ResolverTypeOS = "os" // ResolverTypeLegacy specifies legacy resolver. ResolverTypeLegacy = "legacy" // ResolverTypePrivate is like ResolverTypeOS, but use for private resolver only. ResolverTypePrivate = "private" // ResolverTypeLocal is like ResolverTypeOS, but use for local resolver only. ResolverTypeLocal = "local" // ResolverTypeSDNS specifies resolver with information encoded using DNS Stamps. // See: https://dnscrypt.info/stamps-specifications/ ResolverTypeSDNS = "sdns" )
Variables ¶
var DecodeArchNameMap = map[string]string{}
DecodeArchNameMap provides mapping from encoded OS arch to real value, used for decoding x-cd-os value.
var DecodeOsNameMap = map[string]string{}
DecodeOsNameMap provides mapping from encoded OS name to real value, used for decoding x-cd-os value.
var EncodeArchNameMap = map[string]string{
"amd64": "1",
"arm64": "2",
"arm": "3",
"386": "4",
"mips": "5",
"mipsle": "6",
"mips64": "7",
}
EncodeArchNameMap provides mapping from OS arch to a shorter string, used for encoding x-cd-os value.
var EncodeOsNameMap = map[string]string{
"windows": "1",
"darwin": "2",
"linux": "3",
"freebsd": "4",
}
EncodeOsNameMap provides mapping from OS name to a shorter string, used for encoding x-cd-os value.
var ProxyLog = zerolog.New(io.Discard)
ProxyLog emits the log record for proxy operations. The caller should set it only once. DEPRECATED: use ProxyLogger instead.
var ProxyLogger atomic.Pointer[zerolog.Logger]
ProxyLogger emits the log record for proxy operations.
Functions ¶
func DisableIPv6 ¶ added in v1.4.2
func DisableIPv6()
DisableIPv6 marks IPv6 as unavailable if enabled.
func GetDefaultLocalIPv4 ¶ added in v1.4.0
GetDefaultLocalIPv4 returns the stored local IPv4 or nil if none.
func GetDefaultLocalIPv6 ¶ added in v1.4.0
GetDefaultLocalIPv6 returns the stored local IPv6 or nil if none.
func HasIPv6 ¶ added in v1.4.2
func HasIPv6() bool
HasIPv6 reports whether the current network stack has IPv6 available.
func InitConfig ¶
InitConfig initializes default config values for given *viper.Viper instance.
func InitializeOsResolver ¶ added in v1.3.7
InitializeOsResolver initializes OS resolver using the current system DNS settings. It returns the nameservers that is going to be used by the OS resolver.
It's the caller's responsibility to ensure the system DNS is in a clean state before calling this function.
func IsDesktopPlatform ¶ added in v1.4.4
func IsDesktopPlatform() bool
IsDesktopPlatform indicates if ctrld is running on a desktop platform, currently defined as macOS or Windows workstation.
func LanQueryCtx ¶ added in v1.4.0
LanQueryCtx returns a context.Context with LanQueryCtxKey set.
func Log ¶
Log emits the logs for a particular zerolog event. The request id associated with the context will be included if presents.
func LookupIP ¶ added in v1.2.0
LookupIP looks up domain using current system nameservers settings. It returns a slice of that host's IPv4 and IPv6 addresses.
func ResolverTypeFromEndpoint ¶ added in v1.1.4
ResolverTypeFromEndpoint tries guessing the resolver type with a given endpoint using following rules:
- If endpoint is an IP address -> ResolverTypeLegacy - If endpoint starts with "https://" -> ResolverTypeDOH - If endpoint starts with "quic://" -> ResolverTypeDOQ - If endpoint starts with "h3://" -> ResolverTypeDOH3 - If endpoint starts with "sdns://" -> ResolverTypeSDNS - For anything else -> ResolverTypeDOT
func Rfc1918Addresses ¶ added in v1.3.2
func Rfc1918Addresses() []string
Rfc1918Addresses returns the list of local interfaces private IP addresses
func SavedStaticDnsSettingsFilePath ¶ added in v1.4.1
SavedStaticDnsSettingsFilePath returns the file path where the static DNS settings for the provided interface are saved.
func SavedStaticNameservers ¶ added in v1.4.1
SavedStaticNameservers returns the stored static nameservers for the given interface.
func SelfDiscover ¶ added in v1.4.2
func SelfDiscover() bool
SelfDiscover reports whether ctrld should only do self discover.
func SetCacheReply ¶ added in v1.4.4
SetCacheReply extracts and stores the necessary data from the message for a cached answer.
func SetConfigName ¶ added in v1.1.0
SetConfigName set the config name that ctrld will look for. DEPRECATED: use SetConfigNameWithPath instead.
func SetConfigNameWithPath ¶ added in v1.2.0
SetConfigNameWithPath set the config path and name that ctrld will look for.
func SetDefaultLocalIPv4 ¶ added in v1.4.0
SetDefaultLocalIPv4 updates the stored local IPv4.
func SetDefaultLocalIPv6 ¶ added in v1.4.0
SetDefaultLocalIPv6 updates the stored local IPv6.
func ValidateConfig ¶
ValidateConfig validates the given config.
Types ¶
type ClientInfo ¶ added in v1.2.0
ClientInfo represents ctrld's clients information.
type ClientInfoCtxKey ¶ added in v1.2.0
type ClientInfoCtxKey struct{}
ClientInfoCtxKey is the context key to store client info.
type Config ¶
type Config struct { Service ServiceConfig `mapstructure:"service" toml:"service,omitempty"` Listener map[string]*ListenerConfig `mapstructure:"listener" toml:"listener" validate:"min=1,dive"` Network map[string]*NetworkConfig `mapstructure:"network" toml:"network" validate:"min=1,dive"` Upstream map[string]*UpstreamConfig `mapstructure:"upstream" toml:"upstream" validate:"min=1,dive"` }
Config represents ctrld supported configuration.
func (*Config) FirstListener ¶ added in v1.3.0
func (c *Config) FirstListener() *ListenerConfig
FirstListener returns the first listener config of current config. Listeners are sorted numerically.
It panics if Config has no listeners configured.
func (*Config) FirstUpstream ¶ added in v1.3.0
func (c *Config) FirstUpstream() *UpstreamConfig
FirstUpstream returns the first upstream of current config. Upstreams are sorted numerically.
It panics if Config has no upstreams configured.
func (*Config) HasUpstreamSendClientInfo ¶ added in v1.2.0
HasUpstreamSendClientInfo reports whether the config has any upstream is configured to send client info to Control D DNS server.
type LanQueryCtxKey ¶ added in v1.4.0
type LanQueryCtxKey struct{}
LanQueryCtxKey is the context.Context key to indicate that the request is for LAN network.
type LeaseFileFormat ¶ added in v1.3.0
type LeaseFileFormat string
LeaseFileFormat specifies the format of DHCP lease file.
const ( Dnsmasq LeaseFileFormat = "dnsmasq" IscDhcpd LeaseFileFormat = "isc-dhcpd" KeaDHCP4 LeaseFileFormat = "kea-dhcp4" )
type ListenerConfig ¶
type ListenerConfig struct { IP string `mapstructure:"ip" toml:"ip,omitempty" validate:"iporempty"` Port int `mapstructure:"port" toml:"port,omitempty" validate:"gte=0"` Restricted bool `mapstructure:"restricted" toml:"restricted,omitempty"` AllowWanClients bool `mapstructure:"allow_wan_clients" toml:"allow_wan_clients,omitempty"` Policy *ListenerPolicyConfig `mapstructure:"policy" toml:"policy,omitempty"` }
ListenerConfig specifies the networks configuration that ctrld will run on.
func (*ListenerConfig) Init ¶
func (lc *ListenerConfig) Init()
Init initialized necessary values for an ListenerConfig.
func (*ListenerConfig) IsDirectDnsListener ¶ added in v1.3.0
func (lc *ListenerConfig) IsDirectDnsListener() bool
IsDirectDnsListener reports whether ctrld can be a direct listener on port 53. It returns true only if ctrld can listen on port 53 for all interfaces. That means there's no other software listening on port 53.
If someone listening on port 53, or ctrld could only listen on port 53 for a specific interface, ctrld could only be configured as a DNS forwarder.
type ListenerPolicyConfig ¶
type ListenerPolicyConfig struct { Name string `mapstructure:"name" toml:"name,omitempty"` Networks []Rule `mapstructure:"networks" toml:"networks,omitempty,inline,multiline" validate:"dive,len=1"` Rules []Rule `mapstructure:"rules" toml:"rules,omitempty,inline,multiline" validate:"dive,len=1"` Macs []Rule `mapstructure:"macs" toml:"macs,omitempty,inline,multiline" validate:"dive,len=1"` FailoverRcodes []string `mapstructure:"failover_rcodes" toml:"failover_rcodes,omitempty" validate:"dive,dnsrcode"` FailoverRcodeNumbers []int `mapstructure:"-" toml:"-"` }
ListenerPolicyConfig specifies the policy rules for ctrld to filter incoming requests.
type NetworkConfig ¶
type NetworkConfig struct { Name string `mapstructure:"name" toml:"name,omitempty"` Cidrs []string `mapstructure:"cidrs" toml:"cidrs,omitempty" validate:"dive,cidr"` IPNets []*net.IPNet `mapstructure:"-" toml:"-"` }
NetworkConfig specifies configuration for networks where ctrld will handle requests.
type ReqIdCtxKey ¶
type ReqIdCtxKey struct{}
ReqIdCtxKey is the context.Context key for a request id.
type Resolver ¶
Resolver is the interface that wraps the basic DNS operations.
Resolve resolves the DNS query, return the result and the corresponding error.
func NewBootstrapResolver ¶ added in v1.2.1
NewBootstrapResolver returns an OS resolver, which use following nameservers:
- Gateway IP address (depends on OS).
- Input servers.
func NewPrivateResolver ¶ added in v1.3.0
func NewPrivateResolver() Resolver
NewPrivateResolver returns an OS resolver, which includes only private DNS servers, excluding:
- Nameservers from /etc/resolv.conf file. - Nameservers which is local RFC1918 addresses.
This is useful for doing PTR lookup in LAN network.
func NewResolver ¶
func NewResolver(uc *UpstreamConfig) (Resolver, error)
NewResolver creates a Resolver based on the given upstream config.
func NewResolverWithNameserver ¶ added in v1.3.2
NewResolverWithNameserver returns a Resolver which uses the given nameservers for resolving DNS queries. If nameservers is empty, a dummy resolver will be returned.
Each nameserver must be form "host:port". It's the caller responsibility to ensure all nameservers are well formatted by using net.JoinHostPort function.
type Rule ¶
Rule is a map from source to list of upstreams. ctrld uses rule to perform requests matching and forward the request to corresponding upstreams if it's matched.
type ServiceConfig ¶
type ServiceConfig struct { LogLevel string `mapstructure:"log_level" toml:"log_level,omitempty"` LogPath string `mapstructure:"log_path" toml:"log_path,omitempty"` CacheEnable bool `mapstructure:"cache_enable" toml:"cache_enable,omitempty"` CacheSize int `mapstructure:"cache_size" toml:"cache_size,omitempty"` CacheTTLOverride int `mapstructure:"cache_ttl_override" toml:"cache_ttl_override,omitempty"` CacheServeStale bool `mapstructure:"cache_serve_stale" toml:"cache_serve_stale,omitempty"` CacheFlushDomains []string `mapstructure:"cache_flush_domains" toml:"cache_flush_domains" validate:"max=256"` MaxConcurrentRequests *int `mapstructure:"max_concurrent_requests" toml:"max_concurrent_requests,omitempty" validate:"omitempty,gte=0"` DHCPLeaseFile string `mapstructure:"dhcp_lease_file_path" toml:"dhcp_lease_file_path" validate:"omitempty,file"` DHCPLeaseFileFormat string `` /* 154-byte string literal not displayed */ DiscoverMDNS *bool `mapstructure:"discover_mdns" toml:"discover_mdns,omitempty"` DiscoverARP *bool `mapstructure:"discover_arp" toml:"discover_arp,omitempty"` DiscoverDHCP *bool `mapstructure:"discover_dhcp" toml:"discover_dhcp,omitempty"` DiscoverPtr *bool `mapstructure:"discover_ptr" toml:"discover_ptr,omitempty"` DiscoverHosts *bool `mapstructure:"discover_hosts" toml:"discover_hosts,omitempty"` DiscoverRefreshInterval int `mapstructure:"discover_refresh_interval" toml:"discover_refresh_interval,omitempty"` ClientIDPref string `mapstructure:"client_id_preference" toml:"client_id_preference,omitempty" validate:"omitempty,oneof=host mac"` MetricsQueryStats bool `mapstructure:"metrics_query_stats" toml:"metrics_query_stats,omitempty"` MetricsListener string `mapstructure:"metrics_listener" toml:"metrics_listener,omitempty"` DnsWatchdogEnabled *bool `mapstructure:"dns_watchdog_enabled" toml:"dns_watchdog_enabled,omitempty"` DnsWatchdogInvterval *time.Duration `mapstructure:"dns_watchdog_interval" toml:"dns_watchdog_interval,omitempty"` RefetchTime *int `mapstructure:"refetch_time" toml:"refetch_time,omitempty"` ForceRefetchWaitTime *int `mapstructure:"force_refetch_wait_time" toml:"force_refetch_wait_time,omitempty"` LeakOnUpstreamFailure *bool `mapstructure:"leak_on_upstream_failure" toml:"leak_on_upstream_failure,omitempty"` Daemon bool `mapstructure:"-" toml:"-"` AllocateIP bool `mapstructure:"-" toml:"-"` }
ServiceConfig specifies the general ctrld config.
type UpstreamConfig ¶
type UpstreamConfig struct { Name string `mapstructure:"name" toml:"name,omitempty"` Type string `mapstructure:"type" toml:"type,omitempty" validate:"oneof=doh doh3 dot doq os legacy sdns ''"` Endpoint string `mapstructure:"endpoint" toml:"endpoint,omitempty"` BootstrapIP string `mapstructure:"bootstrap_ip" toml:"bootstrap_ip,omitempty"` Domain string `mapstructure:"-" toml:"-"` IPStack string `mapstructure:"ip_stack" toml:"ip_stack,omitempty" validate:"ipstack"` Timeout int `mapstructure:"timeout" toml:"timeout,omitempty" validate:"gte=0"` // The caller should not access this field directly. // Use UpstreamSendClientInfo instead. SendClientInfo *bool `mapstructure:"send_client_info" toml:"send_client_info,omitempty"` // The caller should not access this field directly. // Use IsDiscoverable instead. Discoverable *bool `mapstructure:"discoverable" toml:"discoverable"` // contains filtered or unexported fields }
UpstreamConfig specifies configuration for upstreams that ctrld will forward requests to.
func (*UpstreamConfig) BootstrapIPs ¶ added in v1.2.0
func (uc *UpstreamConfig) BootstrapIPs() []string
BootstrapIPs returns the bootstrap IPs list of upstreams.
func (*UpstreamConfig) Context ¶ added in v1.4.2
func (uc *UpstreamConfig) Context(ctx context.Context) (context.Context, context.CancelFunc)
Context returns a new context with timeout set from upstream config.
func (*UpstreamConfig) ErrorPing ¶ added in v1.3.6
func (uc *UpstreamConfig) ErrorPing() error
ErrorPing is like Ping, but return an error if any.
func (*UpstreamConfig) FallbackToDirectIP ¶ added in v1.4.2
func (uc *UpstreamConfig) FallbackToDirectIP() bool
FallbackToDirectIP changes ControlD upstream endpoint to use direct IP instead of domain.
func (*UpstreamConfig) Init ¶
func (uc *UpstreamConfig) Init()
Init initialized necessary values for an UpstreamConfig.
func (*UpstreamConfig) IsControlD ¶ added in v1.3.8
func (uc *UpstreamConfig) IsControlD() bool
IsControlD reports whether this is a ControlD upstream.
func (*UpstreamConfig) IsDiscoverable ¶ added in v1.3.2
func (uc *UpstreamConfig) IsDiscoverable() bool
IsDiscoverable reports whether the upstream can be used for PTR discovery. The caller must ensure uc.Init() was called before calling this.
func (*UpstreamConfig) Ping ¶ added in v1.3.0
func (uc *UpstreamConfig) Ping()
Ping warms up the connection to DoH/DoH3 upstream.
func (*UpstreamConfig) ReBootstrap ¶ added in v1.1.1
func (uc *UpstreamConfig) ReBootstrap()
ReBootstrap re-setup the bootstrap IP and the transport.
func (*UpstreamConfig) SetCertPool ¶ added in v1.2.0
func (uc *UpstreamConfig) SetCertPool(cp *x509.CertPool)
SetCertPool sets the system cert pool used for TLS connections.
func (*UpstreamConfig) SetupBootstrapIP ¶ added in v1.1.1
func (uc *UpstreamConfig) SetupBootstrapIP()
SetupBootstrapIP manually find all available IPs of the upstream. The first usable IP will be used as bootstrap IP of the upstream. The upstream domain will be looked up using following orders:
- Current system DNS settings. - Direct IPs table for ControlD upstreams. - ControlD Bootstrap DNS 76.76.2.22
The setup process will block until there's usable IPs found.
func (*UpstreamConfig) SetupTransport ¶ added in v1.1.0
func (uc *UpstreamConfig) SetupTransport()
SetupTransport initializes the network transport used to connect to upstream server. For now, only DoH upstream is supported.
func (*UpstreamConfig) String ¶ added in v1.4.0
func (uc *UpstreamConfig) String() string
String returns a string representation of the UpstreamConfig for logging.
func (*UpstreamConfig) UID ¶ added in v1.3.1
func (uc *UpstreamConfig) UID() string
UID returns the unique identifier of the upstream.
func (*UpstreamConfig) UpstreamSendClientInfo ¶ added in v1.2.0
func (uc *UpstreamConfig) UpstreamSendClientInfo() bool
UpstreamSendClientInfo reports whether the upstream is configured to send client info to Control D DNS server.
Client info includes:
- MAC
- Lan IP
- Hostname
func (*UpstreamConfig) VerifyDomain ¶ added in v1.2.1
func (uc *UpstreamConfig) VerifyDomain() string
VerifyDomain returns the domain name that could be resolved by the upstream endpoint. It returns empty for non-ControlD upstream endpoint.
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
cmd
|
|
internal
|
|
dns/resolvconffile
Package resolvconffile parses & serializes /etc/resolv.conf-style files.
|
Package resolvconffile parses & serializes /etc/resolv.conf-style files. |