package main import ( "flag" "fmt" "io" "net" "os" ) func main() { localAddr := flag.String("l", "192.168.122.1:3306", "local address we listen on") remoteAddr := flag.String("r", "127.0.0.1:3306", "remote address we proxy to") verbose := flag.Bool("v", false, "log connection") flag.Parse() local, err := net.Listen("tcp", *localAddr) if err != nil { fmt.Fprintf(os.Stderr, "listening failed: %s \n", err.Error()) os.Exit(-1) } for { conn, err := local.Accept() if err != nil { fmt.Fprintf(os.Stderr, "accepting failed: %s", err.Error()) os.Exit(-1) } go forward(conn, *remoteAddr, *verbose) } } func forward(local net.Conn, remoteAddr string, verbose bool) { remote, err := net.Dial("tcp", remoteAddr) if err != nil { fmt.Fprintf(os.Stderr, "remote dial failed: %s\n", err.Error()) return } go io.Copy(local, remote) go io.Copy(remote, local) if verbose { fmt.Println("message from: " + remoteAddr) } }