Skip to content

Commit 8df8c10

Browse files
authored
[client] Support wildcard DNS on iOS (#3979)
1 parent bfa5c21 commit 8df8c10

File tree

4 files changed

+35
-9
lines changed

4 files changed

+35
-9
lines changed

client/internal/dns/upstream_android.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,10 @@ func (u *upstreamResolver) isLocalResolver(upstream string) bool {
8484
}
8585
return false
8686
}
87+
88+
func GetClientPrivate(ip netip.Addr, interfaceName string, dialTimeout time.Duration) (*dns.Client, error) {
89+
return &dns.Client{
90+
Timeout: dialTimeout,
91+
Net: "udp",
92+
}, nil
93+
}

client/internal/dns/upstream_general.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,10 @@ func newUpstreamResolver(
3636
func (u *upstreamResolver) exchange(ctx context.Context, upstream string, r *dns.Msg) (rm *dns.Msg, t time.Duration, err error) {
3737
return ExchangeWithFallback(ctx, &dns.Client{}, r, upstream)
3838
}
39+
40+
func GetClientPrivate(ip netip.Addr, interfaceName string, dialTimeout time.Duration) (*dns.Client, error) {
41+
return &dns.Client{
42+
Timeout: dialTimeout,
43+
Net: "udp",
44+
}, nil
45+
}

client/internal/routemanager/client/client.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"reflect"
7-
"runtime"
87
"time"
98

109
log "github.com/sirupsen/logrus"
@@ -23,7 +22,7 @@ import (
2322

2423
const (
2524
handlerTypeDynamic = iota
26-
handlerTypeDomain
25+
handlerTypeDnsInterceptor
2726
handlerTypeStatic
2827
)
2928

@@ -566,13 +565,14 @@ func HandlerFromRoute(
566565
useNewDNSRoute bool,
567566
) RouteHandler {
568567
switch handlerType(rt, useNewDNSRoute) {
569-
case handlerTypeDomain:
568+
case handlerTypeDnsInterceptor:
570569
return dnsinterceptor.New(
571570
rt,
572571
routeRefCounter,
573572
allowedIPsRefCounter,
574573
statusRecorder,
575574
dnsServer,
575+
wgInterface,
576576
peerStore,
577577
)
578578
case handlerTypeDynamic:
@@ -596,8 +596,8 @@ func handlerType(rt *route.Route, useNewDNSRoute bool) int {
596596
return handlerTypeStatic
597597
}
598598

599-
if useNewDNSRoute && runtime.GOOS != "ios" {
600-
return handlerTypeDomain
599+
if useNewDNSRoute {
600+
return handlerTypeDnsInterceptor
601601
}
602602
return handlerTypeDynamic
603603
}

client/internal/routemanager/dnsinterceptor/handler.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
log "github.com/sirupsen/logrus"
1313

1414
nberrors "github.com/netbirdio/netbird/client/errors"
15+
"github.com/netbirdio/netbird/client/iface/wgaddr"
1516
nbdns "github.com/netbirdio/netbird/client/internal/dns"
1617
"github.com/netbirdio/netbird/client/internal/dnsfwd"
1718
"github.com/netbirdio/netbird/client/internal/peer"
@@ -23,6 +24,11 @@ import (
2324

2425
type domainMap map[domain.Domain][]netip.Prefix
2526

27+
type wgInterface interface {
28+
Name() string
29+
Address() wgaddr.Address
30+
}
31+
2632
type DnsInterceptor struct {
2733
mu sync.RWMutex
2834
route *route.Route
@@ -32,6 +38,7 @@ type DnsInterceptor struct {
3238
dnsServer nbdns.Server
3339
currentPeerKey string
3440
interceptedDomains domainMap
41+
wgInterface wgInterface
3542
peerStore *peerstore.Store
3643
}
3744

@@ -41,6 +48,7 @@ func New(
4148
allowedIPsRefCounter *refcounter.AllowedIPsRefCounter,
4249
statusRecorder *peer.Status,
4350
dnsServer nbdns.Server,
51+
wgInterface wgInterface,
4452
peerStore *peerstore.Store,
4553
) *DnsInterceptor {
4654
return &DnsInterceptor{
@@ -49,6 +57,7 @@ func New(
4957
allowedIPsRefcounter: allowedIPsRefCounter,
5058
statusRecorder: statusRecorder,
5159
dnsServer: dnsServer,
60+
wgInterface: wgInterface,
5261
interceptedDomains: make(domainMap),
5362
peerStore: peerStore,
5463
}
@@ -162,13 +171,16 @@ func (d *DnsInterceptor) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
162171
return
163172
}
164173

174+
client, err := nbdns.GetClientPrivate(d.wgInterface.Address().IP, d.wgInterface.Name(), nbdns.UpstreamTimeout)
175+
if err != nil {
176+
d.writeDNSError(w, r, fmt.Sprintf("create DNS client: %v", err))
177+
return
178+
}
179+
165180
if r.Extra == nil {
166181
r.MsgHdr.AuthenticatedData = true
167182
}
168-
client := &dns.Client{
169-
Timeout: nbdns.UpstreamTimeout,
170-
Net: "udp",
171-
}
183+
172184
upstream := fmt.Sprintf("%s:%d", upstreamIP.String(), dnsfwd.ListenPort)
173185
reply, _, err := nbdns.ExchangeWithFallback(context.TODO(), client, r, upstream)
174186
if err != nil {

0 commit comments

Comments
 (0)