package main import ( "flag" "fmt" "log" "net" "os" "github.com/goburrow/netforward" "tailscale.com/tsnet" ) var ( host_proto = flag.Arg(0) hostname = flag.Arg(1) host_port = flag.Arg(2) dst_proto = flag.Arg(3) dst_addr = flag.Arg(4) ) type Dialer struct{} func (dialer Dialer) Dial() (net.Conn, error) { return net.Dial(dst_proto, dst_addr) } func main() { flag.Parse() if !(host_proto != "" && hostname != "" && host_port != "" && dst_proto != "" && dst_addr != "") { fmt.Println("Usage: tsnet-proxy PROTO HOSTNAME PORT DST-PROTO DST") fmt.Println("Where PROTO is one of tcp, udp, unix") os.Exit(1) } s := &tsnet.Server{ Hostname: hostname, } defer s.Close() ln, err := s.Listen(host_proto, fmt.Sprint(":", host_port)) if err != nil { log.Fatal(err) } defer ln.Close() err = netforward.Forward(Dialer{}, ln) if err != nil { log.Fatal(err) } }