net/netns: move SOCKS dialing to netns for now
This lets control & logs also use SOCKS dials. Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:

committed by
Brad Fitzpatrick

parent
cf0d19f0ab
commit
24009241bf
@ -9,9 +9,15 @@
|
||||
//
|
||||
// Despite the name netns, the exact mechanism used differs by
|
||||
// operating system, and perhaps even by version of the OS.
|
||||
//
|
||||
// The netns package also handles connecting via SOCKS proxies when
|
||||
// configured by the environment.
|
||||
package netns
|
||||
|
||||
import "net"
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
)
|
||||
|
||||
// Listener returns a new net.Listener with its Control hook func
|
||||
// initialized as necessary to run in logical network namespace that
|
||||
@ -20,9 +26,43 @@ func Listener() *net.ListenConfig {
|
||||
return &net.ListenConfig{Control: control}
|
||||
}
|
||||
|
||||
// Dialer returns a new net.Dialer with its Control hook func
|
||||
// initialized as necessary to run in a logical network namespace that
|
||||
// doesn't route back into Tailscale.
|
||||
func Dialer() *net.Dialer {
|
||||
return &net.Dialer{Control: control}
|
||||
// NewDialer returns a new Dialer using a net.Dialer with its Control
|
||||
// hook func initialized as necessary to run in a logical network
|
||||
// namespace that doesn't route back into Tailscale. It also handles
|
||||
// using a SOCKS if configured in the environment with ALL_PROXY.
|
||||
func NewDialer() Dialer {
|
||||
return FromDialer(new(net.Dialer))
|
||||
}
|
||||
|
||||
// FromDialer returns sets d.Control as necessary to run in a logical
|
||||
// network namespace that doesn't route back into Tailscale. It also
|
||||
// handles using a SOCKS if configured in the environment with
|
||||
// ALL_PROXY.
|
||||
func FromDialer(d *net.Dialer) Dialer {
|
||||
d.Control = control
|
||||
if wrapDialer != nil {
|
||||
return wrapDialer(d)
|
||||
}
|
||||
return d
|
||||
}
|
||||
|
||||
// IsSOCKSDialer reports whether d is SOCKS-proxying dialer as returned by
|
||||
// NewDialer or FromDialer.
|
||||
func IsSOCKSDialer(d Dialer) bool {
|
||||
if d == nil {
|
||||
return false
|
||||
}
|
||||
_, ok := d.(*net.Dialer)
|
||||
return !ok
|
||||
}
|
||||
|
||||
// wrapDialer, if non-nil, specifies a function to wrap a dialer in a
|
||||
// SOCKS-using dialer. It's set conditionally by socks.go.
|
||||
var wrapDialer func(Dialer) Dialer
|
||||
|
||||
// Dialer is the interface for a dialer that can dial with or without a context.
|
||||
// It's the type implemented both by net.Dialer and the Go SOCKS dialer.
|
||||
type Dialer interface {
|
||||
Dial(network, address string) (net.Conn, error)
|
||||
DialContext(ctx context.Context, network, address string) (net.Conn, error)
|
||||
}
|
||||
|
Reference in New Issue
Block a user