summaryrefslogtreecommitdiffhomepage
path: root/cmd
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@tailscale.com>2021-04-16 13:46:13 -0700
committerBrad Fitzpatrick <brad@danga.com>2021-04-16 16:20:31 -0700
commiteb6115e29535ecda48773eea04c87d2eb94d09e4 (patch)
treefd6ea24b0876f68e890caf22677880d90d3ff6d8 /cmd
parentb85d80b37fbc46e65040d82294d25ebb95a8fa42 (diff)
downloadtailscale-eb6115e29535ecda48773eea04c87d2eb94d09e4.tar.xz
tailscale-eb6115e29535ecda48773eea04c87d2eb94d09e4.zip
cmd/tailscaled: let SOCKS5 dial non-Tailscale addrs in userspace mode
Fixes #1617 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/tailscaled/tailscaled.go47
1 files changed, 25 insertions, 22 deletions
diff --git a/cmd/tailscaled/tailscaled.go b/cmd/tailscaled/tailscaled.go
index 983eaac1b..4e51bbbe5 100644
--- a/cmd/tailscaled/tailscaled.go
+++ b/cmd/tailscaled/tailscaled.go
@@ -29,10 +29,12 @@ import (
"time"
"github.com/go-multierror/multierror"
+ "inet.af/netaddr"
"tailscale.com/ipn/ipnserver"
"tailscale.com/logpolicy"
"tailscale.com/net/dns"
"tailscale.com/net/socks5"
+ "tailscale.com/net/tsaddr"
"tailscale.com/net/tstun"
"tailscale.com/paths"
"tailscale.com/types/flagtype"
@@ -239,30 +241,31 @@ func run() error {
srv := &socks5.Server{
Logf: logger.WithPrefix(logf, "socks5: "),
}
- // TODO: also consider wrapNetstack, where dials can go to either Tailscale
- // or non-Tailscale targets. But that's also basically what
- // https://github.com/tailscale/tailscale/issues/1617 is about, so do them
- // both at the same time.
- if useNetstack {
- srv.Dialer = func(ctx context.Context, network, addr string) (net.Conn, error) {
- return ns.DialContextTCP(ctx, addr)
+ var (
+ mu sync.Mutex // guards the following field
+ dns netstack.DNSMap
+ )
+ e.AddNetworkMapCallback(func(nm *netmap.NetworkMap) {
+ mu.Lock()
+ defer mu.Unlock()
+ dns = netstack.DNSMapFromNetworkMap(nm)
+ })
+ useNetstackForIP := func(ip netaddr.IP) bool {
+ // TODO(bradfitz): this isn't exactly right.
+ // We should also support subnets when the
+ // prefs are configured as such.
+ return tsaddr.IsTailscaleIP(ip)
+ }
+ srv.Dialer = func(ctx context.Context, network, addr string) (net.Conn, error) {
+ ipp, err := dns.Resolve(ctx, addr)
+ if err != nil {
+ return nil, err
}
- } else {
- var mu sync.Mutex
- var dns netstack.DNSMap
- e.AddNetworkMapCallback(func(nm *netmap.NetworkMap) {
- mu.Lock()
- defer mu.Unlock()
- dns = netstack.DNSMapFromNetworkMap(nm)
- })
- srv.Dialer = func(ctx context.Context, network, addr string) (net.Conn, error) {
- ipp, err := dns.Resolve(ctx, addr)
- if err != nil {
- return nil, err
- }
- var d net.Dialer
- return d.DialContext(ctx, network, ipp.String())
+ if ns != nil && useNetstackForIP(ipp.IP) {
+ return ns.DialContextTCP(ctx, addr)
}
+ var d net.Dialer
+ return d.DialContext(ctx, network, ipp.String())
}
go func() {
log.Fatalf("SOCKS5 server exited: %v", srv.Serve(socksListener))