diff --git a/net/socks5/socks5.go b/net/socks5/socks5.go index 12331f3fd..5c1a97d87 100644 --- a/net/socks5/socks5.go +++ b/net/socks5/socks5.go @@ -160,7 +160,7 @@ func (c *Conn) handleRequest() error { } c.request = req - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() srv, err := c.srv.dial( ctx, diff --git a/tstest/integration/integration_test.go b/tstest/integration/integration_test.go index 19ef62f13..89ad8b215 100644 --- a/tstest/integration/integration_test.go +++ b/tstest/integration/integration_test.go @@ -14,6 +14,7 @@ import ( "io" "io/ioutil" "log" + "net" "net/http" "net/http/httptest" "os" @@ -21,6 +22,7 @@ import ( "path/filepath" "regexp" "runtime" + "strconv" "strings" "sync" "sync/atomic" @@ -28,6 +30,7 @@ import ( "time" "go4.org/mem" + "golang.org/x/net/proxy" "tailscale.com/ipn/ipnstate" "tailscale.com/safesocket" "tailscale.com/smallzstd" @@ -286,6 +289,92 @@ func TestAddPingRequest(t *testing.T) { t.Error("all ping attempts failed") } +func TestTwoNodeConnectivity(t *testing.T) { + bins := BuildTestBinaries(t) + env := newTestEnv(t, bins) + defer env.Close() + + // Create two nodes and hope that logs come out correctly + n1 := newTestNode(t, env) + n1SocksAddrCh := n1.socks5AddrChan() + d1 := n1.StartDaemon(t) + defer d1.Kill() + + n2 := newTestNode(t, env) + n2SocksAddrCh := n2.socks5AddrChan() + d2 := n2.StartDaemon(t) + defer d2.Kill() + + n1Socks := n1.AwaitSocksAddr(t, n1SocksAddrCh) + n2Socks := n2.AwaitSocksAddr(t, n2SocksAddrCh) + t.Logf("node1 SOCKS5 addr: %v", n1Socks) + t.Logf("node2 SOCKS5 addr: %v", n2Socks) + + n1.AwaitListening(t) + n2.AwaitListening(t) + n1.MustUp() + n2.MustUp() + n1.AwaitRunning(t) + n2.AwaitRunning(t) + n2IP := n2.AwaitIP(t) + + defer func() { + d1.MustCleanShutdown(t) + d2.MustCleanShutdown(t) + d1.Kill() + d2.Kill() + }() + + // Try communicating with the two addresss. + l, err := net.Listen("tcp", "localhost:0") + if err != nil { + t.Fatal(err) + } + + // Dial this conn.addr + go func() { + conn, err := l.Accept() + if err != nil { + t.Error(err) + } + defer conn.Close() + _, err = conn.Write([]byte("TestString")) + if err != nil { + t.Error(err) + } + }() + + dialer, err := proxy.SOCKS5("tcp", n1Socks, nil, proxy.Direct) + if err != nil { + t.Error(err) + } + + port := l.Addr().(*net.TCPAddr) + t.Log(port) + + testIP := strings.ReplaceAll(net.JoinHostPort(n2IP, strconv.Itoa(port.Port)), "\n", "") + t.Log("Dialing : ", testIP) + + dialerConn, err := dialer.Dial("tcp", testIP) + if err != nil { + t.Fatal(err) + } + defer dialerConn.Close() + + t.Logf("Dialer Connection Established at %v", dialerConn.LocalAddr()) + _, err = dialerConn.Write([]byte("TestTest")) + if err != nil { + t.Error(err) + } + + // Read the bytes in + p := make([]byte, 1024) + _, err = dialerConn.Read(p) + if err != nil { + t.Error(err) + } +} + // testEnv contains the test environment (set of servers) used by one // or more nodes. type testEnv struct {