@ -21,10 +21,12 @@ import (
"tailscale.com/net/netknob"
"tailscale.com/net/netknob"
"tailscale.com/net/netmon"
"tailscale.com/net/netmon"
"tailscale.com/net/netns"
"tailscale.com/net/netns"
"tailscale.com/net/tsaddr"
"tailscale.com/types/logger"
"tailscale.com/types/logger"
"tailscale.com/types/netmap"
"tailscale.com/types/netmap"
"tailscale.com/util/clientmetric"
"tailscale.com/util/clientmetric"
"tailscale.com/util/mak"
"tailscale.com/util/mak"
"tailscale.com/version"
)
)
// Dialer dials out of tailscaled, while taking care of details while
// Dialer dials out of tailscaled, while taking care of details while
@ -337,6 +339,14 @@ func (d *Dialer) UserDial(ctx context.Context, network, addr string) (net.Conn,
}
}
return d . NetstackDialTCP ( ctx , ipp )
return d . NetstackDialTCP ( ctx , ipp )
}
}
// Workaround for macOS for now: dial Tailscale IPs with peer dialer.
// TODO(bradfitz): fix dialing subnet routers, public IPs via exit nodes,
// etc. This is a temporary partial for macOS. We need to plumb ART tables &
// prefs & host routing table updates around in more places. We just don't
// know from the limited context here how to dial properly.
if version . IsMacGUIVariant ( ) && tsaddr . IsTailscaleIP ( ipp . Addr ( ) ) {
return d . getPeerDialer ( ) . DialContext ( ctx , network , ipp . String ( ) )
}
// TODO(bradfitz): netns, etc
// TODO(bradfitz): netns, etc
var stdDialer net . Dialer
var stdDialer net . Dialer
return stdDialer . DialContext ( ctx , network , ipp . String ( ) )
return stdDialer . DialContext ( ctx , network , ipp . String ( ) )
@ -365,14 +375,14 @@ func (d *Dialer) dialPeerAPI(ctx context.Context, network, addr string) (net.Con
return d . getPeerDialer ( ) . DialContext ( ctx , network , addr )
return d . getPeerDialer ( ) . DialContext ( ctx , network , addr )
}
}
// getPeerDialer returns the *net.Dialer to use to dial peers to use
// getPeerDialer returns the *net.Dialer to use to dial peers (e.g. for peerapi,
// PeerAPI.
// or "tailscale nc")
//
//
// This is not used in netstack mode.
// This is not used in netstack mode.
//
//
// The primary function of this is to work on macOS & iOS's in the
// The primary function of this is to work on macOS & iOS's in the
// Network/System Extension so it can mark the dialer as staying
// Network/System Extension so it can mark the dialer as staying within the
// within the network namespace/sandbox.
// network namespace/sandbox.
func ( d * Dialer ) getPeerDialer ( ) * net . Dialer {
func ( d * Dialer ) getPeerDialer ( ) * net . Dialer {
d . peerDialerOnce . Do ( func ( ) {
d . peerDialerOnce . Do ( func ( ) {
d . peerDialer = & net . Dialer {
d . peerDialer = & net . Dialer {