master
bel 2023-04-15 15:25:43 -06:00
parent 45a0dc5b6b
commit 43152b1296
4 changed files with 61 additions and 30 deletions

View File

@ -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"),
}
}

View File

@ -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)
}

View File

@ -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)
}

56
tcp.go Normal file
View File

@ -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
}()
}
}