From 43152b129645b9934ef6efdbd911e7396cb79c66 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 15 Apr 2023 15:25:43 -0600 Subject: [PATCH] rename --- config.go | 9 +++------ main.go | 4 ++-- socks.go | 22 ---------------------- tcp.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 30 deletions(-) delete mode 100644 socks.go create mode 100644 tcp.go diff --git a/config.go b/config.go index fe68ea1..7c5c9c2 100644 --- a/config.go +++ b/config.go @@ -15,8 +15,7 @@ type Config struct { TLSInsecure bool Limiter *rate.Limiter DNS string - Socks bool - Proxy string + TCPProxy string } func NewConfig() *Config { @@ -25,11 +24,10 @@ func NewConfig() *Config { as.Append(args.INT, "p", "port to listen on", 61113) as.Append(args.INT, "kbps", "kilobytes per sec limit", -1) as.Append(args.BOOL, "tls-insecure", "permit tls insecure", false) - as.Append(args.BOOL, "socks", "accept socks instead", false) as.Append(args.DURATION, "t", "timeout", time.Minute) as.Append(args.STRING, "dns", "dns ip:port", "1.1.1.1:53") - as.Append(args.STRING, "proxy", "scheme://host:port to proxy proxied to", "") + as.Append(args.STRING, "tcp-proxy", "host:port to tcp proxy to instead", "") if err := as.Parse(); err != nil { panic(err) @@ -47,7 +45,6 @@ func NewConfig() *Config { TLSInsecure: as.GetBool("tls-insecure"), Limiter: limiter, DNS: as.GetString("dns"), - Socks: as.GetBool("socks"), - Proxy: as.GetString("proxy"), + TCPProxy: as.GetString("tcp-proxy"), } } diff --git a/main.go b/main.go index f217287..1d24f38 100644 --- a/main.go +++ b/main.go @@ -9,8 +9,8 @@ func main() { config := NewConfig() log.Printf("config: %+v", *config) - if config.Socks { - server := NewSocksServer(config) + if config.TCPProxy != "" { + server := NewTCPServer(config) if err := server.Listen(); err != nil { panic(err) } diff --git a/socks.go b/socks.go deleted file mode 100644 index b7c9156..0000000 --- a/socks.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "github.com/armon/go-socks5" -) - -type Socks struct { - config *Config -} - -func NewSocksServer(c *Config) Socks { - return Socks{config: c} -} - -func (socks Socks) Listen() error { - conf := &socks5.Config{} - server, err := socks5.New(conf) - if err != nil { - return err - } - return server.ListenAndServe("tcp", socks.config.Listen) -} diff --git a/tcp.go b/tcp.go new file mode 100644 index 0000000..dda0a8a --- /dev/null +++ b/tcp.go @@ -0,0 +1,56 @@ +package main + +import ( + "io" + "log" + "net" +) + +type TCP struct { + config *Config +} + +func NewTCPServer(c *Config) TCP { + return TCP{config: c} +} + +func (tcp TCP) Listen() error { + ln, err := net.Listen("tcp", tcp.config.Listen) + if err != nil { + return err + } + defer ln.Close() + + for { + conn, err := ln.Accept() + if err != nil { + return err + } + go func() { + defer conn.Close() + + conn2, err := net.Dial("tcp", tcp.config.TCPProxy) + if err != nil { + log.Println(err) + return + } + + errc := make(chan error) + go func() { + _, err := io.Copy(conn, conn2) + select { + case errc <- err: + default: + } + }() + go func() { + _, err := io.Copy(conn2, conn) + select { + case errc <- err: + default: + } + }() + <-errc + }() + } +}