Created
April 21, 2014 15:41
-
-
Save ir4y/11146415 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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