Skip to content

Instantly share code, notes, and snippets.

@fengxsong
Created October 13, 2016 09:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fengxsong/877e493a9b664f7762889da341c469ae to your computer and use it in GitHub Desktop.
Save fengxsong/877e493a9b664f7762889da341c469ae to your computer and use it in GitHub Desktop.
sshd proxy...
package main
import (
"errors"
"flag"
"fmt"
"io"
"log"
"net"
"strings"
)
var (
sshdServerPorts = []int{3222, 9222}
errConnRefuse = errors.New("ssh: Connection refused ")
)
func main() {
var laddr string
flag.StringVar(&laddr, "l", ":9222", "")
flag.Parse()
l, err := net.Listen("tcp", laddr)
if err != nil {
log.Fatalln(err)
}
for {
c, err := l.Accept()
if err != nil {
log.Fatalln(err)
}
go proxy(c)
}
}
func proxy(c net.Conn) {
raddr := c.RemoteAddr().String()
raddr = raddr[:strings.Index(raddr, ":")]
log.Println("recieve from:", raddr)
rconn, err := tryConn(raddr, sshdServerPorts)
if err != nil {
c.Write([]byte(errConnRefuse.Error()))
c.Close()
return
}
go io.Copy(c, rconn)
go io.Copy(rconn, c)
}
func tryConn(raddr string, ports []int) (rconn net.Conn, err error) {
for _, port := range ports {
rconn, err = net.Dial("tcp", fmt.Sprintf("%s:%d", raddr, port))
if err == nil {
return rconn, nil
}
}
log.Println(err)
return nil, err
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment