Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion client/internal/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ import (
"github.com/netbirdio/netbird/client/firewall"
firewallManager "github.com/netbirdio/netbird/client/firewall/manager"
"github.com/netbirdio/netbird/client/iface"
nbnetstack "github.com/netbirdio/netbird/client/iface/netstack"
"github.com/netbirdio/netbird/client/iface/device"
nbnetstack "github.com/netbirdio/netbird/client/iface/netstack"
"github.com/netbirdio/netbird/client/iface/udpmux"
"github.com/netbirdio/netbird/client/internal/acl"
"github.com/netbirdio/netbird/client/internal/debug"
Expand Down
5 changes: 5 additions & 0 deletions client/internal/routemanager/dnsinterceptor/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,11 @@ func (d *DnsInterceptor) writeMsg(w dns.ResponseWriter, r *dns.Msg, logger *log.
logger.Errorf("failed to update domain prefixes: %v", err)
}

// Allow time for route changes to be applied before sending
// the DNS response (relevant on iOS where setTunnelNetworkSettings
// is asynchronous).
waitForRouteSettlement(logger)

d.replaceIPsInDNSResponse(r, newPrefixes, logger)
}
}
Expand Down
20 changes: 20 additions & 0 deletions client/internal/routemanager/dnsinterceptor/handler_ios.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//go:build ios

package dnsinterceptor

import (
"time"

log "github.com/sirupsen/logrus"
)

const routeSettleDelay = 500 * time.Millisecond

// waitForRouteSettlement introduces a short delay on iOS to allow
// setTunnelNetworkSettings to apply route changes before the DNS
// response reaches the application. Without this, the first request
// to a newly resolved domain may bypass the tunnel.
func waitForRouteSettlement(logger *log.Entry) {
logger.Debugf("waiting %v for iOS route settlement", routeSettleDelay)
time.Sleep(routeSettleDelay)
}
7 changes: 7 additions & 0 deletions client/internal/routemanager/dnsinterceptor/handler_nonios.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
//go:build !ios

package dnsinterceptor

import log "github.com/sirupsen/logrus"

func waitForRouteSettlement(_ *log.Entry) {}
Loading