1package sshd 2 3import ( 4 "net" 5 6 "github.com/ferama/rospo/pkg/utils" 7 "golang.org/x/crypto/ssh" 8) 9 10func handleTcpIpForwardSession(client *ssh.ServerConn, listener net.Listener, laddr string, lport uint32) { 11 for { 12 lconn, err := listener.Accept() 13 if err != nil { 14 neterr := err.(net.Error) 15 if neterr.Timeout() { 16 log.Printf("Accept failed with timeout: %s", err) 17 continue 18 } 19 if neterr.Temporary() { 20 log.Printf("Accept failed with temporary: %s", err) 21 continue 22 } 23 24 break 25 } 26 log.Printf("started forward session: %s", lconn.LocalAddr()) 27 28 go func(lconn net.Conn, laddr string, lport uint32) { 29 remotetcpaddr := lconn.RemoteAddr().(*net.TCPAddr) 30 raddr := remotetcpaddr.IP.String() 31 rport := uint32(remotetcpaddr.Port) 32 33 var payload = struct { 34 Addr string // Is connected to 35 Port uint32 36 OriginAddr string 37 OriginPort uint32 38 }{ 39 laddr, lport, raddr, uint32(rport), 40 } 41 42 mpayload := ssh.Marshal(payload) 43 44 c, requests, err := client.OpenChannel("forwarded-tcpip", mpayload) 45 if err != nil { 46 log.Printf("Unable to get channel: %s. Hanging up requesting party!", err) 47 lconn.Close() 48 return 49 } 50 go ssh.DiscardRequests(requests) 51 utils.CopyConn(c, lconn) 52 }(lconn, laddr, lport) 53 } 54} 55