Skip to content

Commit

Permalink
Extract private upstream for iOS and fix function headers for other OS
Browse files Browse the repository at this point in the history
  • Loading branch information
pascal-fischer committed Dec 6, 2023
1 parent 5f96c56 commit ad1cf38
Show file tree
Hide file tree
Showing 8 changed files with 68 additions and 39 deletions.
2 changes: 1 addition & 1 deletion client/internal/dns/file_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ func prepareResolvConfContent(searchDomains, nameServers, others []string) bytes
return buf
}

func searchDomains(config hostDNSConfig) []string {
func searchDomains(config HostDNSConfig) []string {
listOfDomains := make([]string, 0)
for _, dConf := range config.domains {
if dConf.matchOnly || dConf.disabled {
Expand Down
2 changes: 1 addition & 1 deletion client/internal/dns/host_android.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package dns
type androidHostManager struct {
}

func newHostManager(wgInterface WGIface) (hostManager, error) {
func newHostManager(wgInterface WGIface, dnsManager IosDnsManager) (hostManager, error) {
return &androidHostManager{}, nil
}

Expand Down
2 changes: 1 addition & 1 deletion client/internal/dns/host_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ type systemConfigurator struct {
createdKeys map[string]struct{}
}

func newHostManager(_ WGIface) (hostManager, error) {
func newHostManager(_ WGIface, dnsManager IosDnsManager) (hostManager, error) {
return &systemConfigurator{
createdKeys: make(map[string]struct{}),
}, nil
Expand Down
2 changes: 1 addition & 1 deletion client/internal/dns/host_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const (

type osManagerType int

func newHostManager(wgInterface WGIface) (hostManager, error) {
func newHostManager(wgInterface WGIface, dnsManager IosDnsManager) (hostManager, error) {
osManager, err := getOSDNSManagerType()
if err != nil {
return nil, err
Expand Down
2 changes: 1 addition & 1 deletion client/internal/dns/host_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ type registryConfigurator struct {
routingAll bool
}

func newHostManager(wgInterface WGIface) (hostManager, error) {
func newHostManager(wgInterface WGIface, dnsManager IosDnsManager) (hostManager, error) {
guid, err := wgInterface.GetInterfaceGUIDString()
if err != nil {
return nil, err
Expand Down
34 changes: 0 additions & 34 deletions client/internal/dns/upstream.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,11 @@ import (
"runtime"
"sync"
"sync/atomic"
"syscall"
"time"

"github.com/cenkalti/backoff/v4"
"github.com/miekg/dns"
log "github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
)

const (
Expand Down Expand Up @@ -85,38 +83,6 @@ func newUpstreamResolver(parentCTX context.Context, interfaceName string, wgAddr
}
}

// getClientPrivate returns a new DNS client bound to the local IP address of the Netbird interface
// This method is needed for iOS
func (u *upstreamResolver) getClientPrivate() *dns.Client {
dialer := &net.Dialer{
LocalAddr: &net.UDPAddr{
IP: u.lIP,
Port: 0, // Let the OS pick a free port
},
Timeout: upstreamTimeout,
Control: func(network, address string, c syscall.RawConn) error {
var operr error
fn := func(s uintptr) {
operr = unix.SetsockoptInt(int(s), unix.IPPROTO_IP, unix.IP_BOUND_IF, u.iIndex)
}

if err := c.Control(fn); err != nil {
return err
}

if operr != nil {
log.Errorf("error while setting socket option: %s", operr)
}

return operr
},
}
client := &dns.Client{
Dialer: dialer,
}
return client
}

func (u *upstreamResolver) stop() {
log.Debugf("stopping serving DNS for upstreams %s", u.upstreamServers)
u.cancel()
Expand Down
44 changes: 44 additions & 0 deletions client/internal/dns/upstream_ios.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//go:build ios

package dns

import (
"net"
"syscall"

"github.com/miekg/dns"
log "github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
)

// getClientPrivate returns a new DNS client bound to the local IP address of the Netbird interface
// This method is needed for iOS
func (u *upstreamResolver) getClientPrivate() *dns.Client {
dialer := &net.Dialer{
LocalAddr: &net.UDPAddr{
IP: u.lIP,
Port: 0, // Let the OS pick a free port
},
Timeout: upstreamTimeout,
Control: func(network, address string, c syscall.RawConn) error {
var operr error
fn := func(s uintptr) {
operr = unix.SetsockoptInt(int(s), unix.IPPROTO_IP, unix.IP_BOUND_IF, u.iIndex)
}

if err := c.Control(fn); err != nil {
return err
}

if operr != nil {
log.Errorf("error while setting socket option: %s", operr)
}

return operr
},
}
client := &dns.Client{
Dialer: dialer,
}
return client
}
19 changes: 19 additions & 0 deletions client/internal/dns/upstream_nonios.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//go:build !ios

package dns

import (
"net"

"github.com/miekg/dns"
)

// getClientPrivate returns a new DNS client bound to the local IP address of the Netbird interface
// This method is needed for iOS
func (u *upstreamResolver) getClientPrivate() *dns.Client {
dialer := &net.Dialer{}
client := &dns.Client{
Dialer: dialer,
}
return client
}

0 comments on commit ad1cf38

Please sign in to comment.