Compare commits

...

1 Commits

Author SHA1 Message Date
Vladislav Yarmak
25a5122a1c initial socks5 support 2025-04-13 00:44:32 +03:00
4 changed files with 38 additions and 4 deletions

1
go.mod
View File

@@ -6,6 +6,7 @@ toolchain go1.24.2
require (
github.com/AdguardTeam/dnsproxy v0.75.2
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e
github.com/cenkalti/backoff/v4 v4.3.0
github.com/google/uuid v1.6.0

2
go.sum
View File

@@ -8,6 +8,8 @@ github.com/ameshkov/dnsstamps v1.0.3 h1:Srzik+J9mivH1alRACTbys2xOxs0lRH9qnTA7Y1O
github.com/ameshkov/dnsstamps v1.0.3/go.mod h1:Ii3eUu73dx4Vw5O4wjzmT5+lkCwovjzaEZZ4gKyIH5A=
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e h1:V9a67dfYqPLAvzk5hMQOXYJlZ4SLIXgyKIE+ZiHzgGQ=
github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=

22
main.go
View File

@@ -53,6 +53,7 @@ type CLIArgs struct {
list_countries, list_proxies, use_trial bool
limit uint
bind_address string
socksMode bool
verbosity int
timeout, rotate time.Duration
proxy_type string
@@ -80,7 +81,8 @@ func parse_args() CLIArgs {
flag.BoolVar(&args.list_countries, "list-countries", false, "list available countries and exit")
flag.BoolVar(&args.list_proxies, "list-proxies", false, "output proxy list and exit")
flag.UintVar(&args.limit, "limit", 3, "amount of proxies in retrieved list")
flag.StringVar(&args.bind_address, "bind-address", "127.0.0.1:8080", "HTTP proxy listen address")
flag.StringVar(&args.bind_address, "bind-address", "127.0.0.1:8080", "proxy listen address")
flag.BoolVar(&args.socksMode, "socks-mode", false, "listen for SOCKS requests instead of HTTP")
flag.IntVar(&args.verbosity, "verbosity", 20, "logging verbosity "+
"(10 - debug, 20 - info, 30 - warning, 40 - error, 50 - critical)")
flag.DurationVar(&args.timeout, "timeout", 35*time.Second, "timeout for network operations")
@@ -139,6 +141,8 @@ func run() int {
proxyLogger := NewCondLogger(log.New(logWriter, "PROXY : ",
log.LstdFlags|log.Lshortfile),
args.verbosity)
socksLogger := log.New(logWriter, "SOCKS : ",
log.LstdFlags|log.Lshortfile)
var dialer ContextDialer = &net.Dialer{
Timeout: 30 * time.Second,
@@ -274,9 +278,19 @@ func run() int {
requestDialer := NewPlaintextDialer(endpoint.NetAddr(), endpoint.TLSName, caPool, args.hideSNI, dialer)
mainLogger.Info("Endpoint: %s", endpoint.URL().String())
mainLogger.Info("Starting proxy server...")
handler := NewProxyHandler(handlerDialer, requestDialer, auth, resolver, proxyLogger)
mainLogger.Info("Init complete.")
err = http.ListenAndServe(args.bind_address, handler)
if args.socksMode {
socks, initError := NewSocksServer(handlerDialer, socksLogger)
if initError != nil {
mainLogger.Critical("Failed to start: %v", err)
return 6
}
mainLogger.Info("Init complete.")
err = socks.ListenAndServe("tcp", args.bind_address)
} else {
handler := NewProxyHandler(handlerDialer, requestDialer, auth, resolver, proxyLogger)
mainLogger.Info("Init complete.")
err = http.ListenAndServe(args.bind_address, handler)
}
mainLogger.Critical("Server terminated with a reason: %v", err)
mainLogger.Info("Shutting down...")
return 0

17
socks_handler.go Normal file
View File

@@ -0,0 +1,17 @@
package main
import (
"log"
"github.com/armon/go-socks5"
)
func NewSocksServer(dialer ContextDialer, logger *log.Logger) (*socks5.Server, error) {
return socks5.New(&socks5.Config{
Rules: &socks5.PermitCommand{
EnableConnect: true,
},
Logger: logger,
Dial: dialer.DialContext,
})
}