This repository has been archived by the owner on Apr 23, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
local.go
77 lines (69 loc) · 1.65 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
package main
import (
"log"
"net"
socks "github.com/reusee/socks5-server"
"github.com/reusee/van"
//"../van"
)
func startLocal(remoteAddr, socksAddr string) {
// connect to remote
client, err := van.NewClient(remoteAddr)
if err != nil {
log.Fatalf("van.NewClient %v", err)
}
defer client.Close()
p("Connected.\n")
// set conns
for i := 0; i < 8; i++ {
client.NewTransport()
}
client.OnSignal("RemoveTransport", func() {
client.NewTransport()
})
// start socks server
socksServer, err := socks.New(socksAddr)
if err != nil {
log.Fatalf("socks5.NewServer %v", err)
}
defer socksServer.Close()
p("Socks5 server started.\n")
// globals
socksClientConns := make(map[uint32]net.Conn)
hostPorts := make(map[uint32]string)
// handle socks client
socksServer.OnSignal("client", func(args ...interface{}) {
go func() {
conn := client.NewConn()
socksClientConn := args[0].(net.Conn)
socksClientConns[conn.Id] = socksClientConn
hostPort := args[1].(string)
hostPorts[conn.Id] = string(hostPort)
// send hostport
client.Send(conn, obfuscate([]byte(hostPort)))
// read from socks conn and send to remote
for {
data := make([]byte, 2048)
n, err := socksClientConn.Read(data)
if err != nil { // socks conn closed
// send a zero-lengthed packet
client.Finish(conn)
return
}
data = data[:n]
client.Send(conn, obfuscate(data))
}
}()
})
// handle packet from remote
for {
packet := <-client.Recv
switch packet.Type {
case van.DATA:
data := obfuscate(packet.Data)
socksClientConns[packet.Conn.Id].Write(data)
case van.FIN:
socksClientConns[packet.Conn.Id].Close()
}
}
}