resolver

package
v0.33.0 Latest Latest
Warning

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

Go to latest
Published: Jun 30, 2026 License: Apache-2.0 Imports: 59 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// WellKnownDNS64Prefix Well-known DNS64 prefix (RFC 6052)
	WellKnownDNS64Prefix = "64:ff9b::/96"
)

Variables

View Source
var ErrRateLimited = errors.New("client rate-limited")

ErrRateLimited signals that handleReq must write no response.

View Source
var NoResponse = &model.Response{} //nolint:gochecknoglobals

Functions

func ForEach

func ForEach(resolver Resolver, callback func(Resolver))

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 GetQueryLoggingWriter(ctx context.Context, cfg config.QueryLog, instanceID string) (querylog.Writer, error)

func LogResolverConfig

func LogResolverConfig(res Resolver, logger *logrus.Entry)

LogResolverConfig logs the resolver's type and config.

func Name

func Name(resolver Resolver) string

Name returns a user-friendly name of a resolver

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

func (*BlockingResolver) String

func (t *BlockingResolver) String() string

String implements `fmt.Stringer`.

func (*BlockingResolver) Type

func (t *BlockingResolver) Type() string

Type implements `Resolver`.

type Bootstrap

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

Bootstrap allows resolving hostnames using the configured bootstrap DNS.

func NewBootstrap

func NewBootstrap(ctx context.Context, cfg *config.Config) (b *Bootstrap, err error)

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) LogConfig

func (c *Bootstrap) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*Bootstrap) NewHTTPTransport

func (b *Bootstrap) NewHTTPTransport() *http.Transport

NewHTTPTransport returns a new http.Transport that uses b to resolve hostnames

func (*Bootstrap) Resolve

func (b *Bootstrap) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)

func (*Bootstrap) String

func (t *Bootstrap) String() string

String implements `fmt.Stringer`.

func (*Bootstrap) Type

func (t *Bootstrap) Type() string

Type implements `Resolver`.

func (*Bootstrap) UpstreamIPs

func (b *Bootstrap) UpstreamIPs(ctx context.Context, r *UpstreamResolver) (*IPSet, error)

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

func (*CachingResolver) String

func (t *CachingResolver) String() string

String implements `fmt.Stringer`.

func (*CachingResolver) Type

func (t *CachingResolver) Type() string

Type implements `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 Chain

func Chain(resolvers ...Resolver) ChainedResolver

Chain creates a chain of resolvers

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

func (*ClientNamesResolver) String

func (t *ClientNamesResolver) String() string

String implements `fmt.Stringer`.

func (*ClientNamesResolver) Type

func (t *ClientNamesResolver) Type() string

Type implements `Resolver`.

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) LogConfig

func (c *ConditionalUpstreamResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*ConditionalUpstreamResolver) Resolve

Resolve uses the conditional resolver to resolve the query

func (*ConditionalUpstreamResolver) String

func (t *ConditionalUpstreamResolver) String() string

String implements `fmt.Stringer`.

func (*ConditionalUpstreamResolver) Type

func (t *ConditionalUpstreamResolver) Type() string

Type implements `Resolver`.

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) LogConfig

func (c *CustomDNSResolver) LogConfig(logger *logrus.Entry)

LogConfig 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

func (*CustomDNSResolver) String

func (t *CustomDNSResolver) String() string

String implements `fmt.Stringer`.

func (*CustomDNSResolver) Type

func (t *CustomDNSResolver) Type() string

Type implements `Resolver`.

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) LogConfig added in v0.29.0

func (c *DNS64Resolver) LogConfig(logger *logrus.Entry)

LogConfig 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

func (*DNS64Resolver) String added in v0.29.0

func (t *DNS64Resolver) String() string

String implements `fmt.Stringer`.

func (*DNS64Resolver) Type added in v0.29.0

func (t *DNS64Resolver) Type() string

Type implements `Resolver`.

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) LogConfig added in v0.28.0

func (c *DNSSECResolver) LogConfig(logger *logrus.Entry)

LogConfig 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

func (*DNSSECResolver) String added in v0.28.0

func (t *DNSSECResolver) String() string

String implements `fmt.Stringer`.

func (*DNSSECResolver) Type added in v0.28.0

func (t *DNSSECResolver) Type() string

Type implements `Resolver`.

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).

func (*ECSClientResolver) String added in v0.33.0

func (t *ECSClientResolver) String() string

String implements `fmt.Stringer`.

func (*ECSClientResolver) Type added in v0.33.0

func (t *ECSClientResolver) Type() string

Type implements `Resolver`.

type ECSMask

type ECSMask interface {
	config.ECSv4Mask | config.ECSv6Mask
}

ECSMask is an interface for all ECS subnet masks as type constraint for generics

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) LogConfig

func (c *ECSResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*ECSResolver) Resolve

func (r *ECSResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)

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.

func (*ECSResolver) String

func (t *ECSResolver) String() string

String implements `fmt.Stringer`.

func (*ECSResolver) Type

func (t *ECSResolver) Type() string

Type implements `Resolver`.

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) LogConfig

func (c *EDEResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*EDEResolver) Resolve

func (r *EDEResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)

Resolve adds the reason as EDNS0 option to the response of the next resolver if it is enabled in the configuration

func (*EDEResolver) String

func (t *EDEResolver) String() string

String implements `fmt.Stringer`.

func (*EDEResolver) Type

func (t *EDEResolver) Type() string

Type implements `Resolver`.

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`.

func (*FQDNOnlyResolver) LogConfig

func (c *FQDNOnlyResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*FQDNOnlyResolver) Resolve

func (r *FQDNOnlyResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)

func (*FQDNOnlyResolver) String

func (t *FQDNOnlyResolver) String() string

String implements `fmt.Stringer`.

func (*FQDNOnlyResolver) Type

func (t *FQDNOnlyResolver) Type() string

Type implements `Resolver`.

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`.

func (*FilteringResolver) LogConfig

func (c *FilteringResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*FilteringResolver) Resolve

func (r *FilteringResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)

func (*FilteringResolver) String

func (t *FilteringResolver) String() string

String implements `fmt.Stringer`.

func (*FilteringResolver) Type

func (t *FilteringResolver) Type() string

Type implements `Resolver`.

type HostsFileEntry

type HostsFileEntry = parsers.HostsFileEntry

type HostsFileResolver

type HostsFileResolver struct {
	NextResolver
	// contains filtered or unexported fields
}

func NewHostsFileResolver

func NewHostsFileResolver(ctx context.Context,
	cfg config.HostsFile,
	bootstrap *Bootstrap,
) (*HostsFileResolver, error)

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.

func (*HostsFileResolver) Resolve

func (r *HostsFileResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)

func (*HostsFileResolver) String

func (t *HostsFileResolver) String() string

String implements `fmt.Stringer`.

func (*HostsFileResolver) Type

func (t *HostsFileResolver) Type() string

Type implements `Resolver`.

type IPSet

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

func (*IPSet) Current

func (ips *IPSet) Current() net.IP

func (*IPSet) Next

func (ips *IPSet) Next()

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) LogConfig

func (c *MetricsResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*MetricsResolver) Resolve

func (r *MetricsResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)

Resolve resolves the passed request

func (*MetricsResolver) String

func (t *MetricsResolver) String() string

String implements `fmt.Stringer`.

func (*MetricsResolver) Type

func (t *MetricsResolver) Type() string

Type implements `Resolver`.

type MockChainedResolver added in v0.31.0

type MockChainedResolver struct {
	mock.Mock
}

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 (*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

GetNext is a helper method to define mock.On call

func (*MockChainedResolver_Expecter) IsEnabled added in v0.31.0

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

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

String is a helper method to define mock.On call

func (*MockChainedResolver_Expecter) Type added in v0.31.0

Type is a helper method to define mock.On call

type MockChainedResolver_GetNext_Call added in v0.31.0

type MockChainedResolver_GetNext_Call struct {
	*mock.Call
}

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 (*MockChainedResolver_GetNext_Call) Run added in v0.31.0

func (*MockChainedResolver_GetNext_Call) RunAndReturn added in v0.31.0

type MockChainedResolver_IsEnabled_Call added in v0.31.0

type MockChainedResolver_IsEnabled_Call struct {
	*mock.Call
}

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 (*MockChainedResolver_IsEnabled_Call) Run added in v0.31.0

func (*MockChainedResolver_IsEnabled_Call) RunAndReturn added in v0.31.0

type MockChainedResolver_LogConfig_Call added in v0.31.0

type MockChainedResolver_LogConfig_Call struct {
	*mock.Call
}

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 (*MockChainedResolver_LogConfig_Call) Run added in v0.31.0

func (*MockChainedResolver_LogConfig_Call) RunAndReturn added in v0.31.0

type MockChainedResolver_Next_Call added in v0.31.0

type MockChainedResolver_Next_Call struct {
	*mock.Call
}

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 (*MockChainedResolver_Next_Call) Run added in v0.31.0

func (*MockChainedResolver_Next_Call) RunAndReturn added in v0.31.0

type MockChainedResolver_Resolve_Call added in v0.31.0

type MockChainedResolver_Resolve_Call struct {
	*mock.Call
}

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 (*MockChainedResolver_Resolve_Call) Run added in v0.31.0

func (*MockChainedResolver_Resolve_Call) RunAndReturn added in v0.31.0

type MockChainedResolver_String_Call added in v0.31.0

type MockChainedResolver_String_Call struct {
	*mock.Call
}

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 (*MockChainedResolver_String_Call) Run added in v0.31.0

func (*MockChainedResolver_String_Call) RunAndReturn added in v0.31.0

type MockChainedResolver_Type_Call added in v0.31.0

type MockChainedResolver_Type_Call struct {
	*mock.Call
}

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 (*MockChainedResolver_Type_Call) Run added in v0.31.0

func (*MockChainedResolver_Type_Call) RunAndReturn added in v0.31.0

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 (*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 (*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 (*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

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

func (*NextResolver) Next

func (r *NextResolver) Next(n Resolver)

Next sets 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) Resolve

func (NoOpResolver) String

func (r NoOpResolver) String() string

String implements `fmt.Stringer`.

func (NoOpResolver) Type

func (NoOpResolver) Type() string

Type implements `Resolver`.

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) LogConfig

func (c *ParallelBestResolver) LogConfig(logger *logrus.Entry)

LogConfig 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

func (*ParallelBestResolver) Type

func (t *ParallelBestResolver) Type() string

Type implements `Resolver`.

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) LogConfig

func (c *QueryLoggingResolver) LogConfig(logger *logrus.Entry)

LogConfig 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

func (*QueryLoggingResolver) String

func (t *QueryLoggingResolver) String() string

String implements `fmt.Stringer`.

func (*QueryLoggingResolver) Type

func (t *QueryLoggingResolver) Type() string

Type implements `Resolver`.

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

func (c *RateLimitingResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*RateLimitingResolver) Resolve added in v0.31.0

func (*RateLimitingResolver) String added in v0.31.0

func (t *RateLimitingResolver) String() string

String implements `fmt.Stringer`.

func (*RateLimitingResolver) Type added in v0.31.0

func (t *RateLimitingResolver) Type() string

Type implements `Resolver`.

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

func (c *RebindingProtectionResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*RebindingProtectionResolver) Resolve added in v0.32.0

Resolve inspects the next resolver's answer and replaces it with an empty FILTERED response if it contains a non-public IP.

func (*RebindingProtectionResolver) String added in v0.32.0

func (t *RebindingProtectionResolver) String() string

String implements `fmt.Stringer`.

func (*RebindingProtectionResolver) Type added in v0.32.0

func (t *RebindingProtectionResolver) Type() string

Type implements `Resolver`.

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

func NewUpstreamTreeResolver

func NewUpstreamTreeResolver(ctx context.Context, cfg config.Upstreams, bootstrap *Bootstrap) (Resolver, error)

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`.

func (*SpecialUseDomainNamesResolver) LogConfig

func (c *SpecialUseDomainNamesResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*SpecialUseDomainNamesResolver) Resolve

func (*SpecialUseDomainNamesResolver) String

func (t *SpecialUseDomainNamesResolver) String() string

String implements `fmt.Stringer`.

func (*SpecialUseDomainNamesResolver) Type

func (t *SpecialUseDomainNamesResolver) Type() string

Type implements `Resolver`.

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) LogConfig added in v0.32.0

func (c *StatsResolver) LogConfig(logger *logrus.Entry)

LogConfig 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.

func (*StatsResolver) String added in v0.32.0

func (t *StatsResolver) String() string

String implements `fmt.Stringer`.

func (*StatsResolver) Type added in v0.32.0

func (t *StatsResolver) Type() string

Type implements `Resolver`.

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) LogConfig

func (c *StrictResolver) LogConfig(logger *logrus.Entry)

LogConfig 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

func (*StrictResolver) Type

func (t *StrictResolver) Type() string

Type implements `Resolver`.

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) LogConfig

func (c *UpstreamResolver) LogConfig(logger *logrus.Entry)

LogConfig 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

type UpstreamServerError struct {
	Msg *dns.Msg
}

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) LogConfig

func (c *UpstreamTreeResolver) LogConfig(logger *logrus.Entry)

LogConfig implements `config.Configurable`.

func (*UpstreamTreeResolver) Name

func (r *UpstreamTreeResolver) Name() string

func (*UpstreamTreeResolver) Resolve

func (r *UpstreamTreeResolver) Resolve(ctx context.Context, request *model.Request) (*model.Response, error)

func (*UpstreamTreeResolver) String

func (r *UpstreamTreeResolver) String() string

func (*UpstreamTreeResolver) Type

func (t *UpstreamTreeResolver) Type() string

Type implements `Resolver`.

Directories

Path Synopsis
Package dnssec implements DNSSEC validation per RFC 4033, 4034, 4035, and 5155.
Package dnssec implements DNSSEC validation per RFC 4033, 4034, 4035, and 5155.

Jump to

Keyboard shortcuts

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