Skip to content

Commit cf5d767

Browse files
committed
Use a more conservative strategy for resolving with systemd-resolved for local DNS server
1 parent d35ce59 commit cf5d767

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

dns/transport/local/local.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,15 @@ func (t *Transport) Start(stage adapter.StartStage) error {
5353
switch stage {
5454
case adapter.StartStateInitialize:
5555
if !t.preferGo {
56-
resolvedResolver, err := NewResolvedResolver(t.ctx, t.logger)
57-
if err == nil {
58-
err = resolvedResolver.Start()
56+
if isSystemdResolvedManaged() {
57+
resolvedResolver, err := NewResolvedResolver(t.ctx, t.logger)
5958
if err == nil {
60-
t.resolved = resolvedResolver
61-
} else {
62-
t.logger.Warn(E.Cause(err, "initialize resolved resolver"))
59+
err = resolvedResolver.Start()
60+
if err == nil {
61+
t.resolved = resolvedResolver
62+
} else {
63+
t.logger.Warn(E.Cause(err, "initialize resolved resolver"))
64+
}
6365
}
6466
}
6567
}

dns/transport/local/local_resolved_linux.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package local
22

33
import (
4+
"bufio"
45
"context"
56
"errors"
67
"os"
8+
"strings"
79
"sync"
810
"sync/atomic"
911

@@ -22,6 +24,25 @@ import (
2224
mDNS "github.com/miekg/dns"
2325
)
2426

27+
func isSystemdResolvedManaged() bool {
28+
resolvContent, err := os.Open("/etc/resolv.conf")
29+
if err != nil {
30+
return false
31+
}
32+
defer resolvContent.Close()
33+
scanner := bufio.NewScanner(resolvContent)
34+
for scanner.Scan() {
35+
line := strings.TrimSpace(scanner.Text())
36+
if line == "" || line[0] != '#' {
37+
return false
38+
}
39+
if strings.Contains(line, "systemd-resolved") {
40+
return true
41+
}
42+
}
43+
return false
44+
}
45+
2546
type DBusResolvedResolver struct {
2647
ctx context.Context
2748
logger logger.ContextLogger
@@ -188,7 +209,7 @@ func (t *DBusResolvedResolver) checkResolved(ctx context.Context) (*ResolvedObje
188209
int32(defaultInterface.Index),
189210
)
190211
if call.Err != nil {
191-
return nil, err
212+
return nil, call.Err
192213
}
193214
var linkPath dbus.ObjectPath
194215
err = call.Store(&linkPath)
@@ -214,15 +235,12 @@ func (t *DBusResolvedResolver) checkResolved(ctx context.Context) (*ResolvedObje
214235
return nil, E.New("No appropriate name servers or networks for name found")
215236
}
216237
}
217-
return &ResolvedObject{
218-
BusObject: dbusObject,
219-
}, nil
220-
} else {
221-
return &ResolvedObject{
222-
BusObject: dbusObject,
223-
InterfaceIndex: int32(defaultInterface.Index),
224-
}, nil
238+
return nil, E.New("link has no DNS servers configured")
225239
}
240+
return &ResolvedObject{
241+
BusObject: dbusObject,
242+
InterfaceIndex: int32(defaultInterface.Index),
243+
}, nil
226244
}
227245

228246
func (t *DBusResolvedResolver) updateDefaultInterface(defaultInterface *control.Interface, flags int) {

dns/transport/local/local_resolved_stub.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import (
99
"github.com/sagernet/sing/common/logger"
1010
)
1111

12+
func isSystemdResolvedManaged() bool {
13+
return false
14+
}
15+
1216
func NewResolvedResolver(ctx context.Context, logger logger.ContextLogger) (ResolvedResolver, error) {
1317
return nil, os.ErrInvalid
1418
}

0 commit comments

Comments
 (0)