Documentation
¶
Index ¶
- Constants
- Variables
- func ForEach(resolver Resolver, callback func(Resolver))
- func GetFromChainWithType[T any](resolver ChainedResolver) (result T, err error)
- func GetQueryLoggingWriter(ctx context.Context, cfg config.QueryLog, instanceID string) (querylog.Writer, error)
- func LogResolverConfig(res Resolver, logger *logrus.Entry)
- func Name(resolver Resolver) string
- type BlockingResolver
- func (r *BlockingResolver) BlockingStatus() api.BlockingStatus
- func (r *BlockingResolver) DisableBlocking(ctx context.Context, duration time.Duration, disableGroups []string) error
- func (r *BlockingResolver) EnableBlocking(ctx context.Context)
- func (c *BlockingResolver) IsEnabled() bool
- func (r *BlockingResolver) LogConfig(logger *logrus.Entry)
- func (r *BlockingResolver) RefreshLists(ctx context.Context) error
- func (r *BlockingResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *BlockingResolver) String() string
- func (t *BlockingResolver) Type() string
- type Bootstrap
- func (c *Bootstrap) IsEnabled() bool
- func (c *Bootstrap) LogConfig(logger *logrus.Entry)
- func (b *Bootstrap) NewHTTPTransport() *http.Transport
- func (b *Bootstrap) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *Bootstrap) String() string
- func (t *Bootstrap) Type() string
- func (b *Bootstrap) UpstreamIPs(ctx context.Context, r *UpstreamResolver) (*IPSet, error)
- type CacheDecorator
- type CachingResolver
- func (r *CachingResolver) FlushCaches(ctx context.Context)
- func (c *CachingResolver) IsEnabled() bool
- func (r *CachingResolver) LogConfig(logger *logrus.Entry)
- func (r *CachingResolver) Resolve(ctx context.Context, request *model.Request) (response *model.Response, err error)
- func (t *CachingResolver) String() string
- func (t *CachingResolver) Type() string
- type ChainedResolver
- func Chain(resolvers ...Resolver) ChainedResolver
- func NewDNS64Resolver(cfg config.DNS64) ChainedResolver
- func NewDNSSECResolver(ctx context.Context, cfg config.DNSSEC, upstream Resolver) (ChainedResolver, error)
- func NewECSClientResolver(cfg config.ECS) ChainedResolver
- func NewECSResolver(cfg config.ECS) ChainedResolver
- type ClientNamesResolver
- func (r *ClientNamesResolver) FlushCache()
- func (c *ClientNamesResolver) IsEnabled() bool
- func (r *ClientNamesResolver) LogConfig(logger *logrus.Entry)
- func (r *ClientNamesResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *ClientNamesResolver) String() string
- func (t *ClientNamesResolver) Type() string
- type ConditionalUpstreamResolver
- func (c *ConditionalUpstreamResolver) IsEnabled() bool
- func (c *ConditionalUpstreamResolver) LogConfig(logger *logrus.Entry)
- func (r *ConditionalUpstreamResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *ConditionalUpstreamResolver) String() string
- func (t *ConditionalUpstreamResolver) Type() string
- type CustomDNSResolver
- func (r *CustomDNSResolver) CreateAnswerFromQuestion(newFunc createAnswerFunc)
- func (c *CustomDNSResolver) IsEnabled() bool
- func (c *CustomDNSResolver) LogConfig(logger *logrus.Entry)
- func (r *CustomDNSResolver) LookupReverse(ip net.IP) []string
- func (r *CustomDNSResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *CustomDNSResolver) String() string
- func (t *CustomDNSResolver) Type() string
- type DNS64Resolver
- type DNSSECResolver
- type ECSClientResolver
- type ECSMask
- type ECSResolver
- type EDEResolver
- type FQDNOnlyResolver
- type FilteringResolver
- type HostsFileEntry
- type HostsFileResolver
- func (c *HostsFileResolver) IsEnabled() bool
- func (r *HostsFileResolver) LogConfig(logger *logrus.Entry)
- func (r *HostsFileResolver) LookupReverse(ip net.IP) []string
- func (r *HostsFileResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *HostsFileResolver) String() string
- func (t *HostsFileResolver) Type() string
- type IPSet
- type MetricsResolver
- type MockChainedResolver
- func (_m *MockChainedResolver) EXPECT() *MockChainedResolver_Expecter
- func (_mock *MockChainedResolver) GetNext() Resolver
- func (_mock *MockChainedResolver) IsEnabled() bool
- func (_mock *MockChainedResolver) LogConfig(logger *logrus.Entry)
- func (_mock *MockChainedResolver) Next(n Resolver)
- func (_mock *MockChainedResolver) Resolve(ctx context.Context, req *model.Request) (*model.Response, error)
- func (_mock *MockChainedResolver) String() string
- func (_mock *MockChainedResolver) Type() string
- type MockChainedResolver_Expecter
- func (_e *MockChainedResolver_Expecter) GetNext() *MockChainedResolver_GetNext_Call
- func (_e *MockChainedResolver_Expecter) IsEnabled() *MockChainedResolver_IsEnabled_Call
- func (_e *MockChainedResolver_Expecter) LogConfig(logger interface{}) *MockChainedResolver_LogConfig_Call
- func (_e *MockChainedResolver_Expecter) Next(n interface{}) *MockChainedResolver_Next_Call
- func (_e *MockChainedResolver_Expecter) Resolve(ctx interface{}, req interface{}) *MockChainedResolver_Resolve_Call
- func (_e *MockChainedResolver_Expecter) String() *MockChainedResolver_String_Call
- func (_e *MockChainedResolver_Expecter) Type() *MockChainedResolver_Type_Call
- type MockChainedResolver_GetNext_Call
- func (_c *MockChainedResolver_GetNext_Call) Return(resolver Resolver) *MockChainedResolver_GetNext_Call
- func (_c *MockChainedResolver_GetNext_Call) Run(run func()) *MockChainedResolver_GetNext_Call
- func (_c *MockChainedResolver_GetNext_Call) RunAndReturn(run func() Resolver) *MockChainedResolver_GetNext_Call
- type MockChainedResolver_IsEnabled_Call
- func (_c *MockChainedResolver_IsEnabled_Call) Return(b bool) *MockChainedResolver_IsEnabled_Call
- func (_c *MockChainedResolver_IsEnabled_Call) Run(run func()) *MockChainedResolver_IsEnabled_Call
- func (_c *MockChainedResolver_IsEnabled_Call) RunAndReturn(run func() bool) *MockChainedResolver_IsEnabled_Call
- type MockChainedResolver_LogConfig_Call
- func (_c *MockChainedResolver_LogConfig_Call) Return() *MockChainedResolver_LogConfig_Call
- func (_c *MockChainedResolver_LogConfig_Call) Run(run func(logger *logrus.Entry)) *MockChainedResolver_LogConfig_Call
- func (_c *MockChainedResolver_LogConfig_Call) RunAndReturn(run func(logger *logrus.Entry)) *MockChainedResolver_LogConfig_Call
- type MockChainedResolver_Next_Call
- type MockChainedResolver_Resolve_Call
- func (_c *MockChainedResolver_Resolve_Call) Return(response *model.Response, err error) *MockChainedResolver_Resolve_Call
- func (_c *MockChainedResolver_Resolve_Call) Run(run func(ctx context.Context, req *model.Request)) *MockChainedResolver_Resolve_Call
- func (_c *MockChainedResolver_Resolve_Call) RunAndReturn(run func(ctx context.Context, req *model.Request) (*model.Response, error)) *MockChainedResolver_Resolve_Call
- type MockChainedResolver_String_Call
- type MockChainedResolver_Type_Call
- type MockDoQUpstreamServer
- func (t *MockDoQUpstreamServer) Close()
- func (t *MockDoQUpstreamServer) GetCallCount() int
- func (t *MockDoQUpstreamServer) GetConnCount() int
- func (t *MockDoQUpstreamServer) Start() config.Upstream
- func (t *MockDoQUpstreamServer) WithAnswerError(errorCode int) *MockDoQUpstreamServer
- func (t *MockDoQUpstreamServer) WithAnswerRR(answers ...string) *MockDoQUpstreamServer
- type MockDoTUpstreamServer
- func (t *MockDoTUpstreamServer) Close()
- func (t *MockDoTUpstreamServer) GetCallCount() int
- func (t *MockDoTUpstreamServer) GetConnCount() int
- func (t *MockDoTUpstreamServer) Start() config.Upstream
- func (t *MockDoTUpstreamServer) WithAnswerError(errorCode int) *MockDoTUpstreamServer
- func (t *MockDoTUpstreamServer) WithAnswerRR(answers ...string) *MockDoTUpstreamServer
- func (t *MockDoTUpstreamServer) WithCloseAfter(n int) *MockDoTUpstreamServer
- type MockUDPUpstreamServer
- func (t *MockUDPUpstreamServer) Close()
- func (t *MockUDPUpstreamServer) GetCallCount() int
- func (t *MockUDPUpstreamServer) ResetCallCount()
- func (t *MockUDPUpstreamServer) Start() config.Upstream
- func (t *MockUDPUpstreamServer) WithAnswerError(errorCode int) *MockUDPUpstreamServer
- func (t *MockUDPUpstreamServer) WithAnswerFn(fn func(request *dns.Msg) (response *dns.Msg)) *MockUDPUpstreamServer
- func (t *MockUDPUpstreamServer) WithAnswerMsg(answer *dns.Msg) *MockUDPUpstreamServer
- func (t *MockUDPUpstreamServer) WithAnswerRR(answers ...string) *MockUDPUpstreamServer
- func (t *MockUDPUpstreamServer) WithDelay(delay time.Duration) *MockUDPUpstreamServer
- type NamedResolver
- type NextResolver
- type NoOpResolver
- type ParallelBestResolver
- func (c *ParallelBestResolver) IsEnabled() bool
- func (c *ParallelBestResolver) LogConfig(logger *logrus.Entry)
- func (r *ParallelBestResolver) Name() string
- func (r *ParallelBestResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (r *ParallelBestResolver) String() string
- func (t *ParallelBestResolver) Type() string
- type QueryLoggingResolver
- func (c *QueryLoggingResolver) IsEnabled() bool
- func (c *QueryLoggingResolver) LogConfig(logger *logrus.Entry)
- func (r *QueryLoggingResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *QueryLoggingResolver) String() string
- func (t *QueryLoggingResolver) Type() string
- type RateLimitingResolver
- func (c *RateLimitingResolver) IsEnabled() bool
- func (c *RateLimitingResolver) LogConfig(logger *logrus.Entry)
- func (r *RateLimitingResolver) Resolve(ctx context.Context, req *model.Request) (*model.Response, error)
- func (t *RateLimitingResolver) String() string
- func (t *RateLimitingResolver) Type() string
- type RebindingProtectionResolver
- func (c *RebindingProtectionResolver) IsEnabled() bool
- func (c *RebindingProtectionResolver) LogConfig(logger *logrus.Entry)
- func (r *RebindingProtectionResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *RebindingProtectionResolver) String() string
- func (t *RebindingProtectionResolver) Type() string
- type Resolver
- type SpecialUseDomainNamesResolver
- func (c *SpecialUseDomainNamesResolver) IsEnabled() bool
- func (c *SpecialUseDomainNamesResolver) LogConfig(logger *logrus.Entry)
- func (r *SpecialUseDomainNamesResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (t *SpecialUseDomainNamesResolver) String() string
- func (t *SpecialUseDomainNamesResolver) Type() string
- type StatsResolver
- func (c *StatsResolver) IsEnabled() bool
- func (c *StatsResolver) LogConfig(logger *logrus.Entry)
- func (r *StatsResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (r *StatsResolver) Stats() stats.Result
- func (r *StatsResolver) StatsEnabled() bool
- func (t *StatsResolver) String() string
- func (t *StatsResolver) Type() string
- type StrictResolver
- func (c *StrictResolver) IsEnabled() bool
- func (c *StrictResolver) LogConfig(logger *logrus.Entry)
- func (r *StrictResolver) Name() string
- func (r *StrictResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (r *StrictResolver) String() string
- func (t *StrictResolver) Type() string
- type UpstreamResolver
- func (c *UpstreamResolver) IsEnabled() bool
- func (c *UpstreamResolver) LogConfig(logger *logrus.Entry)
- func (r *UpstreamResolver) Resolve(ctx context.Context, request *model.Request) (response *model.Response, err error)
- func (r UpstreamResolver) String() string
- func (t *UpstreamResolver) Type() string
- func (r UpstreamResolver) Upstream() config.Upstream
- type UpstreamServerError
- type UpstreamTreeResolver
- func (c *UpstreamTreeResolver) IsEnabled() bool
- func (c *UpstreamTreeResolver) LogConfig(logger *logrus.Entry)
- func (r *UpstreamTreeResolver) Name() string
- func (r *UpstreamTreeResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
- func (r *UpstreamTreeResolver) String() string
- func (t *UpstreamTreeResolver) Type() string
Constants ¶
const (
// WellKnownDNS64Prefix Well-known DNS64 prefix (RFC 6052)
WellKnownDNS64Prefix = "64:ff9b::/96"
)
Variables ¶
var ErrRateLimited = errors.New("client rate-limited")
ErrRateLimited signals that handleReq must write no response.
var NoResponse = &model.Response{} //nolint:gochecknoglobals
Functions ¶
func ForEach ¶
ForEach iterates over all resolvers in the chain.
If resolver is not a chain, or is unlinked, the callback is called exactly once.
func GetFromChainWithType ¶
func GetFromChainWithType[T any](resolver ChainedResolver) (result T, err error)
func GetQueryLoggingWriter ¶
func LogResolverConfig ¶
LogResolverConfig logs the resolver's type and config.
Types ¶
type BlockingResolver ¶
type BlockingResolver struct {
NextResolver
// contains filtered or unexported fields
}
BlockingResolver checks request's question (domain name) against allow/denylists
func NewBlockingResolver ¶
func NewBlockingResolver(ctx context.Context, cfg config.Blocking, bootstrap *Bootstrap, ) (r *BlockingResolver, err error)
NewBlockingResolver returns a new configured instance of the resolver
func (*BlockingResolver) BlockingStatus ¶
func (r *BlockingResolver) BlockingStatus() api.BlockingStatus
BlockingStatus returns the current blocking status
func (*BlockingResolver) DisableBlocking ¶
func (r *BlockingResolver) DisableBlocking(ctx context.Context, duration time.Duration, disableGroups []string) error
DisableBlocking deactivates the blocking for a particular duration (or forever if 0).
func (*BlockingResolver) EnableBlocking ¶
func (r *BlockingResolver) EnableBlocking(ctx context.Context)
EnableBlocking enables the blocking against the denylists
func (*BlockingResolver) IsEnabled ¶
func (c *BlockingResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*BlockingResolver) LogConfig ¶
func (r *BlockingResolver) LogConfig(logger *logrus.Entry)
LogConfig implements `config.Configurable`.
func (*BlockingResolver) RefreshLists ¶
func (r *BlockingResolver) RefreshLists(ctx context.Context) error
RefreshLists triggers the refresh of all allow/denylists in the cache
func (*BlockingResolver) Resolve ¶
func (r *BlockingResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve checks the query against the denylist and delegates to next resolver if domain is not blocked
type Bootstrap ¶
type Bootstrap struct {
// contains filtered or unexported fields
}
Bootstrap allows resolving hostnames using the configured bootstrap DNS.
func NewBootstrap ¶
NewBootstrap creates and returns a new Bootstrap. Internally, it uses a CachingResolver and an UpstreamResolver.
func (*Bootstrap) IsEnabled ¶
func (c *Bootstrap) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*Bootstrap) NewHTTPTransport ¶
NewHTTPTransport returns a new http.Transport that uses b to resolve hostnames
func (*Bootstrap) UpstreamIPs ¶
type CacheDecorator ¶ added in v0.30.0
type CacheDecorator func(cache.ExpiringCache[[]byte]) (cache.ExpiringCache[[]byte], error)
CacheDecorator optionally wraps the result cache (e.g., with Redis sync).
type CachingResolver ¶
type CachingResolver struct {
NextResolver
// contains filtered or unexported fields
}
CachingResolver caches answers from dns queries with their TTL time, to avoid external resolver calls for recurrent queries
func NewCachingResolver ¶
func NewCachingResolver(ctx context.Context, cfg config.Caching, decorator CacheDecorator, ) (*CachingResolver, error)
NewCachingResolver creates a new resolver instance
func (*CachingResolver) FlushCaches ¶
func (r *CachingResolver) FlushCaches(ctx context.Context)
func (*CachingResolver) IsEnabled ¶
func (c *CachingResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*CachingResolver) LogConfig ¶
func (r *CachingResolver) LogConfig(logger *logrus.Entry)
LogConfig implements `config.Configurable`.
func (*CachingResolver) Resolve ¶
func (r *CachingResolver) Resolve(ctx context.Context, request *model.Request) (response *model.Response, err error)
Resolve checks if the current query should use the cache and if the result is already in the cache and returns it or delegates to the next resolver
type ChainedResolver ¶
type ChainedResolver interface {
Resolver
// Next sets the next resolver
Next(n Resolver)
// GetNext returns the next resolver
GetNext() Resolver
}
ChainedResolver represents a resolver, which can delegate result to the next one
func NewDNS64Resolver ¶ added in v0.29.0
func NewDNS64Resolver(cfg config.DNS64) ChainedResolver
NewDNS64Resolver creates a new DNS64 resolver instance
func NewDNSSECResolver ¶ added in v0.28.0
func NewDNSSECResolver(ctx context.Context, cfg config.DNSSEC, upstream Resolver) (ChainedResolver, error)
NewDNSSECResolver creates a new DNSSEC resolver instance
func NewECSClientResolver ¶ added in v0.33.0
func NewECSClientResolver(cfg config.ECS) ChainedResolver
NewECSClientResolver creates a new resolver instance which uses the ECS subnet as client IP
func NewECSResolver ¶
func NewECSResolver(cfg config.ECS) ChainedResolver
NewECSResolver creates new resolver instance which adds the subnet information as EDNS0 option
type ClientNamesResolver ¶
type ClientNamesResolver struct {
NextResolver
// contains filtered or unexported fields
}
ClientNamesResolver tries to determine client name by asking responsible DNS server via rDNS (reverse lookup)
func NewClientNamesResolver ¶
func NewClientNamesResolver(ctx context.Context, cfg config.ClientLookup, upstreamsCfg config.Upstreams, bootstrap *Bootstrap, localReverseLookupers ...reverseLookuper, ) (cr *ClientNamesResolver, err error)
NewClientNamesResolver creates new resolver instance.
localReverseLookupers are consulted, in order, for in-memory reverse (IP -> name) resolution before falling back to the configured rDNS upstream.
func (*ClientNamesResolver) FlushCache ¶
func (r *ClientNamesResolver) FlushCache()
FlushCache reset client name cache
func (*ClientNamesResolver) IsEnabled ¶
func (c *ClientNamesResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*ClientNamesResolver) LogConfig ¶
func (r *ClientNamesResolver) LogConfig(logger *logrus.Entry)
LogConfig implements `config.Configurable`.
func (*ClientNamesResolver) Resolve ¶
func (r *ClientNamesResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve tries to resolve the client name from the ip address
type ConditionalUpstreamResolver ¶
type ConditionalUpstreamResolver struct {
NextResolver
// contains filtered or unexported fields
}
ConditionalUpstreamResolver delegates DNS question to other DNS resolver dependent on domain name in question
func NewConditionalUpstreamResolver ¶
func NewConditionalUpstreamResolver( ctx context.Context, cfg config.ConditionalUpstream, upstreamsCfg config.Upstreams, bootstrap *Bootstrap, ) (*ConditionalUpstreamResolver, error)
NewConditionalUpstreamResolver returns new resolver instance
func (*ConditionalUpstreamResolver) IsEnabled ¶
func (c *ConditionalUpstreamResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*ConditionalUpstreamResolver) Resolve ¶
func (r *ConditionalUpstreamResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve uses the conditional resolver to resolve the query
type CustomDNSResolver ¶
type CustomDNSResolver struct {
NextResolver
// contains filtered or unexported fields
}
CustomDNSResolver resolves passed domain name to ip address defined in domain-IP map
func NewCustomDNSResolver ¶
func NewCustomDNSResolver(cfg config.CustomDNS) *CustomDNSResolver
NewCustomDNSResolver creates new resolver instance
func (*CustomDNSResolver) CreateAnswerFromQuestion ¶
func (r *CustomDNSResolver) CreateAnswerFromQuestion(newFunc createAnswerFunc)
func (*CustomDNSResolver) IsEnabled ¶
func (c *CustomDNSResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*CustomDNSResolver) LookupReverse ¶ added in v0.31.0
func (r *CustomDNSResolver) LookupReverse(ip net.IP) []string
LookupReverse returns the domain names mapped to the given IP by the custom DNS configuration, consulting only in-memory data (no network I/O). Returns nil if there is no match.
func (*CustomDNSResolver) Resolve ¶
func (r *CustomDNSResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve uses internal mapping to resolve the query
type DNS64Resolver ¶ added in v0.29.0
type DNS64Resolver struct {
NextResolver
// contains filtered or unexported fields
}
DNS64Resolver synthesizes AAAA records from A records for IPv6-only clients
func (*DNS64Resolver) IsEnabled ¶ added in v0.29.0
func (c *DNS64Resolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*DNS64Resolver) Resolve ¶ added in v0.29.0
func (r *DNS64Resolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve implements the DNS64 resolver logic
type DNSSECResolver ¶ added in v0.28.0
type DNSSECResolver struct {
NextResolver
// contains filtered or unexported fields
}
DNSSECResolver is responsible for DNSSEC validation of DNS responses
func (*DNSSECResolver) IsEnabled ¶ added in v0.28.0
func (c *DNSSECResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*DNSSECResolver) Resolve ¶ added in v0.28.0
func (r *DNSSECResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve validates DNSSEC signatures if validation is enabled
type ECSClientResolver ¶ added in v0.33.0
type ECSClientResolver struct {
NextResolver
// contains filtered or unexported fields
}
ECSClientResolver adopts the EDNS Client Subnet address of a request as the internal client IP (the ecs.useAsClient option).
func (*ECSClientResolver) IsEnabled ¶ added in v0.33.0
func (r *ECSClientResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*ECSClientResolver) LogConfig ¶ added in v0.33.0
func (r *ECSClientResolver) LogConfig(logger *logrus.Entry)
LogConfig implements `config.Configurable`.
func (*ECSClientResolver) Resolve ¶ added in v0.33.0
func (r *ECSClientResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve adopts the request's full-prefix EDNS Client Subnet address as the internal client IP (when ecs.useAsClient is enabled) and delegates to the next resolver.
It must run above the client-name lookup and the cache so the ECS-derived client identity is used for those features and survives cache hits (the cache short-circuits the chain on a hit, so anything below it never runs for cached answers).
type ECSResolver ¶
type ECSResolver struct {
NextResolver
// contains filtered or unexported fields
}
ECSResolver is responsible for adding the EDNS Client Subnet information as EDNS0 option.
func (*ECSResolver) IsEnabled ¶
func (c *ECSResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*ECSResolver) Resolve ¶
Resolve adds, forwards or removes the EDNS Client Subnet option on the request before it is sent upstream. Adopting the ECS subnet as the internal client IP (ecs.useAsClient) is handled separately by the ECSClientResolver, which runs above the client-name lookup and the cache.
type EDEResolver ¶
type EDEResolver struct {
NextResolver
// contains filtered or unexported fields
}
A EDEResolver is responsible for adding the reason for the response as EDNS0 option
func NewEDEResolver ¶
func NewEDEResolver(cfg config.EDE) *EDEResolver
NewEDEResolver creates new resolver instance which adds the reason for the response as EDNS0 option to the response if it is enabled in the configuration
func (*EDEResolver) IsEnabled ¶
func (c *EDEResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*EDEResolver) Resolve ¶
Resolve adds the reason as EDNS0 option to the response of the next resolver if it is enabled in the configuration
type FQDNOnlyResolver ¶
type FQDNOnlyResolver struct {
NextResolver
// contains filtered or unexported fields
}
func NewFQDNOnlyResolver ¶
func NewFQDNOnlyResolver(cfg config.FQDNOnly) *FQDNOnlyResolver
func (*FQDNOnlyResolver) IsEnabled ¶
func (c *FQDNOnlyResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
type FilteringResolver ¶
type FilteringResolver struct {
NextResolver
// contains filtered or unexported fields
}
FilteringResolver filters DNS queries (for example can drop all AAAA query) returns empty ANSWER with NOERROR
func NewFilteringResolver ¶
func NewFilteringResolver(cfg config.Filtering) *FilteringResolver
func (*FilteringResolver) IsEnabled ¶
func (c *FilteringResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
type HostsFileEntry ¶
type HostsFileEntry = parsers.HostsFileEntry
type HostsFileResolver ¶
type HostsFileResolver struct {
NextResolver
// contains filtered or unexported fields
}
func NewHostsFileResolver ¶
func (*HostsFileResolver) IsEnabled ¶
func (c *HostsFileResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*HostsFileResolver) LogConfig ¶
func (r *HostsFileResolver) LogConfig(logger *logrus.Entry)
LogConfig implements `config.Configurable`.
func (*HostsFileResolver) LookupReverse ¶ added in v0.31.0
func (r *HostsFileResolver) LookupReverse(ip net.IP) []string
LookupReverse returns the host names mapped to the given IP by the loaded hosts files, consulting only in-memory data (no network I/O). Returns nil if there is no match.
type MetricsResolver ¶
type MetricsResolver struct {
NextResolver
// contains filtered or unexported fields
}
MetricsResolver resolver that records metrics about requests/response
func NewMetricsResolver ¶
func NewMetricsResolver(cfg config.Metrics) *MetricsResolver
NewMetricsResolver creates a new intance of the MetricsResolver type
func (*MetricsResolver) IsEnabled ¶
func (c *MetricsResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*MetricsResolver) Resolve ¶
func (r *MetricsResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve resolves the passed request
type MockChainedResolver ¶ added in v0.31.0
MockChainedResolver is an autogenerated mock type for the ChainedResolver type
func NewMockChainedResolver ¶ added in v0.31.0
func NewMockChainedResolver(t interface {
mock.TestingT
Cleanup(func())
}) *MockChainedResolver
NewMockChainedResolver creates a new instance of MockChainedResolver. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. The first argument is typically a *testing.T value.
func (*MockChainedResolver) EXPECT ¶ added in v0.31.0
func (_m *MockChainedResolver) EXPECT() *MockChainedResolver_Expecter
func (*MockChainedResolver) GetNext ¶ added in v0.31.0
func (_mock *MockChainedResolver) GetNext() Resolver
GetNext provides a mock function for the type MockChainedResolver
func (*MockChainedResolver) IsEnabled ¶ added in v0.31.0
func (_mock *MockChainedResolver) IsEnabled() bool
IsEnabled provides a mock function for the type MockChainedResolver
func (*MockChainedResolver) LogConfig ¶ added in v0.31.0
func (_mock *MockChainedResolver) LogConfig(logger *logrus.Entry)
LogConfig provides a mock function for the type MockChainedResolver
func (*MockChainedResolver) Next ¶ added in v0.31.0
func (_mock *MockChainedResolver) Next(n Resolver)
Next provides a mock function for the type MockChainedResolver
func (*MockChainedResolver) Resolve ¶ added in v0.31.0
func (_mock *MockChainedResolver) Resolve(ctx context.Context, req *model.Request) (*model.Response, error)
Resolve provides a mock function for the type MockChainedResolver
func (*MockChainedResolver) String ¶ added in v0.31.0
func (_mock *MockChainedResolver) String() string
String provides a mock function for the type MockChainedResolver
func (*MockChainedResolver) Type ¶ added in v0.31.0
func (_mock *MockChainedResolver) Type() string
Type provides a mock function for the type MockChainedResolver
type MockChainedResolver_Expecter ¶ added in v0.31.0
type MockChainedResolver_Expecter struct {
// contains filtered or unexported fields
}
func (*MockChainedResolver_Expecter) GetNext ¶ added in v0.31.0
func (_e *MockChainedResolver_Expecter) GetNext() *MockChainedResolver_GetNext_Call
GetNext is a helper method to define mock.On call
func (*MockChainedResolver_Expecter) IsEnabled ¶ added in v0.31.0
func (_e *MockChainedResolver_Expecter) IsEnabled() *MockChainedResolver_IsEnabled_Call
IsEnabled is a helper method to define mock.On call
func (*MockChainedResolver_Expecter) LogConfig ¶ added in v0.31.0
func (_e *MockChainedResolver_Expecter) LogConfig(logger interface{}) *MockChainedResolver_LogConfig_Call
LogConfig is a helper method to define mock.On call
- logger *logrus.Entry
func (*MockChainedResolver_Expecter) Next ¶ added in v0.31.0
func (_e *MockChainedResolver_Expecter) Next(n interface{}) *MockChainedResolver_Next_Call
Next is a helper method to define mock.On call
- n Resolver
func (*MockChainedResolver_Expecter) Resolve ¶ added in v0.31.0
func (_e *MockChainedResolver_Expecter) Resolve(ctx interface{}, req interface{}) *MockChainedResolver_Resolve_Call
Resolve is a helper method to define mock.On call
- ctx context.Context
- req *model.Request
func (*MockChainedResolver_Expecter) String ¶ added in v0.31.0
func (_e *MockChainedResolver_Expecter) String() *MockChainedResolver_String_Call
String is a helper method to define mock.On call
func (*MockChainedResolver_Expecter) Type ¶ added in v0.31.0
func (_e *MockChainedResolver_Expecter) Type() *MockChainedResolver_Type_Call
Type is a helper method to define mock.On call
type MockChainedResolver_GetNext_Call ¶ added in v0.31.0
MockChainedResolver_GetNext_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetNext'
func (*MockChainedResolver_GetNext_Call) Return ¶ added in v0.31.0
func (_c *MockChainedResolver_GetNext_Call) Return(resolver Resolver) *MockChainedResolver_GetNext_Call
func (*MockChainedResolver_GetNext_Call) Run ¶ added in v0.31.0
func (_c *MockChainedResolver_GetNext_Call) Run(run func()) *MockChainedResolver_GetNext_Call
func (*MockChainedResolver_GetNext_Call) RunAndReturn ¶ added in v0.31.0
func (_c *MockChainedResolver_GetNext_Call) RunAndReturn(run func() Resolver) *MockChainedResolver_GetNext_Call
type MockChainedResolver_IsEnabled_Call ¶ added in v0.31.0
MockChainedResolver_IsEnabled_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsEnabled'
func (*MockChainedResolver_IsEnabled_Call) Return ¶ added in v0.31.0
func (_c *MockChainedResolver_IsEnabled_Call) Return(b bool) *MockChainedResolver_IsEnabled_Call
func (*MockChainedResolver_IsEnabled_Call) Run ¶ added in v0.31.0
func (_c *MockChainedResolver_IsEnabled_Call) Run(run func()) *MockChainedResolver_IsEnabled_Call
func (*MockChainedResolver_IsEnabled_Call) RunAndReturn ¶ added in v0.31.0
func (_c *MockChainedResolver_IsEnabled_Call) RunAndReturn(run func() bool) *MockChainedResolver_IsEnabled_Call
type MockChainedResolver_LogConfig_Call ¶ added in v0.31.0
MockChainedResolver_LogConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LogConfig'
func (*MockChainedResolver_LogConfig_Call) Return ¶ added in v0.31.0
func (_c *MockChainedResolver_LogConfig_Call) Return() *MockChainedResolver_LogConfig_Call
func (*MockChainedResolver_LogConfig_Call) Run ¶ added in v0.31.0
func (_c *MockChainedResolver_LogConfig_Call) Run(run func(logger *logrus.Entry)) *MockChainedResolver_LogConfig_Call
func (*MockChainedResolver_LogConfig_Call) RunAndReturn ¶ added in v0.31.0
func (_c *MockChainedResolver_LogConfig_Call) RunAndReturn(run func(logger *logrus.Entry)) *MockChainedResolver_LogConfig_Call
type MockChainedResolver_Next_Call ¶ added in v0.31.0
MockChainedResolver_Next_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Next'
func (*MockChainedResolver_Next_Call) Return ¶ added in v0.31.0
func (_c *MockChainedResolver_Next_Call) Return() *MockChainedResolver_Next_Call
func (*MockChainedResolver_Next_Call) Run ¶ added in v0.31.0
func (_c *MockChainedResolver_Next_Call) Run(run func(n Resolver)) *MockChainedResolver_Next_Call
func (*MockChainedResolver_Next_Call) RunAndReturn ¶ added in v0.31.0
func (_c *MockChainedResolver_Next_Call) RunAndReturn(run func(n Resolver)) *MockChainedResolver_Next_Call
type MockChainedResolver_Resolve_Call ¶ added in v0.31.0
MockChainedResolver_Resolve_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Resolve'
func (*MockChainedResolver_Resolve_Call) Return ¶ added in v0.31.0
func (_c *MockChainedResolver_Resolve_Call) Return(response *model.Response, err error) *MockChainedResolver_Resolve_Call
func (*MockChainedResolver_Resolve_Call) Run ¶ added in v0.31.0
func (_c *MockChainedResolver_Resolve_Call) Run(run func(ctx context.Context, req *model.Request)) *MockChainedResolver_Resolve_Call
func (*MockChainedResolver_Resolve_Call) RunAndReturn ¶ added in v0.31.0
func (_c *MockChainedResolver_Resolve_Call) RunAndReturn(run func(ctx context.Context, req *model.Request) (*model.Response, error)) *MockChainedResolver_Resolve_Call
type MockChainedResolver_String_Call ¶ added in v0.31.0
MockChainedResolver_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String'
func (*MockChainedResolver_String_Call) Return ¶ added in v0.31.0
func (_c *MockChainedResolver_String_Call) Return(s string) *MockChainedResolver_String_Call
func (*MockChainedResolver_String_Call) Run ¶ added in v0.31.0
func (_c *MockChainedResolver_String_Call) Run(run func()) *MockChainedResolver_String_Call
func (*MockChainedResolver_String_Call) RunAndReturn ¶ added in v0.31.0
func (_c *MockChainedResolver_String_Call) RunAndReturn(run func() string) *MockChainedResolver_String_Call
type MockChainedResolver_Type_Call ¶ added in v0.31.0
MockChainedResolver_Type_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Type'
func (*MockChainedResolver_Type_Call) Return ¶ added in v0.31.0
func (_c *MockChainedResolver_Type_Call) Return(s string) *MockChainedResolver_Type_Call
func (*MockChainedResolver_Type_Call) Run ¶ added in v0.31.0
func (_c *MockChainedResolver_Type_Call) Run(run func()) *MockChainedResolver_Type_Call
func (*MockChainedResolver_Type_Call) RunAndReturn ¶ added in v0.31.0
func (_c *MockChainedResolver_Type_Call) RunAndReturn(run func() string) *MockChainedResolver_Type_Call
type MockDoQUpstreamServer ¶ added in v0.30.0
type MockDoQUpstreamServer struct {
// contains filtered or unexported fields
}
MockDoQUpstreamServer is a mock DNS-over-QUIC server for testing.
func NewMockDoQUpstreamServer ¶ added in v0.30.0
func NewMockDoQUpstreamServer() *MockDoQUpstreamServer
func (*MockDoQUpstreamServer) Close ¶ added in v0.30.0
func (t *MockDoQUpstreamServer) Close()
func (*MockDoQUpstreamServer) GetCallCount ¶ added in v0.30.0
func (t *MockDoQUpstreamServer) GetCallCount() int
func (*MockDoQUpstreamServer) GetConnCount ¶ added in v0.30.0
func (t *MockDoQUpstreamServer) GetConnCount() int
GetConnCount returns the number of QUIC connections accepted by the server.
func (*MockDoQUpstreamServer) Start ¶ added in v0.30.0
func (t *MockDoQUpstreamServer) Start() config.Upstream
func (*MockDoQUpstreamServer) WithAnswerError ¶ added in v0.30.0
func (t *MockDoQUpstreamServer) WithAnswerError(errorCode int) *MockDoQUpstreamServer
func (*MockDoQUpstreamServer) WithAnswerRR ¶ added in v0.30.0
func (t *MockDoQUpstreamServer) WithAnswerRR(answers ...string) *MockDoQUpstreamServer
type MockDoTUpstreamServer ¶ added in v0.32.0
type MockDoTUpstreamServer struct {
// contains filtered or unexported fields
}
MockDoTUpstreamServer is a mock DNS-over-TLS (tcp-tls) server for testing the connection pool. It counts accepted connections (to prove reuse) and served queries, and can close connections after a fixed number of queries to simulate an upstream that drops idle connections.
func NewMockDoTUpstreamServer ¶ added in v0.32.0
func NewMockDoTUpstreamServer() *MockDoTUpstreamServer
func (*MockDoTUpstreamServer) Close ¶ added in v0.32.0
func (t *MockDoTUpstreamServer) Close()
func (*MockDoTUpstreamServer) GetCallCount ¶ added in v0.32.0
func (t *MockDoTUpstreamServer) GetCallCount() int
func (*MockDoTUpstreamServer) GetConnCount ¶ added in v0.32.0
func (t *MockDoTUpstreamServer) GetConnCount() int
GetConnCount returns the number of TLS connections accepted by the server.
func (*MockDoTUpstreamServer) Start ¶ added in v0.32.0
func (t *MockDoTUpstreamServer) Start() config.Upstream
func (*MockDoTUpstreamServer) WithAnswerError ¶ added in v0.32.0
func (t *MockDoTUpstreamServer) WithAnswerError(errorCode int) *MockDoTUpstreamServer
func (*MockDoTUpstreamServer) WithAnswerRR ¶ added in v0.32.0
func (t *MockDoTUpstreamServer) WithAnswerRR(answers ...string) *MockDoTUpstreamServer
func (*MockDoTUpstreamServer) WithCloseAfter ¶ added in v0.32.0
func (t *MockDoTUpstreamServer) WithCloseAfter(n int) *MockDoTUpstreamServer
WithCloseAfter makes the server close each connection after serving n queries, simulating an upstream that drops idle/old connections.
type MockUDPUpstreamServer ¶
type MockUDPUpstreamServer struct {
// contains filtered or unexported fields
}
func NewMockUDPUpstreamServer ¶
func NewMockUDPUpstreamServer() *MockUDPUpstreamServer
func (*MockUDPUpstreamServer) Close ¶
func (t *MockUDPUpstreamServer) Close()
func (*MockUDPUpstreamServer) GetCallCount ¶
func (t *MockUDPUpstreamServer) GetCallCount() int
func (*MockUDPUpstreamServer) ResetCallCount ¶
func (t *MockUDPUpstreamServer) ResetCallCount()
func (*MockUDPUpstreamServer) Start ¶
func (t *MockUDPUpstreamServer) Start() config.Upstream
func (*MockUDPUpstreamServer) WithAnswerError ¶
func (t *MockUDPUpstreamServer) WithAnswerError(errorCode int) *MockUDPUpstreamServer
func (*MockUDPUpstreamServer) WithAnswerFn ¶
func (t *MockUDPUpstreamServer) WithAnswerFn(fn func(request *dns.Msg) (response *dns.Msg)) *MockUDPUpstreamServer
func (*MockUDPUpstreamServer) WithAnswerMsg ¶
func (t *MockUDPUpstreamServer) WithAnswerMsg(answer *dns.Msg) *MockUDPUpstreamServer
func (*MockUDPUpstreamServer) WithAnswerRR ¶
func (t *MockUDPUpstreamServer) WithAnswerRR(answers ...string) *MockUDPUpstreamServer
func (*MockUDPUpstreamServer) WithDelay ¶
func (t *MockUDPUpstreamServer) WithDelay(delay time.Duration) *MockUDPUpstreamServer
type NamedResolver ¶
type NamedResolver interface {
// Name returns the full name of the resolver
Name() string
}
NamedResolver is a resolver with a special name
type NextResolver ¶
type NextResolver struct {
// contains filtered or unexported fields
}
NextResolver is the base implementation of ChainedResolver
func (*NextResolver) GetNext ¶
func (r *NextResolver) GetNext() Resolver
GetNext returns the next resolver
type NoOpResolver ¶
type NoOpResolver struct{}
NoOpResolver is used to finish a resolver branch as created in RewriterResolver
func NewNoOpResolver ¶
func NewNoOpResolver() *NoOpResolver
func (NoOpResolver) IsEnabled ¶
func (NoOpResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (NoOpResolver) LogConfig ¶
func (NoOpResolver) LogConfig(*logrus.Entry)
LogConfig implements `config.Configurable`.
func (NoOpResolver) String ¶
func (r NoOpResolver) String() string
String implements `fmt.Stringer`.
type ParallelBestResolver ¶
type ParallelBestResolver struct {
// contains filtered or unexported fields
}
ParallelBestResolver delegates the DNS message to 2 upstream resolvers and returns the fastest answer
func NewParallelBestResolver ¶
func NewParallelBestResolver( ctx context.Context, cfg config.UpstreamGroup, bootstrap *Bootstrap, ) (*ParallelBestResolver, error)
NewParallelBestResolver creates new resolver instance
func (*ParallelBestResolver) IsEnabled ¶
func (c *ParallelBestResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*ParallelBestResolver) Name ¶
func (r *ParallelBestResolver) Name() string
func (*ParallelBestResolver) Resolve ¶
func (r *ParallelBestResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve sends the query request to multiple upstream resolvers and returns the fastest result
func (*ParallelBestResolver) String ¶
func (r *ParallelBestResolver) String() string
type QueryLoggingResolver ¶
type QueryLoggingResolver struct {
NextResolver
// contains filtered or unexported fields
}
QueryLoggingResolver writes query information (question, answer, duration, ...)
func NewQueryLoggingResolver ¶
func NewQueryLoggingResolver(ctx context.Context, cfg config.QueryLog) (*QueryLoggingResolver, error)
NewQueryLoggingResolver returns a new resolver instance
func (*QueryLoggingResolver) IsEnabled ¶
func (c *QueryLoggingResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*QueryLoggingResolver) Resolve ¶
func (r *QueryLoggingResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve logs the query, duration and the result
type RateLimitingResolver ¶ added in v0.31.0
type RateLimitingResolver struct {
NextResolver
// contains filtered or unexported fields
}
func NewRateLimitingResolver ¶ added in v0.31.0
func NewRateLimitingResolver(ctx context.Context, cfg config.RateLimit) *RateLimitingResolver
func (*RateLimitingResolver) IsEnabled ¶ added in v0.31.0
func (c *RateLimitingResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*RateLimitingResolver) LogConfig ¶ added in v0.31.0
LogConfig implements `config.Configurable`.
type RebindingProtectionResolver ¶ added in v0.32.0
type RebindingProtectionResolver struct {
NextResolver
// contains filtered or unexported fields
}
RebindingProtectionResolver drops answers that contain private, loopback, link-local or unspecified IPs for non-allowlisted domains (DNS rebinding protection).
It sits above the blocking resolver and the cache in the chain. Only RESOLVED and CACHED responses are inspected: answers from conditional upstreams, custom DNS, the hosts file, special-use domain handling and blocking are recognized by response type and pass through untouched. Sitting above the cache means cached answers — including entries synced from redis — are re-inspected on every hit; the cache in turn stores only upstream-derived answers (see isCacheableResponseType), so CACHED implies upstream origin. Internal lookups (e.g. blocking's FQDN client identifiers) enter the chain below this resolver and bypass it entirely.
Known gap: DNS64-synthesized answers (SYNTHESIZED) are upstream-derived but pass through uninspected — see the NAT64/DNS64 note in the rebinding documentation.
func NewRebindingProtectionResolver ¶ added in v0.32.0
func NewRebindingProtectionResolver(cfg config.RebindingProtection) *RebindingProtectionResolver
NewRebindingProtectionResolver returns a new resolver instance
func (*RebindingProtectionResolver) IsEnabled ¶ added in v0.32.0
func (c *RebindingProtectionResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*RebindingProtectionResolver) LogConfig ¶ added in v0.32.0
LogConfig implements `config.Configurable`.
func (*RebindingProtectionResolver) Resolve ¶ added in v0.32.0
func (r *RebindingProtectionResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve inspects the next resolver's answer and replaces it with an empty FILTERED response if it contains a non-public IP.
type Resolver ¶
type Resolver interface {
config.Configurable
fmt.Stringer
// Type returns a short, user-friendly, name for the resolver.
//
// It should be the same for all instances of a specific Resolver type.
Type() string
// Resolve performs resolution of a DNS request
Resolve(ctx context.Context, req *model.Request) (*model.Response, error)
}
Resolver generic interface for all resolvers
type SpecialUseDomainNamesResolver ¶
type SpecialUseDomainNamesResolver struct {
NextResolver
// contains filtered or unexported fields
}
func NewSpecialUseDomainNamesResolver ¶
func NewSpecialUseDomainNamesResolver(cfg config.SUDN) *SpecialUseDomainNamesResolver
func (*SpecialUseDomainNamesResolver) IsEnabled ¶
func (c *SpecialUseDomainNamesResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
type StatsResolver ¶ added in v0.32.0
type StatsResolver struct {
NextResolver
// contains filtered or unexported fields
}
StatsResolver collects in-memory query statistics over a 24h window and exposes them via the stats.Result snapshot. It sits at the top of the chain so it observes every query's final disposition (including drops/filtered).
func NewStatsResolver ¶ added in v0.32.0
func NewStatsResolver(ctx context.Context, cfg config.Statistics) *StatsResolver
NewStatsResolver creates a StatsResolver. When disabled it allocates no collector and starts no goroutine; Resolve is a pass-through. When enabled, the consumer goroutine and event-bus subscriptions are released when ctx is cancelled.
func (*StatsResolver) IsEnabled ¶ added in v0.32.0
func (c *StatsResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*StatsResolver) Resolve ¶ added in v0.32.0
func (r *StatsResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve forwards the request and records the outcome (when enabled).
func (*StatsResolver) Stats ¶ added in v0.32.0
func (r *StatsResolver) Stats() stats.Result
Stats returns the current snapshot (empty when disabled).
func (*StatsResolver) StatsEnabled ¶ added in v0.32.0
func (r *StatsResolver) StatsEnabled() bool
StatsEnabled reports whether statistics collection is active.
type StrictResolver ¶
type StrictResolver struct {
// contains filtered or unexported fields
}
StrictResolver delegates the DNS message strictly to the first configured upstream resolver if it can't provide the answer in time the next resolver is used
func NewStrictResolver ¶
func NewStrictResolver( ctx context.Context, cfg config.UpstreamGroup, bootstrap *Bootstrap, ) (*StrictResolver, error)
NewStrictResolver creates a new strict resolver instance
func (*StrictResolver) IsEnabled ¶
func (c *StrictResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*StrictResolver) Name ¶
func (r *StrictResolver) Name() string
func (*StrictResolver) Resolve ¶
func (r *StrictResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)
Resolve sends the query request in a strict order to the upstream resolvers
func (*StrictResolver) String ¶
func (r *StrictResolver) String() string
type UpstreamResolver ¶
type UpstreamResolver struct {
// contains filtered or unexported fields
}
UpstreamResolver sends request to external DNS server
func NewUpstreamResolver ¶
func NewUpstreamResolver( ctx context.Context, cfg upstreamConfig, bootstrap *Bootstrap, ) (*UpstreamResolver, error)
NewUpstreamResolver creates new resolver instance
func (*UpstreamResolver) IsEnabled ¶
func (c *UpstreamResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*UpstreamResolver) Resolve ¶
func (r *UpstreamResolver) Resolve(ctx context.Context, request *model.Request) (response *model.Response, err error)
Resolve calls external resolver
func (UpstreamResolver) String ¶
func (r UpstreamResolver) String() string
func (*UpstreamResolver) Type ¶
func (t *UpstreamResolver) Type() string
Type implements `Resolver`.
func (UpstreamResolver) Upstream ¶
func (r UpstreamResolver) Upstream() config.Upstream
type UpstreamServerError ¶
UpstreamServerError wraps a response with RCode ServFail so no other resolver tries to use it.
func (*UpstreamServerError) Error ¶
func (e *UpstreamServerError) Error() string
type UpstreamTreeResolver ¶
type UpstreamTreeResolver struct {
// contains filtered or unexported fields
}
func (*UpstreamTreeResolver) IsEnabled ¶
func (c *UpstreamTreeResolver) IsEnabled() bool
IsEnabled implements `config.Configurable`.
func (*UpstreamTreeResolver) Name ¶
func (r *UpstreamTreeResolver) Name() string
func (*UpstreamTreeResolver) String ¶
func (r *UpstreamTreeResolver) String() string
Source Files
¶
- blocking_resolver.go
- bootstrap.go
- caching_resolver.go
- client_names_resolver.go
- conditional_upstream_resolver.go
- connpool.go
- custom_dns_resolver.go
- dns64_resolver.go
- dnssec_resolver.go
- domain_search.go
- ecs_resolver.go
- ede_resolver.go
- filtering_resolver.go
- fqdn_only_resolver.go
- hosts_file_resolver.go
- metrics_resolver.go
- mock_doq_upstream_server.go
- mock_dot_upstream_server.go
- mock_udp_upstream_server.go
- mock_upstream_common.go
- mocks.go
- noop_resolver.go
- parallel_best_resolver.go
- query_logging_resolver.go
- quic_upstream_client.go
- rate_limit_store.go
- rate_limiting_resolver.go
- rebinding_resolver.go
- resolver.go
- rewrite_helper.go
- stats_resolver.go
- strict_resolver.go
- sudn_resolver.go
- upstream_resolver.go
- upstream_tree_resolver.go