diff --git a/client/flyclient.go b/client/flyclient.go index fdb0d7b..5331f58 100644 --- a/client/flyclient.go +++ b/client/flyclient.go @@ -1,6 +1,6 @@ package client -import "github.com/asche910/flynet/flynet" +import "github.com/asche910/flynet/fly" type FlyClient struct { Mode int @@ -12,21 +12,21 @@ type FlyClient struct { } func (client *FlyClient) LocalSocks5Proxy(port string) { - flynet.StartSocks5(port) + fly.StartSocks5(port) } func (client *FlyClient) LocalHttpProxy(port string) { - flynet.StartHttp(port) + fly.StartHttp(port) } func (client *FlyClient) Socks5ProxyForTCP(localPort, serverAddr string) { - flynet.Socks5ForClientByTCP(localPort, serverAddr) + fly.Socks5ForClientByTCP(localPort, serverAddr) } func (client *FlyClient) Socks5ProxyForUDP(localPort, serverAddr string) { - flynet.Socks5ForClientByUDP(localPort, serverAddr) + fly.Socks5ForClientByUDP(localPort, serverAddr) } func (client *FlyClient) PortForward(laborPort, serverAddr string) { - flynet.PortForwardForClient(laborPort, serverAddr) + fly.PortForwardForClient(laborPort, serverAddr) } diff --git a/cmd/client/client.go b/cmd/client/client.go index 8015b3e..d8796c3 100644 --- a/cmd/client/client.go +++ b/cmd/client/client.go @@ -3,15 +3,15 @@ package main import ( "fmt" "github.com/asche910/flynet/client" + "github.com/asche910/flynet/fly" "github.com/asche910/flynet/log" - "github.com/asche910/flynet/flynet" log2 "log" "os" "strings" ) var ( - logger *log2.Logger + logger *log2.Logger flyClient = client.FlyClient{} ) @@ -37,13 +37,13 @@ func main() { ports := flyClient.Ports flyClient.PortForward(ports[0], flyClient.ServerAddr) default: - fmt.Println("flynet: unknown error!") + fmt.Println("fly: unknown error!") os.Exit(1) } } func printHelp() { - fmt.Println(`Usage: flynet [options] + fmt.Println(`Usage: fly [options] -M, --mode choose which mode to run. the mode must be one of['http', 'socks5', 'socks5-tcp', 'socks5-udp', 'forward'] -L, --listen choose which port(s) to listen or forward @@ -53,11 +53,11 @@ func printHelp() { -H, --help show detail usage Mail bug reports and suggestions to -or github: https://github.com/asche910/flynet`) +or github: https://github.com/asche910/fly`) } func parseArgs(args []string) { - if len(args) < 1{ + if len(args) < 1 { return } switch args[0] { @@ -75,21 +75,21 @@ func parseArgs(args []string) { case "forward": flyClient.Mode = 5 default: - fmt.Println("flynet: no correct mode found!") + fmt.Println("fly: no correct mode found!") printHelp() os.Exit(1) } parseArgs(args[2:]) } else { - fmt.Println("flynet: no detail mode found!") + fmt.Println("fly: no detail mode found!") printHelp() os.Exit(1) } case "--listen", "-L": if len(args) > 1 && !strings.HasPrefix(args[1], "-") { - port1 := flynet.CheckPort(args[1]) + port1 := fly.CheckPort(args[1]) if len(args) > 2 && !strings.HasPrefix(args[2], "-") { - port2 := flynet.CheckPort(args[2]) + port2 := fly.CheckPort(args[2]) flyClient.Ports = []string{port1, port2} parseArgs(args[3:]) } else { @@ -97,7 +97,7 @@ func parseArgs(args []string) { parseArgs(args[2:]) } } else { - fmt.Println("flynet: no port found!") + fmt.Println("fly: no port found!") printHelp() os.Exit(1) } @@ -105,8 +105,8 @@ func parseArgs(args []string) { if len(args) > 1 && !strings.HasPrefix(args[1], "-") { flyClient.ServerAddr = args[1] parseArgs(args[2:]) - }else { - fmt.Println("flynet: no correct serverAddr found!") + } else { + fmt.Println("fly: no correct serverAddr found!") printHelp() os.Exit(1) } @@ -121,28 +121,28 @@ func parseArgs(args []string) { parseArgs(args[1:]) os.Exit(0) default: - fmt.Println("flynet: please input correct command!") + fmt.Println("fly: please input correct command!") printHelp() os.Exit(1) } } -func checkArgs() { +func checkArgs() { mode := flyClient.Mode if mode == 0 { fmt.Println("Please choose a mode!") printHelp() os.Exit(1) - }else if mode == 3 || mode == 4 || mode == 5{ - if flyClient.ServerAddr == ""{ - fmt.Println("flynet: please input serverAddr!") + } else if mode == 3 || mode == 4 || mode == 5 { + if flyClient.ServerAddr == "" { + fmt.Println("fly: please input serverAddr!") printHelp() os.Exit(1) } } if len(flyClient.Ports) != 1 { - fmt.Println("flynet: please choose a port!") + fmt.Println("fly: please choose a port!") printHelp() os.Exit(1) } @@ -150,7 +150,7 @@ func checkArgs() { func initLog() { log.InitLog() - flynet.InitLog() - flynet.InitLog() + fly.InitLog() + fly.InitLog() logger = log.GetLogger() } diff --git a/cmd/server/server.go b/cmd/server/server.go index 89316bb..a0c7c4b 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -2,9 +2,9 @@ package main import ( "fmt" + "github.com/asche910/flynet/fly" "github.com/asche910/flynet/log" "github.com/asche910/flynet/server" - "github.com/asche910/flynet/flynet" log2 "log" "os" "strings" @@ -38,13 +38,13 @@ func main() { ports := flyServer.Ports flyServer.PortForward(ports[0], ports[1]) default: - fmt.Println("flynet: unknown error!") + fmt.Println("fly: unknown error!") os.Exit(1) } } func printHelp() { - fmt.Println(`Usage: flynet [options] + fmt.Println(`Usage: fly [options] -M, --mode choose which mode to run. the mode must be one of['http', 'socks5', 'socks5-tcp', 'socks5-udp', 'forward'] -L, --listen choose which port(s) to listen or forward @@ -53,12 +53,11 @@ func printHelp() { -H, --help show detail usage Mail bug reports and suggestions to -or github: https://github.com/asche910/flynet`) +or github: https://github.com/asche910/fly`) } - func parseArgs(args []string) { - if len(args) < 1{ + if len(args) < 1 { return } switch args[0] { @@ -76,21 +75,21 @@ func parseArgs(args []string) { case "forward": flyServer.Mode = 5 default: - fmt.Println("flynet: no correct mode found!") + fmt.Println("fly: no correct mode found!") printHelp() os.Exit(1) } parseArgs(args[2:]) } else { - fmt.Println("flynet: no detail mode found!") + fmt.Println("fly: no detail mode found!") printHelp() os.Exit(1) } case "--listen", "-L": if len(args) > 1 && !strings.HasPrefix(args[1], "-") { - port1 := flynet.CheckPort(args[1]) + port1 := fly.CheckPort(args[1]) if len(args) > 2 && !strings.HasPrefix(args[2], "-") { - port2 := flynet.CheckPort(args[2]) + port2 := fly.CheckPort(args[2]) flyServer.Ports = []string{port1, port2} parseArgs(args[3:]) } else { @@ -98,7 +97,7 @@ func parseArgs(args []string) { parseArgs(args[2:]) } } else { - fmt.Println("flynet: no port found!") + fmt.Println("fly: no port found!") printHelp() os.Exit(1) } @@ -113,26 +112,26 @@ func parseArgs(args []string) { parseArgs(args[1:]) os.Exit(0) default: - fmt.Println("flynet: please input correct command!") + fmt.Println("fly: please input correct command!") printHelp() os.Exit(1) } } -func checkArgs() { +func checkArgs() { if flyServer.Mode == 0 { fmt.Println("Please choose a mode!") printHelp() os.Exit(1) - }else if flyServer.Mode == 5 { + } else if flyServer.Mode == 5 { if len(flyServer.Ports) != 2 { - fmt.Println("flynet: please input two port!") + fmt.Println("fly: please input two port!") printHelp() os.Exit(1) } - }else { + } else { if len(flyServer.Ports) != 1 { - fmt.Println("flynet: please choose a port to listen!") + fmt.Println("fly: please choose a port to listen!") printHelp() os.Exit(1) } @@ -141,7 +140,7 @@ func checkArgs() { func initLog() { log.InitLog() - flynet.InitLog() - flynet.InitLog() + fly.InitLog() + fly.InitLog() logger = log.GetLogger() } diff --git a/cmd/server/server_linux_amd64 b/cmd/server/server_linux_amd64 deleted file mode 100644 index 465d12d..0000000 Binary files a/cmd/server/server_linux_amd64 and /dev/null differ diff --git a/flynet/cipher.go b/fly/cipher.go similarity index 98% rename from flynet/cipher.go rename to fly/cipher.go index ee9bea5..fb5829f 100644 --- a/flynet/cipher.go +++ b/fly/cipher.go @@ -1,4 +1,4 @@ -package flynet +package fly import ( "crypto/aes" diff --git a/fly/conn.go b/fly/conn.go new file mode 100644 index 0000000..490d21e --- /dev/null +++ b/fly/conn.go @@ -0,0 +1,63 @@ +package fly + +import ( + "net" +) + +type Conn struct { + net.Conn + *Cipher +} + +func NewConn(con net.Conn, cipher *Cipher) *Conn { + return &Conn{ + Conn: con, + Cipher: cipher, + } +} + +// dial server and send request addr of client +func DialWithAddr(server string, addr []byte) *Conn { + conn, err := net.Dial("tcp", server) + if err != nil { + logger.Println("Dial server failed!", err) + return nil + } + newConn := NewConn(conn, NewCipherInstance()) + if _, err := newConn.Write(addr); err != nil { + logger.Println("write addr to server failed!", err) + return nil + } + return newConn +} + +func (conn *Conn) Write(b []byte) (n int, err error) { + buff := make([]byte, 1024) + if len(buff) > len(b) { + buff = buff[:len(b)] + } else { + buff = make([]byte, len(b)) + } + + conn.Encrypt(buff, b) + n, err = conn.Conn.Write(buff) + return +} + +func (conn *Conn) Read(b []byte) (n int, err error) { + buff := make([]byte, 1024) + n, err = conn.Conn.Read(buff) + + //fmt.Println("before", buff[:n]) + if n > 0 { + b = b[:n] + conn.Decrypt(b, buff[:n]) + //fmt.Println("after", b[:n]) + } + return +} + +func (conn *Conn) Close() error { + err := conn.Conn.Close() + return err +} diff --git a/flynet/error_utils.go b/fly/error_utils.go similarity index 97% rename from flynet/error_utils.go rename to fly/error_utils.go index d6ba721..ad43656 100644 --- a/flynet/error_utils.go +++ b/fly/error_utils.go @@ -1,4 +1,4 @@ -package flynet +package fly import ( "fmt" diff --git a/flynet/http.go b/fly/http.go similarity index 99% rename from flynet/http.go rename to fly/http.go index bcb52fb..78535da 100644 --- a/flynet/http.go +++ b/fly/http.go @@ -1,4 +1,4 @@ -package flynet +package fly import ( "bytes" diff --git a/flynet/net_utils.go b/fly/net_utils.go similarity index 81% rename from flynet/net_utils.go rename to fly/net_utils.go index f47fba2..7b8aca0 100644 --- a/flynet/net_utils.go +++ b/fly/net_utils.go @@ -1,4 +1,4 @@ -package flynet +package fly import ( "fmt" @@ -10,7 +10,7 @@ import ( func ListenTCP(localPort string) net.Listener { listener, err := net.Listen("tcp", fmt.Sprintf(":%s", localPort)) if err != nil { - logger.Panicf("the port %s has been used!---> %s \n", localPort, err.Error()) + logger.Panicln(PortOccupiedInfo(localPort), err.Error()) } logger.Printf("listen tcp at: %s\n", localPort) return listener @@ -20,7 +20,7 @@ func ListenTCP(localPort string) net.Listener { func ListenUDP(localPort string) net.Listener { listener, err := net.Listen("udp", fmt.Sprintf(":%s", localPort)) if err != nil { - logger.Panicf("the port %s has been used!---> %s \n", localPort, err.Error()) + logger.Panicln(PortOccupiedInfo(localPort), err.Error()) } logger.Printf("listen udp at: %s\n", localPort) return listener diff --git a/flynet/portforward.go b/fly/portforward.go similarity index 98% rename from flynet/portforward.go rename to fly/portforward.go index 8cfae86..ca4d90b 100644 --- a/flynet/portforward.go +++ b/fly/portforward.go @@ -1,4 +1,4 @@ -package flynet +package fly import ( "io" diff --git a/fly/relay.go b/fly/relay.go new file mode 100644 index 0000000..16fa25d --- /dev/null +++ b/fly/relay.go @@ -0,0 +1,59 @@ +package fly + +import ( + "fmt" + "github.com/xtaci/kcp-go" + "net" +) + +func TCPToUDP(session *kcp.UDPSession, conn net.Conn) { + buff := make([]byte, 4096) + for { + n, err := conn.Read(buff) + if err != nil { + logger.Println(err) + break + } + //log.Printf("TCPToUDP read %d byte\n", n) + n, err = session.Write(buff[:n]) + if err != nil { + logger.Println(err) + break + } + } +} + +func UDPToTCP(conn net.Conn, session *kcp.UDPSession) { + buff := make([]byte, 4096) + for { + n, err := session.Read(buff) + if err != nil { + logger.Println(err) + break + } + //log.Printf("UDPToTCP read %d byte\n", n) + n, err = conn.Write(buff[:n]) + if err != nil { + logger.Println(err) + break + } + } +} + +func RelayTraffic(dst, src net.Conn) { + buff := make([]byte, 1024) + for { + n, err := src.Read(buff) + if err != nil { + fmt.Println(err) + break + } + fmt.Println("Read", n) + if n > 0 { + if n, err = dst.Write(buff[:n]); err != nil { + fmt.Println(err) + break + } + } + } +} diff --git a/flynet/socks5.go b/fly/socks5.go similarity index 73% rename from flynet/socks5.go rename to fly/socks5.go index 787ce88..451b716 100644 --- a/flynet/socks5.go +++ b/fly/socks5.go @@ -1,4 +1,4 @@ -package flynet +package fly import ( "crypto/sha1" @@ -78,13 +78,40 @@ func Socks5ForClientByTCP(localPort, serverAddr string) { logger.Println("client accepted!") go func() { - server, err := net.Dial("tcp", serverAddr) + buff := make([]byte, 259) + n, err := client.Read(buff) if err != nil { - logger.Println("connect remote failed!") - return + logger.Println("read handshake request failed!", err) + } + if buff[0] == 0x05 { + if n, err = client.Write([]byte{0x05, 0x00}); err != nil { + logger.Println("write handshake response failed!", err) + } + + // read detail request + if n, err = io.ReadAtLeast(client, buff, 5); err != nil { + logger.Println("read client quest failed!", err) + } + replyBy := []byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + if _, err = client.Write(replyBy); err != nil { + logger.Println("write 'request success' failed!", err) + } + + // + // +----+-----+-------+------+----------+----------+ + // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | + // +----+-----+-------+------+----------+----------+ + // | 1 | 1 | X'00' | 1 | Variable | 2 | + // +----+-----+-------+------+----------+----------+ + // + server := DialWithAddr(serverAddr, buff[:n]) + if server == nil { + return + } + + go RelayTraffic(server, client) + RelayTraffic(client, server) } - go EncodeTo(server, client) - DecodeTo(client, server) }() } } @@ -95,48 +122,25 @@ func Socks5ForServerByTCP(localPort string) { logger.Println("waiting...") client, err := listener.Accept() if err != nil { - fmt.Println("server accept error:", err) + fmt.Println("server accept failed!", err) continue } go func() { - data := make([]byte, 1024) - n, err := client.Read(data[:]) - if err != nil { - logger.Println("read error!") - return - } - - //logger.Println(data[:]) - data = DeCrypt(data[:], n) - //logger.Println(data[:]) + buff := make([]byte, 1024) + conn := NewConn(client, NewCipherInstance()) + n, err := conn.Read(buff) - if data[0] == 0x05 { - // response the success of handshake to client - _, _ = client.Write(Encrypt([]byte{0x05, 0x00}, 2)[:2]) - // read the detail request from client - n, err = client.Read(data[:]) - if err != nil { - logger.Println("read request failed!", err) - return - } - data = DeCrypt(data[:n], n) + host, port := parseSocksRequest(buff[:n], n) + fmt.Printf("target server %s:%s\n", host, port) - var host, port = parseSocksRequest(data, n) - // request to the target server - server, err := net.Dial("tcp", net.JoinHostPort(host, port)) - if err != nil { - logger.Println("dial failed!") - return - } - // response request success to client - by := []byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} - byLen := len(by) - by = Encrypt(by[:], byLen) - _, _ = client.Write(by[:byLen]) - - go DecodeTo(server, client) - EncodeTo(client, server) + // dial the target server + server, err := net.Dial("tcp", net.JoinHostPort(host, port)) + if err != nil { + logger.Println("dial target server failed!", err) + return } + go RelayTraffic(server, conn) + RelayTraffic(conn, server) }() } } @@ -166,7 +170,7 @@ func Socks5ForClientByUDP(localPort, serverAddr string) { serverAddr = "127.0.0.1" + serverAddr } - key := pbkdf2.Key([]byte("flynet"), []byte("asche910"), 1024, 32, sha1.New) + key := pbkdf2.Key([]byte("fly"), []byte("asche910"), 1024, 32, sha1.New) block, _ := kcp.NewAESBlockCrypt(key) session, err := kcp.DialWithOptions(serverAddr, block, 10, 3) if err != nil { @@ -181,7 +185,7 @@ func Socks5ForClientByUDP(localPort, serverAddr string) { } func Socks5ForServerByUDP(localPort string) { - key := pbkdf2.Key([]byte("flynet"), []byte("asche910"), 1024, 32, sha1.New) + key := pbkdf2.Key([]byte("fly"), []byte("asche910"), 1024, 32, sha1.New) block, _ := kcp.NewAESBlockCrypt(key) if listener, err := kcp.ListenWithOptions(":"+localPort, block, 10, 3); err == nil { logger.Printf("server listent udp at %s\n", localPort) @@ -233,7 +237,6 @@ func Socks5ForServerByUDP(localPort string) { // parse socks5 request for target host and port func parseSocksRequest(data []byte, n int) (string, string) { - // 解析并请求内容 var host, port string switch data[3] { case 0x01: // IPV4 address diff --git a/flynet/conn.go b/flynet/conn.go deleted file mode 100644 index 96fce7f..0000000 --- a/flynet/conn.go +++ /dev/null @@ -1,41 +0,0 @@ -package flynet - -import "net" - -type Conn struct { - net.Conn - *Cipher -} - -func (conn *Conn) Write(b []byte) (n int, err error) { - buff := make([]byte, 1024) - if len(buff) > len(b){ - buff = buff[:len(b)] - }else { - buff = make([]byte, len(b)) - } - - conn.Encrypt(buff, b) - n, err = conn.Conn.Write(buff) - return -} - -func (conn *Conn) Read(b []byte) (n int, err error) { - buff := make([]byte, 1024) - if len(buff) > len(b){ - buff = buff[:len(b)] - }else { - buff = make([]byte, len(b)) - } - - n, err = conn.Conn.Read(buff) - if n > 0 { - conn.Decrypt(b[:n], buff[:n]) - } - return -} - -func (conn *Conn) Close() error { - err := conn.Conn.Close() - return err -} diff --git a/flynet/relay.go b/flynet/relay.go deleted file mode 100644 index bb1171b..0000000 --- a/flynet/relay.go +++ /dev/null @@ -1,131 +0,0 @@ -package flynet - -import ( - "crypto/aes" - "crypto/cipher" - "fmt" - "github.com/xtaci/kcp-go" - "io" - "net" -) - -func TCPToUDP(session *kcp.UDPSession, conn net.Conn) { - buff := make([]byte, 4096) - for { - n, err := conn.Read(buff) - if err != nil { - logger.Println(err) - break - } - //log.Printf("TCPToUDP read %d byte\n", n) - n, err = session.Write(buff[:n]) - if err != nil { - logger.Println(err) - break - } - } -} - -func UDPToTCP(conn net.Conn, session *kcp.UDPSession) { - buff := make([]byte, 4096) - for { - n, err := session.Read(buff) - if err != nil { - logger.Println(err) - break - } - //log.Printf("UDPToTCP read %d byte\n", n) - n, err = conn.Write(buff[:n]) - if err != nil { - logger.Println(err) - break - } - } -} - -func EncodeTo(writer io.Writer, reader io.Reader) { - buff := make([]byte, 1024) - for { - n, err := reader.Read(buff[:]) - if err != nil { - logger.Println("EncodeTo ---> read failed!", err) - break - } - //fmt.Println(n) - buff = Encrypt(buff, n) - n, err = writer.Write(buff[:n]) - if err != nil { - logger.Println("EncodeTo ---> write failed!", err) - } - } -} - -func DecodeTo(writer io.Writer, reader io.Reader) { - buff := make([]byte, 1024) - for { - n, err := reader.Read(buff[:]) - if err != nil { - logger.Println("DecodeTo ---> read failed!", err) - return - } - - fmt.Println("before:", buff) - buff = DeCrypt(buff, n) - fmt.Println("after:", buff) - - n, err = writer.Write(buff[:n]) - if err != nil { - logger.Println("DecodeTo ---> write failed!", err) - } - } -} - -func Encrypt(by []byte, n int) []byte { - /* c, err := aes.NewCipher([]byte(key)) - if err != nil { - logger.Println("aes.NewCipher failed!", err) - }*/ - //encrypter := cipher.NewCFBEncrypter(c, commonIV) - var buff = make([]byte, 1024) - //encrypter.XORKeyStream(buff[:n], by[:n]) - // TODO add encrypt algorithm - - block, err := aes.NewCipher([]byte(key)) - if err != nil { - fmt.Println(err) - } - stream := cipher.NewCTR(block, commonIV) - stream.XORKeyStream(buff[:n], by[:n]) - return buff -} - -func DeCrypt(by []byte, n int) []byte { - /*c, err := aes.NewCipher([]byte(key)) - if err != nil { - logger.Println("aes.NewCipher failed!", err) - } - decrypter := cipher.NewCFBDecrypter(c, commonIV)*/ - //var buff = make([]byte, 1024) - //decrypter.XORKeyStream(buff[:n], by[:n]) - //TODO add decrypt algorithm - - return Encrypt(by, n) -} - -func RelayTraffic(dst, src net.Conn) { - buff := make([]byte, 1024) - for { - n, err := src.Read(buff) - if err != nil { - fmt.Println(err) - break - } - fmt.Println("Read", n) - if n > 0 { - if n, err = dst.Write(buff[:n]); err != nil { - fmt.Println(err) - break - } - } - } -} diff --git a/log/log_utils.go b/log/log_utils.go index 1104f5e..b6be5e3 100644 --- a/log/log_utils.go +++ b/log/log_utils.go @@ -29,7 +29,7 @@ func GetLogger() *log.Logger { var f *os.File var err error if logFlag { - f, err = os.OpenFile("flynet.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) + f, err = os.OpenFile("fly.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) if err != nil { log.Println("Create logger file failed!", err) } diff --git a/server/flyserver.go b/server/flyserver.go index b40a918..fa24575 100644 --- a/server/flyserver.go +++ b/server/flyserver.go @@ -1,7 +1,7 @@ package server import ( - "github.com/asche910/flynet/flynet" + "github.com/asche910/flynet/fly" "net" ) @@ -15,21 +15,21 @@ type FlyServer struct { } func (server *FlyServer) LocalSocks5Proxy(port string) { - flynet.StartSocks5(port) + fly.StartSocks5(port) } func (server *FlyServer) LocalHttpProxy(port string) { - flynet.StartHttp(port) + fly.StartHttp(port) } func (server *FlyServer) Socks5ProxyForTCP(localPort string) { - flynet.Socks5ForServerByTCP(localPort) + fly.Socks5ForServerByTCP(localPort) } func (server *FlyServer) Socks5ProxyForUDP(localPort string) { - flynet.Socks5ForServerByUDP(localPort) + fly.Socks5ForServerByUDP(localPort) } func (server *FlyServer) PortForward(laborPort, queryPort string) { - flynet.PortForwardForServer(laborPort, queryPort) + fly.PortForwardForServer(laborPort, queryPort) }