-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
87 lines (76 loc) · 1.4 KB
/
main.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
83
84
85
86
87
package main
//test comment
import (
"flag"
"io"
"log"
"net"
"sync"
)
var (
liface string
proxy1 string
proxy2 string
pattern string
route chan string
)
func Listen() error {
lis, err := net.Listen("tcp", liface)
defer lis.Close()
if err != nil {
return err
}
for {
conn, err := lis.Accept()
if err != nil {
log.Println("Accept error:", err)
}
c := <-route
switch c {
case "1":
log.Printf("Proxy 1: %s -> %s", conn.RemoteAddr(), proxy1)
go forward(conn, proxy1)
case "2":
log.Printf("Proxy 2: %s -> %s", conn.RemoteAddr(), proxy2)
go forward(conn, proxy2)
}
}
}
func forward(in net.Conn, iproxy string) {
out, err := net.Dial("tcp", iproxy)
defer out.Close()
defer in.Close()
if err != nil {
return
}
var wg sync.WaitGroup
wg.Add(1)
go func() {
io.Copy(out, in)
wg.Done()
}()
wg.Add(1)
go func() {
io.Copy(in, out)
wg.Done()
}()
wg.Wait()
}
func router() {
for {
for _, r := range pattern {
c := string(r)
route <- c
}
}
}
func main() {
flag.StringVar(&liface, "l", "", "listen interface format ip:port")
flag.StringVar(&proxy1, "1", "", "proxy #1 format host:port")
flag.StringVar(&proxy2, "2", "", "proxy #2 format host:port")
flag.StringVar(&pattern, "p", "12", "proxy switch pattern. e.g. 12 to alternate proxies or 1121112 as more complex switch pattern")
flag.Parse()
route = make(chan string)
go router()
Listen()
}