58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
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)
|
|
}
|