63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net"
|
|
"os"
|
|
"strings"
|
|
|
|
"ben.soroos.net/tsnet-proxy/netforward"
|
|
"tailscale.com/tsnet"
|
|
)
|
|
|
|
var hostname = os.Args[1]
|
|
|
|
|
|
type Dialer struct{
|
|
proto string;
|
|
addr string;
|
|
}
|
|
|
|
func (dialer Dialer) Dial() (net.Conn, error) {
|
|
return net.Dial(dialer.proto, dialer.addr)
|
|
}
|
|
|
|
func Forward(server *tsnet.Server, proto, port, dst string, finish chan error) {
|
|
ln, err = server.Listen(proto, fmt.Sprint(":", port))
|
|
defer ln.Close()
|
|
if err != nil {
|
|
finish <- err
|
|
}
|
|
err = netforward.Forward(Dialer { proto: proto, addr: dst }, ln)
|
|
if err != nil {
|
|
finish <- err
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
if !(hostname != "") {
|
|
fmt.Println("Usage: tsnet-proxy HOSTNAME FORWARDS...")
|
|
os.Exit(1)
|
|
}
|
|
|
|
dir, valid := os.LookupEnv("STATE_DIRECTORY")
|
|
if !valid {
|
|
log.Fatal("RUNTIME_DIRECTORY must be set")
|
|
}
|
|
s := &tsnet.Server{
|
|
Hostname: hostname,
|
|
Dir: dir,
|
|
}
|
|
defer s.Close()
|
|
|
|
err_chan := make(chan error)
|
|
for _, arg := range os.Args[2:] {
|
|
args := strings.SplitN(arg, ":", 3)
|
|
proto, port, dst := args[0], args[1], args[2]
|
|
go Forward(s, proto, port, dst, err_chan);
|
|
}
|
|
err := <- err_chan
|
|
log.Fatal(err)
|
|
}
|