mirror of
https://github.com/qdm12/gluetun.git
synced 2026-05-06 20:10:11 +02:00
4ea2337668
- force to set `DNS_UPSTREAM_RESOLVER_TYPE=plain` to avoid any confusion/security hole - force to set `DNS_UPSTREAM_PLAIN_ADDRESSES` to addresses only with port 53
71 lines
1.9 KiB
Go
71 lines
1.9 KiB
Go
package dns
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/netip"
|
|
|
|
"github.com/qdm12/dns/v2/pkg/middlewares/filter/update"
|
|
"github.com/qdm12/dns/v2/pkg/nameserver"
|
|
"github.com/qdm12/dns/v2/pkg/server"
|
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
|
)
|
|
|
|
func (l *Loop) setupServer(ctx context.Context, settings settings.DNS) (runError <-chan error, err error) {
|
|
var updateSettings update.Settings
|
|
updateSettings.SetRebindingProtectionExempt(settings.Blacklist.RebindingProtectionExemptHostnames)
|
|
err = l.filter.Update(updateSettings)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("updating filter for rebinding protection: %w", err)
|
|
}
|
|
|
|
serverSettings, err := buildServerSettings(settings, l.filter, l.localResolvers, l.localSubnets, l.logger)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("building server settings: %w", err)
|
|
}
|
|
|
|
server, err := server.New(serverSettings)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("creating server: %w", err)
|
|
}
|
|
|
|
runError, err = server.Start(ctx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("starting server: %w", err)
|
|
}
|
|
l.server = server
|
|
|
|
// use internal DNS server
|
|
nameserver.UseDNSInternally(nameserver.SettingsInternalDNS{})
|
|
err = nameserver.UseDNSSystemWide(nameserver.SettingsSystemDNS{
|
|
ResolvPath: l.resolvConf,
|
|
})
|
|
if err != nil {
|
|
l.logger.Error(err.Error())
|
|
}
|
|
|
|
return runError, nil
|
|
}
|
|
|
|
func (l *Loop) usePlainServers(addrPorts []netip.AddrPort) (err error) {
|
|
nameserver.UseDNSInternally(nameserver.SettingsInternalDNS{
|
|
AddrPort: addrPorts[0],
|
|
})
|
|
addresses := make([]netip.Addr, len(addrPorts))
|
|
for i, addrPort := range addrPorts {
|
|
const defaultDNSPort = 53
|
|
if addrPort.Port() != defaultDNSPort {
|
|
return fmt.Errorf("invalid DNS port: %d, must be %d", addrPort.Port(), defaultDNSPort)
|
|
}
|
|
addresses[i] = addrPort.Addr()
|
|
}
|
|
err = nameserver.UseDNSSystemWide(nameserver.SettingsSystemDNS{
|
|
IPs: addresses,
|
|
ResolvPath: l.resolvConf,
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("using DNS system wide: %w", err)
|
|
}
|
|
return nil
|
|
}
|