Skip to content

Commit 587cb28

Browse files
committed
完成第一版
0 parents  commit 587cb28

File tree

7 files changed

+158
-0
lines changed

7 files changed

+158
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.idea

README.md

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# GoProxy代理
2+
3+
HttpProxy有点小Bug没修好,Sock5代理几乎完美,可以拿去用了
4+
5+
启动方法
6+
7+
```
8+
chmod a+x ./sock5
9+
10+
# 非后台启动
11+
./sock5 --port=8081
12+
13+
# 后台启动
14+
nohup ./sock5 --port=8081
15+
```

bin/darwin/sock5

2.87 MB
Binary file not shown.

bin/linux64/sock5

2.88 MB
Binary file not shown.

bin/win64/sock5.exe

2.7 MB
Binary file not shown.

src/http/HttpProxy.go

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"io"
7+
"log"
8+
"net"
9+
"net/url"
10+
"strings"
11+
)
12+
13+
func main() {
14+
log.SetFlags(log.LstdFlags | log.Lshortfile)
15+
l, err := net.Listen("tcp", ":8081")
16+
if err != nil {
17+
log.Panic(err)
18+
}
19+
20+
for {
21+
client, err := l.Accept()
22+
if err != nil {
23+
log.Panic(err)
24+
}
25+
go handleClientHttpRequest(client)
26+
}
27+
}
28+
29+
func handleClientHttpRequest(client net.Conn) {
30+
if client == nil {
31+
return
32+
}
33+
defer client.Close()
34+
35+
var b [1024]byte
36+
_, err := client.Read(b[:])
37+
if err != nil {
38+
log.Println(err)
39+
return
40+
}
41+
var method, host, address string
42+
fmt.Sscanf(string(b[:bytes.IndexByte(b[:], '\n')]), "%s%s", &method, &host)
43+
hostPortURL, err := url.Parse(host)
44+
if err != nil {
45+
log.Println(err)
46+
return
47+
}
48+
49+
if hostPortURL.Opaque == "443" { //https访问
50+
address = hostPortURL.Scheme + ":443"
51+
} else { //http访问
52+
if strings.Index(hostPortURL.Host, ":") == -1 { //host不带端口, 默认80
53+
address = hostPortURL.Host + ":80"
54+
} else {
55+
address = hostPortURL.Host
56+
}
57+
}
58+
fmt.Println(address)
59+
//获得了请求的host和port,就开始拨号吧
60+
server, err := net.Dial("tcp", address)
61+
if err != nil {
62+
log.Println(err)
63+
return
64+
}
65+
defer server.Close()
66+
if method == "CONNECT" {
67+
fmt.Fprint(client, "HTTP/1.1 200 Connection established\r\n\r\n")
68+
} else {
69+
server.Write(b[:])
70+
}
71+
//进行转发
72+
go io.Copy(server, client)
73+
io.Copy(client, server)
74+
}

src/sock5/Sock5Proxy.go

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package main
2+
3+
import (
4+
"io"
5+
"log"
6+
"net"
7+
"strconv"
8+
"flag"
9+
)
10+
11+
func main() {
12+
port := "8081"
13+
flag.StringVar(&port, "port", "8081", "请输入服务端绑定的端口")
14+
flag.Parse()
15+
log.SetFlags(log.LstdFlags | log.Lshortfile)
16+
l, err := net.Listen("tcp", ":"+port)
17+
if err != nil {
18+
log.Panic(err)
19+
}
20+
for {
21+
client, err := l.Accept()
22+
if err != nil {
23+
log.Panic(err)
24+
}
25+
go handleClientSockRequest(client)
26+
}
27+
}
28+
func handleClientSockRequest(client net.Conn) {
29+
if client == nil {
30+
return
31+
}
32+
defer client.Close()
33+
var b [1024]byte
34+
n, err := client.Read(b[:])
35+
if err != nil {
36+
log.Println(err)
37+
return
38+
}
39+
//判断是不是Sock5协议
40+
if b[0] == 0x05 {
41+
//客户端回应:Socket服务端不需要验证方式
42+
client.Write([]byte{0x05, 0x00})
43+
n, err = client.Read(b[:])
44+
var host, port string
45+
switch b[3] {
46+
case 0x01: //IP V4
47+
host = net.IPv4(b[4], b[5], b[6], b[7]).String()
48+
case 0x03: //域名
49+
host = string(b[5 : n-2]) //b[4]表示域名的长度
50+
case 0x04: //IP V6
51+
host = net.IP{b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15], b[16], b[17], b[18], b[19]}.String()
52+
}
53+
port = strconv.Itoa(int(b[n-2])<<8 | int(b[n-1]))
54+
address := net.JoinHostPort(host, port)
55+
server, err := net.Dial("tcp", address)
56+
if err != nil {
57+
log.Println(err)
58+
return
59+
}
60+
log.Println(address)
61+
defer server.Close()
62+
//响应客户端连接成功
63+
client.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
64+
//进行转发
65+
go io.Copy(server, client)
66+
io.Copy(client, server)
67+
}
68+
}

0 commit comments

Comments
 (0)