mirror of
https://github.com/tailscale/tailscale.git
synced 2025-03-29 04:22:24 +00:00
net/dns: verify that systemd-resolved is actually in charge.
It's possible to install a configuration that passes our current checks for systemd-resolved, without actually pointing to systemd-resolved. In that case, we end up programming DNS in resolved, but that config never applies to any name resolution requests on the system. This is quite a far-out edge case, but there's a simple additional check we can do: if the header comment names systemd-resolved, there should be a single nameserver in resolv.conf pointing to 127.0.0.53. If not, the configuration should be treated as an unmanaged resolv.conf. Fixes #2136. Signed-off-by: David Anderson <danderson@tailscale.com>
This commit is contained in:
parent
e7164425b3
commit
320cc8fa21
@ -14,6 +14,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
|
"inet.af/netaddr"
|
||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
"tailscale.com/util/cmpver"
|
"tailscale.com/util/cmpver"
|
||||||
)
|
)
|
||||||
@ -50,6 +51,15 @@ func NewOSConfigurator(logf logger.Logf, interfaceName string) (ret OSConfigurat
|
|||||||
switch resolvOwner(bs) {
|
switch resolvOwner(bs) {
|
||||||
case "systemd-resolved":
|
case "systemd-resolved":
|
||||||
dbg("rc", "resolved")
|
dbg("rc", "resolved")
|
||||||
|
// Some systems, for reasons known only to them, have a
|
||||||
|
// resolv.conf that has the word "systemd-resolved" in its
|
||||||
|
// header, but doesn't actually point to resolved. We mustn't
|
||||||
|
// try to program resolved in that case.
|
||||||
|
// https://github.com/tailscale/tailscale/issues/2136
|
||||||
|
if err := resolvedIsActuallyResolver(); err != nil {
|
||||||
|
dbg("resolved", "not-in-use")
|
||||||
|
return newDirectManager()
|
||||||
|
}
|
||||||
if err := dbusPing("org.freedesktop.resolve1", "/org/freedesktop/resolve1"); err != nil {
|
if err := dbusPing("org.freedesktop.resolve1", "/org/freedesktop/resolve1"); err != nil {
|
||||||
dbg("resolved", "no")
|
dbg("resolved", "no")
|
||||||
return newDirectManager()
|
return newDirectManager()
|
||||||
@ -184,6 +194,17 @@ func nmIsUsingResolved() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func resolvedIsActuallyResolver() error {
|
||||||
|
cfg, err := readResolvConf()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(cfg.Nameservers) != 1 || cfg.Nameservers[0] != netaddr.IPv4(127, 0, 0, 53) {
|
||||||
|
return errors.New("resolv.conf doesn't point to systemd-resolved")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func dbusPing(name, objectPath string) error {
|
func dbusPing(name, objectPath string) error {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user