透明代理(三)
三 、 通过上级代理建议远程连接
- 直接使用 golang 官方库实现远程连接建立
支持 HTTP,HTTP+CONNECT,SOCKS
自己动手实现SOCKS5连接
与服务建立TCP连接
1
2
3
4conn, err = net.Dial("tcp", proxy)
if err != nil {
return
}发送SOCKS5会话标识 (无认证)
1
2
3
4_, err = conn.Write([]byte{0x05, 0x01, 0x00})
if err != nil {
return
}读取服务端响应
1
2
3
4
5
6
7
8
9ans := make([]byte, 2)
_, err = io.ReadFull(conn, ans)
if err != nil {
return
}
if ans[0] != 0x05 || ans[1] != 0x00 {
err = errors.New("server answer error")
return
}ans[1] == 0x00 表示无需认证
发送目标地址及端口号
1
2
3
4
5
6
7
8
9
10
11
12_, err = conn.Write([]byte{0x05, 0x01, 0x00, 0x01})
if err != nil {
return
}
_, err = conn.Write(raddr.IP.To4())
if err != nil {
return
}
err = binary.Write(conn, binary.BigEndian, uint16(raddr.Port))
if err != nil {
return
}读取服务器响应 (会话标识+其他数据共
10 bytes
)1
2ans = make([]byte, 10)
_, err = io.ReadFull(conn, ans)
到此 SOCKS5 会话建立成功。