Skip to content

Commit d2ece2d

Browse files
committed
[client] Use management-provided dns forwarder port on the client side (#4712)
1 parent f7ad938 commit d2ece2d

File tree

6 files changed

+34
-3
lines changed

6 files changed

+34
-3
lines changed

client/internal/engine.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1059,10 +1059,14 @@ func (e *Engine) updateNetworkMap(networkMap *mgmProto.NetworkMap) error {
10591059
protoDNSConfig = &mgmProto.DNSConfig{}
10601060
}
10611061

1062-
if err := e.dnsServer.UpdateDNSServer(serial, toDNSConfig(protoDNSConfig, e.wgInterface.Address().Network)); err != nil {
1062+
dnsConfig := toDNSConfig(protoDNSConfig, e.wgInterface.Address().Network)
1063+
1064+
if err := e.dnsServer.UpdateDNSServer(serial, dnsConfig); err != nil {
10631065
log.Errorf("failed to update dns server, err: %v", err)
10641066
}
10651067

1068+
e.routeManager.SetDNSForwarderPort(dnsConfig.ForwarderPort)
1069+
10661070
// apply routes first, route related actions might depend on routing being enabled
10671071
routes := toRoutes(networkMap.GetRoutes())
10681072
serverRoutes, clientRoutes := e.routeManager.ClassifyRoutes(routes)
@@ -1207,10 +1211,16 @@ func toRouteDomains(myPubKey string, routes []*route.Route) []*dnsfwd.ForwarderE
12071211
}
12081212

12091213
func toDNSConfig(protoDNSConfig *mgmProto.DNSConfig, network netip.Prefix) nbdns.Config {
1214+
forwarderPort := uint16(protoDNSConfig.GetForwarderPort())
1215+
if forwarderPort == 0 {
1216+
forwarderPort = nbdns.ForwarderClientPort
1217+
}
1218+
12101219
dnsUpdate := nbdns.Config{
12111220
ServiceEnable: protoDNSConfig.GetServiceEnable(),
12121221
CustomZones: make([]nbdns.CustomZone, 0),
12131222
NameServerGroups: make([]*nbdns.NameServerGroup, 0),
1223+
ForwarderPort: forwarderPort,
12141224
}
12151225

12161226
for _, zone := range protoDNSConfig.GetCustomZones() {

client/internal/routemanager/common/params.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package common
22

33
import (
4+
"sync/atomic"
45
"time"
56

67
"github.com/netbirdio/netbird/client/firewall/manager"
@@ -25,4 +26,5 @@ type HandlerParams struct {
2526
UseNewDNSRoute bool
2627
Firewall manager.Manager
2728
FakeIPManager *fakeip.Manager
29+
ForwarderPort *atomic.Uint32
2830
}

client/internal/routemanager/dnsinterceptor/handler.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"runtime"
99
"strings"
1010
"sync"
11+
"sync/atomic"
1112
"time"
1213

1314
"github.com/hashicorp/go-multierror"
@@ -20,7 +21,6 @@ import (
2021
nbdns "github.com/netbirdio/netbird/client/internal/dns"
2122
"github.com/netbirdio/netbird/client/internal/peer"
2223
"github.com/netbirdio/netbird/client/internal/peerstore"
23-
pkgdns "github.com/netbirdio/netbird/dns"
2424
"github.com/netbirdio/netbird/client/internal/routemanager/common"
2525
"github.com/netbirdio/netbird/client/internal/routemanager/fakeip"
2626
"github.com/netbirdio/netbird/client/internal/routemanager/refcounter"
@@ -55,6 +55,7 @@ type DnsInterceptor struct {
5555
peerStore *peerstore.Store
5656
firewall firewall.Manager
5757
fakeIPManager *fakeip.Manager
58+
forwarderPort *atomic.Uint32
5859
}
5960

6061
func New(params common.HandlerParams) *DnsInterceptor {
@@ -69,6 +70,7 @@ func New(params common.HandlerParams) *DnsInterceptor {
6970
firewall: params.Firewall,
7071
fakeIPManager: params.FakeIPManager,
7172
interceptedDomains: make(domainMap),
73+
forwarderPort: params.ForwarderPort,
7274
}
7375
}
7476

@@ -257,7 +259,7 @@ func (d *DnsInterceptor) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
257259
r.MsgHdr.AuthenticatedData = true
258260
}
259261

260-
upstream := fmt.Sprintf("%s:%d", upstreamIP.String(), pkgdns.ForwarderClientPort)
262+
upstream := fmt.Sprintf("%s:%d", upstreamIP.String(), uint16(d.forwarderPort.Load()))
261263
ctx, cancel := context.WithTimeout(context.Background(), dnsTimeout)
262264
defer cancel()
263265

client/internal/routemanager/manager.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"runtime"
1111
"slices"
1212
"sync"
13+
"sync/atomic"
1314
"time"
1415

1516
"github.com/google/uuid"
@@ -23,6 +24,7 @@ import (
2324
"github.com/netbirdio/netbird/client/iface/netstack"
2425
"github.com/netbirdio/netbird/client/internal/dns"
2526
"github.com/netbirdio/netbird/client/internal/listener"
27+
nbdns "github.com/netbirdio/netbird/dns"
2628
"github.com/netbirdio/netbird/client/internal/peer"
2729
"github.com/netbirdio/netbird/client/internal/peerstore"
2830
"github.com/netbirdio/netbird/client/internal/routemanager/client"
@@ -54,6 +56,7 @@ type Manager interface {
5456
SetRouteChangeListener(listener listener.NetworkChangeListener)
5557
InitialRouteRange() []string
5658
SetFirewall(firewall.Manager) error
59+
SetDNSForwarderPort(port uint16)
5760
Stop(stateManager *statemanager.Manager)
5861
}
5962

@@ -101,6 +104,7 @@ type DefaultManager struct {
101104
disableServerRoutes bool
102105
activeRoutes map[route.HAUniqueID]client.RouteHandler
103106
fakeIPManager *fakeip.Manager
107+
dnsForwarderPort atomic.Uint32
104108
}
105109

106110
func NewManager(config ManagerConfig) *DefaultManager {
@@ -130,6 +134,7 @@ func NewManager(config ManagerConfig) *DefaultManager {
130134
disableServerRoutes: config.DisableServerRoutes,
131135
activeRoutes: make(map[route.HAUniqueID]client.RouteHandler),
132136
}
137+
dm.dnsForwarderPort.Store(uint32(nbdns.ForwarderClientPort))
133138

134139
useNoop := netstack.IsEnabled() || config.DisableClientRoutes
135140
dm.setupRefCounters(useNoop)
@@ -270,6 +275,11 @@ func (m *DefaultManager) SetFirewall(firewall firewall.Manager) error {
270275
return nil
271276
}
272277

278+
// SetDNSForwarderPort sets the DNS forwarder port for route handlers
279+
func (m *DefaultManager) SetDNSForwarderPort(port uint16) {
280+
m.dnsForwarderPort.Store(uint32(port))
281+
}
282+
273283
// Stop stops the manager watchers and clean firewall rules
274284
func (m *DefaultManager) Stop(stateManager *statemanager.Manager) {
275285
m.stop()
@@ -345,6 +355,7 @@ func (m *DefaultManager) updateSystemRoutes(newRoutes route.HAMap) error {
345355
UseNewDNSRoute: m.useNewDNSRoute,
346356
Firewall: m.firewall,
347357
FakeIPManager: m.fakeIPManager,
358+
ForwarderPort: &m.dnsForwarderPort,
348359
}
349360
handler := client.HandlerFromRoute(params)
350361
if err := handler.AddRoute(m.ctx); err != nil {

client/internal/routemanager/mock.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ func (m *MockManager) SetFirewall(firewall.Manager) error {
9090
panic("implement me")
9191
}
9292

93+
// SetDNSForwarderPort mock implementation of SetDNSForwarderPort from Manager interface
94+
func (m *MockManager) SetDNSForwarderPort(port uint16) {
95+
}
96+
9397
// Stop mock implementation of Stop from Manager interface
9498
func (m *MockManager) Stop(stateManager *statemanager.Manager) {
9599
if m.StopFunc != nil {

dns/dns.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ type Config struct {
3535
NameServerGroups []*NameServerGroup
3636
// CustomZones contains a list of custom zone
3737
CustomZones []CustomZone
38+
// ForwarderPort is the port clients should connect to on routing peers for DNS forwarding
39+
ForwarderPort uint16
3840
}
3941

4042
// CustomZone represents a custom zone to be resolved by the dns server

0 commit comments

Comments
 (0)