package main import ( "io" "log" "net" "golang.org/x/crypto/ssh" ) type PortFowarder struct { sshCon *ssh.Client localPort string remotePort string remoteHost string } func NewPortForwarder(sshCon *ssh.Client, localPort, remotePort, remoteHost string) *PortFowarder { return &PortFowarder{ sshCon: sshCon, localPort: localPort, remotePort: remotePort, remoteHost: remoteHost, } } func (pw *PortFowarder) forward() error { listener, err := net.Listen("tcp", "127.0.0.1:"+pw.localPort) if err != nil { log.Printf("Fehler beim Öffnen des lokalen Ports %s: %v", pw.localPort, err) return err } defer listener.Close() for { localConn, err := listener.Accept() if err != nil { log.Printf("Fehler beim Akzeptieren der Verbindung: %v", err) continue } remoteConn, err := pw.sshCon.Dial("tcp", pw.remoteHost+":"+pw.remotePort) if err != nil { log.Printf("Fehler beim Verbinden zum Remote-Host %s:%s: %v", pw.remoteHost, pw.remotePort, err) localConn.Close() continue } go pw.copyConn(localConn, remoteConn) go pw.copyConn(remoteConn, localConn) } } func (pw *PortFowarder) copyConn(dst, src net.Conn) { defer dst.Close() defer src.Close() io.Copy(dst, src) }