Skip to content

Instantly share code, notes, and snippets.

@ir4y
Created April 21, 2014 15:41
Show Gist options
  • Select an option

  • Save ir4y/11146415 to your computer and use it in GitHub Desktop.

Select an option

Save ir4y/11146415 to your computer and use it in GitHub Desktop.
package main
// Reverse ssh port forwarder
// http://stackoverflow.com/questions/21417223/simple-ssh-port-forward-in-golang
// https://godoc.org/code.google.com/p/go.crypto/ssh#example-Client-Listen
import (
"code.google.com/p/go.crypto/ssh"
"io"
"log"
"net"
)
var (
username = "root"
password = "password"
remoteSSHServer = "192.168.1.100:22"
remoteListnerAddr = "127.0.0.1:2222"
localDialAddr = "127.0.0.1:22"
)
func main() {
config := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{
ssh.Password(password),
},
}
// Dial to remote ssh server.
conn, err := ssh.Dial("tcp", remoteSSHServer, config)
if err != nil {
log.Fatalf("unable to connect: %s", err)
}
defer conn.Close()
// Request the remote side to open port
remoteListener, err := conn.Listen("tcp", remoteListnerAddr)
if err != nil {
log.Fatalf("unable to register tcp forward: %v", err)
}
defer remoteListener.Close()
for {
// Listen for remote connection
r, err := remoteListener.Accept()
if err != nil {
log.Fatalf("listen.Accept failed: %v", err)
}
go func() {
// Connect to local port
l, err := net.Dial("tcp", localDialAddr)
if err != nil {
log.Fatalf("unable to register tcp forward: %v", err)
}
//copy local writer to remote reader
go func() {
_, err = io.Copy(l, r)
if err != nil {
log.Fatalf("io.Copy failed: %v", err)
}
}()
//copy remote writer to local reader
go func() {
_, err = io.Copy(r, l)
if err != nil {
log.Fatalf("io.Copy failed: %v", err)
}
}()
}()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment