Files
gluetun/internal/dns/settings.go

126 lines
3.8 KiB
Go
Raw Normal View History

2021-07-23 18:55:53 +00:00
package dns
import (
"context"
"fmt"
"net/netip"
2021-07-23 18:55:53 +00:00
2025-11-05 21:21:16 +00:00
"github.com/qdm12/dns/v2/pkg/doh"
"github.com/qdm12/dns/v2/pkg/dot"
cachemiddleware "github.com/qdm12/dns/v2/pkg/middlewares/cache"
"github.com/qdm12/dns/v2/pkg/middlewares/cache/lru"
filtermiddleware "github.com/qdm12/dns/v2/pkg/middlewares/filter"
"github.com/qdm12/dns/v2/pkg/middlewares/filter/mapfilter"
"github.com/qdm12/dns/v2/pkg/middlewares/localdns"
"github.com/qdm12/dns/v2/pkg/plain"
"github.com/qdm12/dns/v2/pkg/provider"
2024-10-25 14:01:29 +00:00
"github.com/qdm12/dns/v2/pkg/server"
"github.com/qdm12/gluetun/internal/configuration/settings"
2021-07-23 18:55:53 +00:00
)
func (l *Loop) GetSettings() (settings settings.DNS) { return l.state.GetSettings() }
2021-07-23 18:55:53 +00:00
func (l *Loop) SetSettings(ctx context.Context, settings settings.DNS) (
2024-10-11 19:20:48 +00:00
outcome string,
) {
2021-07-23 18:55:53 +00:00
return l.state.SetSettings(ctx, settings)
}
func buildServerSettings(settings settings.DNS,
filter *mapfilter.Filter, localResolvers []netip.Addr,
logger Logger) (
2024-10-25 14:01:29 +00:00
serverSettings server.Settings, err error,
2024-10-11 19:20:48 +00:00
) {
2024-10-25 14:01:29 +00:00
serverSettings.Logger = logger
providersData := provider.NewProviders()
upstreamResolvers := make([]provider.Provider, len(settings.Providers))
for i := range settings.Providers {
2024-10-25 14:01:29 +00:00
var err error
upstreamResolvers[i], err = providersData.Get(settings.Providers[i])
2024-10-25 14:01:29 +00:00
if err != nil {
panic(err) // this should already had been checked
}
}
ipVersion := "ipv4"
if *settings.IPv6 {
ipVersion = "ipv6"
2024-10-25 14:01:29 +00:00
}
var dialer server.Dialer
switch settings.UpstreamType {
case "dot":
dialerSettings := dot.Settings{
UpstreamResolvers: upstreamResolvers,
IPVersion: ipVersion,
}
dialer, err = dot.New(dialerSettings)
if err != nil {
return server.Settings{}, fmt.Errorf("creating DNS over TLS dialer: %w", err)
}
2025-11-05 21:21:16 +00:00
case "doh":
dialerSettings := doh.Settings{
UpstreamResolvers: upstreamResolvers,
IPVersion: ipVersion,
}
dialer, err = doh.New(dialerSettings)
if err != nil {
return server.Settings{}, fmt.Errorf("creating DNS over HTTPS dialer: %w", err)
}
case "plain":
dialerSettings := plain.Settings{
UpstreamResolvers: upstreamResolvers,
IPVersion: ipVersion,
}
dialer, err = plain.New(dialerSettings)
if err != nil {
return server.Settings{}, fmt.Errorf("creating plain DNS dialer: %w", err)
}
default:
panic("unknown upstream type: " + settings.UpstreamType)
2024-10-25 14:01:29 +00:00
}
serverSettings.Dialer = dialer
if *settings.Caching {
lruCache, err := lru.New(lru.Settings{})
if err != nil {
2024-10-25 14:01:29 +00:00
return server.Settings{}, fmt.Errorf("creating LRU cache: %w", err)
}
cacheMiddleware, err := cachemiddleware.New(cachemiddleware.Settings{
Cache: lruCache,
})
if err != nil {
2024-10-25 14:01:29 +00:00
return server.Settings{}, fmt.Errorf("creating cache middleware: %w", err)
}
2024-10-25 14:01:29 +00:00
serverSettings.Middlewares = append(serverSettings.Middlewares, cacheMiddleware)
}
filterMiddleware, err := filtermiddleware.New(filtermiddleware.Settings{
Filter: filter,
})
if err != nil {
2024-10-25 14:01:29 +00:00
return server.Settings{}, fmt.Errorf("creating filter middleware: %w", err)
}
2024-10-25 14:01:29 +00:00
serverSettings.Middlewares = append(serverSettings.Middlewares, filterMiddleware)
localResolversAddrPorts := make([]netip.AddrPort, len(localResolvers))
const defaultDNSPort = 53
for i, addr := range localResolvers {
localResolversAddrPorts[i] = netip.AddrPortFrom(addr, defaultDNSPort)
}
localDNSMiddleware, err := localdns.New(localdns.Settings{
Resolvers: localResolversAddrPorts, // auto-detected at container start only
Logger: logger,
})
if err != nil {
return server.Settings{}, fmt.Errorf("creating local DNS middleware: %w", err)
}
// Place after cache middleware, since we want to avoid caching for local
// hostnames that may change regularly.
// Place after filter middleware to avoid conflicts with the rebinding protection.
serverSettings.Middlewares = append(serverSettings.Middlewares, localDNSMiddleware)
2024-10-25 14:01:29 +00:00
return serverSettings, nil
}