Fix #156 falls back to dns on ipv4 only

This commit is contained in:
Quentin McGaw
2020-05-09 00:54:49 +00:00
parent b45fa026dd
commit 5eb1859f41

View File

@@ -387,19 +387,20 @@ func onConnected(ctx context.Context, allSettings settings.Settings,
} }
} }
func fallbackToUnencryptedDNS(dnsConf dns.Configurator, provider models.DNSProvider, ipv6 bool) error { func fallbackToUnencryptedIPv4DNS(dnsConf dns.Configurator, providers []models.DNSProvider) error {
targetDNS := constants.DNSProviderMapping()[provider]
var targetIP net.IP var targetIP net.IP
for _, targetIP = range targetDNS.IPs { for _, provider := range providers {
if ipv6 && targetIP.To4() == nil { data := constants.DNSProviderMapping()[provider]
break for _, targetIP = range data.IPs {
} else if !ipv6 && targetIP.To4() != nil { if targetIP.To4() != nil {
break
}
}
dnsConf.UseDNSInternally(targetIP) dnsConf.UseDNSInternally(targetIP)
return dnsConf.UseDNSSystemWide(targetIP) return dnsConf.UseDNSSystemWide(targetIP)
} }
}
}
// No IPv4 address found
return fmt.Errorf("no ipv4 DNS address found for providers %s", providers)
}
func unboundRun(ctx, oldCtx context.Context, oldCancel context.CancelFunc, timer *time.Timer, func unboundRun(ctx, oldCtx context.Context, oldCancel context.CancelFunc, timer *time.Timer,
dnsConf dns.Configurator, settings settings.DNS, uid, gid int, dnsConf dns.Configurator, settings settings.DNS, uid, gid int,
@@ -461,7 +462,7 @@ func unboundRunLoop(ctx context.Context, logger logging.Logger, dnsConf dns.Conf
waiter command.Waiter, streamMerger command.StreamMerger, httpServer server.Server, waiter command.Waiter, streamMerger command.StreamMerger, httpServer server.Server,
) { ) {
logger = logger.WithPrefix("unbound dns over tls setup: ") logger = logger.WithPrefix("unbound dns over tls setup: ")
if err := fallbackToUnencryptedDNS(dnsConf, settings.Providers[0], settings.IPv6); err != nil { if err := fallbackToUnencryptedIPv4DNS(dnsConf, settings.Providers); err != nil {
logger.Error(err) logger.Error(err)
} }
var timer *time.Timer var timer *time.Timer
@@ -487,12 +488,12 @@ func unboundRunLoop(ctx context.Context, logger logging.Logger, dnsConf dns.Conf
case startErr != nil: case startErr != nil:
logger.Error(startErr) logger.Error(startErr)
unboundCancel() unboundCancel()
if err := fallbackToUnencryptedDNS(dnsConf, settings.Providers[0], settings.IPv6); err != nil { if err := fallbackToUnencryptedIPv4DNS(dnsConf, settings.Providers); err != nil {
logger.Error(err) logger.Error(err)
} }
case waitErr != nil: case waitErr != nil:
logger.Warn(waitErr) logger.Warn(waitErr)
if err := fallbackToUnencryptedDNS(dnsConf, settings.Providers[0], settings.IPv6); err != nil { if err := fallbackToUnencryptedIPv4DNS(dnsConf, settings.Providers); err != nil {
logger.Error(err) logger.Error(err)
} }
logger.Warn("restarting unbound because of unexpected exit") logger.Warn("restarting unbound because of unexpected exit")