mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-18 08:16:39 +00:00
Compare commits
2 Commits
fix/connec
...
go-dns-for
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b4d00d110 | ||
|
|
1dcd92c5d1 |
@@ -29,7 +29,9 @@ func WithCustomDialer(_ bool, _ string) grpc.DialOption {
|
|||||||
// the custom dialer requires root permissions which are not required for use cases run as non-root
|
// the custom dialer requires root permissions which are not required for use cases run as non-root
|
||||||
if currentUser.Uid != "0" {
|
if currentUser.Uid != "0" {
|
||||||
log.Debug("Not running as root, using standard dialer")
|
log.Debug("Not running as root, using standard dialer")
|
||||||
dialer := &net.Dialer{}
|
dialer := &net.Dialer{
|
||||||
|
Resolver: nbnet.NewResolver(),
|
||||||
|
}
|
||||||
return dialer.DialContext(ctx, "tcp", addr)
|
return dialer.DialContext(ctx, "tcp", addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import (
|
|||||||
"github.com/pion/transport/v3/stdnet"
|
"github.com/pion/transport/v3/stdnet"
|
||||||
|
|
||||||
"github.com/netbirdio/netbird/client/iface/netstack"
|
"github.com/netbirdio/netbird/client/iface/netstack"
|
||||||
|
nbnet "github.com/netbirdio/netbird/client/net"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -42,6 +43,8 @@ type Net struct {
|
|||||||
|
|
||||||
// ctx is the context for network operations that supports cancellation
|
// ctx is the context for network operations that supports cancellation
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
|
|
||||||
|
resolver *net.Resolver
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNetWithDiscover creates a new StdNet instance.
|
// NewNetWithDiscover creates a new StdNet instance.
|
||||||
@@ -52,6 +55,7 @@ func NewNetWithDiscover(ctx context.Context, iFaceDiscover ExternalIFaceDiscover
|
|||||||
n := &Net{
|
n := &Net{
|
||||||
interfaceFilter: InterfaceFilter(disallowList),
|
interfaceFilter: InterfaceFilter(disallowList),
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
|
resolver: nbnet.NewResolver(),
|
||||||
}
|
}
|
||||||
// current ExternalIFaceDiscover implement in android-client https://github.dev/netbirdio/android-client
|
// current ExternalIFaceDiscover implement in android-client https://github.dev/netbirdio/android-client
|
||||||
// so in android cli use pionDiscover
|
// so in android cli use pionDiscover
|
||||||
@@ -72,6 +76,7 @@ func NewNet(ctx context.Context, disallowList []string) (*Net, error) {
|
|||||||
iFaceDiscover: pionDiscover{},
|
iFaceDiscover: pionDiscover{},
|
||||||
interfaceFilter: InterfaceFilter(disallowList),
|
interfaceFilter: InterfaceFilter(disallowList),
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
|
resolver: nbnet.NewResolver(),
|
||||||
}
|
}
|
||||||
return n, n.UpdateInterfaces()
|
return n, n.UpdateInterfaces()
|
||||||
}
|
}
|
||||||
@@ -110,7 +115,7 @@ func (n *Net) resolveAddr(network, address string) (netip.AddrPort, error) {
|
|||||||
ctx, cancel := context.WithTimeout(n.ctx, dnsResolveTimeout)
|
ctx, cancel := context.WithTimeout(n.ctx, dnsResolveTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
addrs, err := net.DefaultResolver.LookupNetIP(ctx, ipNet, host)
|
addrs, err := n.resolver.LookupNetIP(ctx, ipNet, host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return netip.AddrPort{}, err
|
return netip.AddrPort{}, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ type Dialer struct {
|
|||||||
// NewDialer returns a customized net.Dialer with overridden Control method
|
// NewDialer returns a customized net.Dialer with overridden Control method
|
||||||
func NewDialer() *Dialer {
|
func NewDialer() *Dialer {
|
||||||
dialer := &Dialer{
|
dialer := &Dialer{
|
||||||
Dialer: &net.Dialer{},
|
Dialer: &net.Dialer{
|
||||||
|
Resolver: NewResolver(),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
dialer.init()
|
dialer.init()
|
||||||
return dialer
|
return dialer
|
||||||
|
|||||||
47
client/net/resolver.go
Normal file
47
client/net/resolver.go
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package net
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// EnvResolver is the environment variable to control DNS resolver behavior
|
||||||
|
// Values: "system" (use system resolver), "go" (use pure Go resolver), empty (auto-detect)
|
||||||
|
EnvResolver = "NB_DNS_RESOLVER"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewResolver creates a DNS resolver with appropriate settings based on platform and configuration.
|
||||||
|
// On Darwin (macOS), it defaults to the pure Go resolver to avoid getaddrinfo hangs after sleep/wake.
|
||||||
|
// This is particularly important for connections using this package's Dialer, which bypasses the NetBird
|
||||||
|
// overlay network for control plane traffic. Since these connections target external infrastructure
|
||||||
|
// (management, signal, relay servers), it is safe to ignore split DNS configurations that would
|
||||||
|
// normally be provided by the system resolver.
|
||||||
|
// On other platforms, it uses the system resolver (cgo).
|
||||||
|
// This behavior can be overridden using the NB_DNS_RESOLVER environment variable or GODEBUG.
|
||||||
|
func NewResolver() *net.Resolver {
|
||||||
|
if resolver := os.Getenv(EnvResolver); resolver != "" {
|
||||||
|
switch strings.ToLower(resolver) {
|
||||||
|
case "system":
|
||||||
|
return net.DefaultResolver
|
||||||
|
case "go":
|
||||||
|
return &net.Resolver{
|
||||||
|
PreferGo: true,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
log.Debugf("Invalid %s value: %s, using platform defaults", EnvResolver, resolver)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if runtime.GOOS == "darwin" {
|
||||||
|
return &net.Resolver{
|
||||||
|
PreferGo: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return net.DefaultResolver
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user