Allow forwarding of multiple ports

This commit is contained in:
bluepython508
2023-12-08 15:51:38 +00:00
parent 259f002a99
commit 0d1fa49c9b
2 changed files with 48 additions and 29 deletions

View File

@@ -48,12 +48,16 @@
type = bool; type = bool;
default = true; default = true;
}; };
proto = mkOption {type = proto;}; forwards = mkOption {
dest = mkOption {type = str;}; type = listOf (submodule {
hostProto = mkOption {type = proto;}; options = {
port = mkOption {type = port;}; proto = mkOption {type = proto;};
port = mkOption {type = port;};
dest = mkOption {type = str;};
};
});
};
}; };
config.hostProto = mkDefault config.proto;
})); }));
}; };
}; };
@@ -65,10 +69,7 @@
}; };
in in
lib.mapAttrs' (hostname: { lib.mapAttrs' (hostname: {
proto, forwards,
hostProto,
port,
dest,
enable, enable,
... ...
}: let }: let
@@ -78,7 +79,7 @@
value = { value = {
inherit enable; inherit enable;
script = '' script = ''
TS_AUTHKEY=$(cat $RUNTIME_DIRECTORY/authkey) ${lib.getExe self.packages.${pkgs.system}.default} ${hostProto} ${hostname} ${toString port} ${proto} ${dest} TS_AUTHKEY=$(cat $RUNTIME_DIRECTORY/authkey) ${lib.getExe self.packages.${pkgs.system}.default} ${hostname} ${lib.concatMapStringsSep " " ({proto, port, dest}: "${proto}:${proto}:${dest}") forwards}
''; '';
wantedBy = ["multi-user.target"]; wantedBy = ["multi-user.target"];
serviceConfig = { serviceConfig = {

56
main.go
View File

@@ -5,30 +5,45 @@ import (
"log" "log"
"net" "net"
"os" "os"
"strings"
"ben.soroos.net/tsnet-proxy/netforward" "ben.soroos.net/tsnet-proxy/netforward"
"tailscale.com/tsnet" "tailscale.com/tsnet"
) )
var ( var hostname = os.Args[1]
host_proto = os.Args[1]
hostname = os.Args[2]
host_port = os.Args[3]
dst_proto = os.Args[4]
dst_addr = os.Args[5]
)
type Dialer struct{}
type Dialer struct{
proto string;
addr string;
}
type Forward struct{
proto string;
port string;
dst string;
}
func (dialer Dialer) Dial() (net.Conn, error) { func (dialer Dialer) Dial() (net.Conn, error) {
return net.Dial(dst_proto, dst_addr) return net.Dial(dialer.proto, dialer.addr)
}
func (forward Forward) Run(server *tsnet.Server, finish chan error) {
ln, err := server.Listen(forward.proto, fmt.Sprint(":", forward.port))
defer ln.Close()
if err != nil {
finish <- err
}
err = netforward.Forward(Dialer { proto: forward.proto, addr: forward.dst }, ln)
if err != nil {
finish <- err
}
} }
func main() { func main() {
if !(host_proto != "" && hostname != "" && host_port != "" && dst_proto != "" && dst_addr != "") { if !(hostname != "") {
fmt.Println("Usage: tsnet-proxy PROTO HOSTNAME PORT DST-PROTO DST") fmt.Println("Usage: tsnet-proxy HOSTNAME FORWARDS...")
fmt.Println("Where PROTO is one of tcp, udp, unix")
fmt.Println("Got: ", host_proto, hostname, host_port, dst_proto, dst_addr)
os.Exit(1) os.Exit(1)
} }
@@ -42,11 +57,14 @@ func main() {
} }
defer s.Close() defer s.Close()
ln, err := s.Listen(host_proto, fmt.Sprint(":", host_port)) err_chan := make(chan error)
if err != nil { for _, arg := range os.Args[2:] {
log.Fatal(err) args := strings.SplitN(arg, ":", 3)
proto, port, dst := args[0], args[1], args[2]
go func() {
Forward { proto, port, dst }.Run(s, err_chan);
}();
} }
defer ln.Close() err := <- err_chan
log.Fatal(err)
netforward.Forward(Dialer {}, ln)
} }