Skip to content

Commit d9672e9

Browse files
committed
switch socks library for better context and UDP support
1 parent ef9f217 commit d9672e9

4 files changed

Lines changed: 17 additions & 25 deletions

File tree

cmd/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,12 @@ func main() {
102102
totalNetworks := 1 << totalNetworksBits
103103
l.Printf("Running with subnet size /%d and /%d prefix resulting in %d egress networks and %d options per network", *subnetBits, cidrBits, totalNetworks, hostsPerNetwork)
104104

105+
ctx := context.Background()
106+
105107
// test mode
106108
if *runTest {
107109
// test requests
108-
err := test(context.Background(), parsedNetwork, *subnetBits)
110+
err := test(ctx, parsedNetwork, *subnetBits)
109111
if err != nil {
110112
l.Fatal(err)
111113
}
@@ -121,7 +123,7 @@ func main() {
121123

122124
// run subnet proxy server
123125
l.Printf("Starting subnet egress proxy %s\n", *listenAddr)
124-
err = runRandomSubnetProxy(*listenAddr, parsedNetwork, *subnetBits)
126+
err = runRandomSubnetProxy(ctx, *listenAddr, parsedNetwork, *subnetBits)
125127
if err != nil {
126128
l.Fatal(err)
127129
}

cmd/socks.go

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ import (
66
"net/netip"
77
"strconv"
88

9-
"github.com/haxii/socks5"
9+
"github.com/lanrat/go-socks5"
1010
"github.com/lanrat/stargate"
11-
"golang.org/x/sync/errgroup"
1211
)
1312

1413
// runRandomSubnetProxy starts a SOCKS5 proxy server listening on listenAddr that distributes
@@ -17,7 +16,7 @@ import (
1716
// This is memory efficient for large IPv6 ranges as it doesn't pre-generate all addresses.
1817
// The function cycles through all available subnets before repeating.
1918
// Supports both TCP and UDP protocols simultaneously.
20-
func runRandomSubnetProxy(listenAddr string, parsedNetwork netip.Prefix, cidrSize uint) error {
19+
func runRandomSubnetProxy(ctx context.Context, listenAddr string, parsedNetwork netip.Prefix, cidrSize uint) error {
2120
ipItr, err := stargate.NewRandomIPIterator(parsedNetwork, cidrSize)
2221
if err != nil {
2322
return err
@@ -34,10 +33,15 @@ func runRandomSubnetProxy(listenAddr string, parsedNetwork netip.Prefix, cidrSiz
3433
return err
3534
}
3635

36+
udpDial := func(ctx context.Context, network string, udpClientSrcAddr, targetUDPAddr *net.UDPAddr) (net.Conn, error) {
37+
return ipItr.Dial(ctx, network, targetUDPAddr.String())
38+
}
39+
3740
conf := &socks5.Config{
3841
Logger: l,
3942
Resolver: NewDNSResolver(getCIDRNetwork(parsedNetwork)),
4043
Dial: ipItr.Dial,
44+
DialUDP: udpDial,
4145
BindIP: net.ParseIP(host),
4246
BindPort: port,
4347
}
@@ -46,23 +50,9 @@ func runRandomSubnetProxy(listenAddr string, parsedNetwork netip.Prefix, cidrSiz
4650
return err
4751
}
4852

49-
// Use errgroup to manage both TCP and UDP listeners
50-
var g errgroup.Group
51-
52-
// Start TCP listener
53-
g.Go(func() error {
54-
l.Printf("Starting TCP SOCKS5 proxy on %s", listenAddr)
55-
return server.ListenAndServe("tcp", listenAddr)
56-
})
57-
58-
// Start UDP listener
59-
g.Go(func() error {
60-
l.Printf("Starting UDP SOCKS5 proxy on %s", listenAddr)
61-
return server.ListenAndServe("udp", listenAddr)
62-
})
63-
64-
// Wait for both listeners, return first error
65-
return g.Wait()
53+
// Start TCP SOCKS5 proxy (UDP is handled internally by the server when BindPort is set)
54+
l.Printf("Starting SOCKS5 proxy on %s", listenAddr)
55+
return server.ListenAndServe(ctx, listenAddr)
6656
}
6757

6858
// DNSResolver implements socks5.NameResolver using the system DNS resolver.

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module github.com/lanrat/stargate
22

33
require (
4-
github.com/haxii/socks5 v1.0.0
4+
github.com/lanrat/go-socks5 v0.1.1
55
golang.org/x/sync v0.16.0
66
)
77

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
github.com/haxii/socks5 v1.0.0 h1:78BIzd4lHibdRNOKdMwKCnnsgYLW9SeotqU+nMhWSSo=
2-
github.com/haxii/socks5 v1.0.0/go.mod h1:6O9Ba2yrLlvuSe/L1e84eZI8cPw6H+q1Ilr4hjgm4uY=
1+
github.com/lanrat/go-socks5 v0.1.1 h1:e9w0XT/p6Gts5EutFXypULpmM3Ul1mz1Vg3Q4mjkN+Q=
2+
github.com/lanrat/go-socks5 v0.1.1/go.mod h1:EOAqUXY0ToNGWAW4/lZ/jwlrCISCW3tSIZ7kcO579KI=
33
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
44
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=

0 commit comments

Comments
 (0)