/
local.go
82 lines (70 loc) · 1.7 KB
/
local.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package main
import (
"log"
"net"
"os"
"sync/atomic"
"util"
"github.com/FlexibleBroadband/proxy"
)
func main() {
// record traffic.
var (
outTraffic int64
inTraffic int64
conns int64
// remote addr(host and port).
remote = "127.0.0.1:9091"
rand = -1
)
go util.RecordTraffic(&inTraffic, &outTraffic, &conns)
logger := log.New(os.Stdout, "", log.Ldate|log.Lshortfile)
listen, err := net.Listen("tcp", "127.0.0.1:9090")
if err != nil {
panic(err)
}
socks5 := proxy.Socks5Listen{
HandleConnect: func(addr string) (*net.TCPConn, error) {
// logger.Println("connet addr:=", addr)
rand *= -1
// rand = -1
if rand == 1 {
conn, err := net.Dial("tcp", addr)
if err != nil {
logger.Println("connect error:=", err)
return nil, err
}
return conn.(*net.TCPConn), nil
} else {
conn, err := net.Dial("tcp", remote)
if err != nil {
logger.Println("connect remote error:=", err)
return nil, err
}
data := []byte{byte(len(addr))}
_, err = conn.Write(append(data, []byte(addr)...))
if err != nil {
logger.Println("conn write error::", err)
}
return conn.(*net.TCPConn), nil
}
},
Transport: func(target net.Conn, client net.Conn) error {
atomic.AddInt64(&conns, 1)
defer atomic.AddInt64(&conns, -1)
go util.Copy(client, target, &inTraffic)
_, err := util.Copy(target, client, &outTraffic)
return err
},
Auth: func(id, pwd []byte) bool {
logger.Println(len(id), len(pwd))
logger.Printf("user(%s) pwd(%s)", id, pwd)
return true
},
HandleAssociate: proxy.DefaultHandleAssociate,
TransportUdp: proxy.DefaultTransportUdp,
AddrForClient: "127.0.0.1",
RawListen: listen,
}
socks5.Listen()
}