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