mirror of
https://github.com/GameXG/ProxyClient.git
synced 2025-12-24 13:57:50 +08:00
fix #16 socks4 错误
This commit is contained in:
@@ -46,7 +46,9 @@ type socksProxyClient struct {
|
||||
// UpProxy
|
||||
func newSocksProxyClient(proxyType, proxyAddr, username, password string, upProxy ProxyClient, query map[string][]string) (ProxyClient, error) {
|
||||
proxyType = strings.ToLower(strings.Trim(proxyType, " \r\n\t"))
|
||||
if proxyType != "socks4" && proxyType != "socks5" {
|
||||
switch proxyType {
|
||||
case "socks4", "socks4a", "socks5":
|
||||
default:
|
||||
return nil, errors.New("ProxyType 错误的格式")
|
||||
}
|
||||
|
||||
@@ -159,7 +161,7 @@ func (p *socksProxyClient) DialTCPSAddrTimeout(network string, raddr string, tim
|
||||
if cerr != nil {
|
||||
closed = true
|
||||
c.Close()
|
||||
rerr = fmt.Errorf("请求代理服务器建立连接失败:%v", err)
|
||||
rerr = fmt.Errorf("请求代理服务器建立连接失败:%v", cerr)
|
||||
ch <- 0
|
||||
return
|
||||
}
|
||||
@@ -364,6 +366,7 @@ func socksSendCmdRequest(w io.Writer, p *socksProxyClient, cmd byte, raddr strin
|
||||
b = append(b, portByte...)
|
||||
// ip
|
||||
b = append(b, []byte(ip)...)
|
||||
b = append(b, 0)
|
||||
} else {
|
||||
return fmt.Errorf("未知的 socks 代理类型:%v", p.proxyType)
|
||||
}
|
||||
@@ -382,7 +385,7 @@ func socksRecvCmdResponse(r io.Reader, p *socksProxyClient) (rep int, dstAddr st
|
||||
b := make([]byte, 255+10)
|
||||
if p.proxyType == "socks4" || p.proxyType == "socks4a" {
|
||||
//ver
|
||||
if _, cerr := io.ReadFull(r, b[:1]); cerr != nil || b[0] != 0x04 {
|
||||
if _, cerr := io.ReadFull(r, b[:1]); cerr != nil || b[0] != 0 {
|
||||
err = fmt.Errorf("socks4代理服务器 命令响应错误,ver=%v", b[0])
|
||||
return
|
||||
}
|
||||
|
||||
@@ -5,8 +5,15 @@ import (
|
||||
"encoding/binary"
|
||||
"io"
|
||||
"net"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"fmt"
|
||||
|
||||
"strconv"
|
||||
|
||||
"gopkg.in/bufio.v1"
|
||||
)
|
||||
|
||||
func testSocks5ProixyServer(t *testing.T, proxyAddr string, usernameAndPassword []byte, attypAddr []byte, port uint16, ci chan int) {
|
||||
@@ -110,7 +117,7 @@ func testSocks5ProxyClient(t *testing.T, proxyAddr string, addr string) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSocksProxy(t *testing.T) {
|
||||
func TestSocks5Proxy(t *testing.T) {
|
||||
ci := make(chan int)
|
||||
b := make([]byte, 0, 30)
|
||||
|
||||
@@ -145,39 +152,163 @@ func TestSocksProxy(t *testing.T) {
|
||||
testSocks5ProxyClient(t, "socks5://127.0.0.1:13339", "[1:2:3:4::5:6]:80")
|
||||
}
|
||||
|
||||
func TestSocksProxyA(t *testing.T) {
|
||||
ci := make(chan int)
|
||||
b := make([]byte, 0, 30)
|
||||
func TestSocks4Proxy(t *testing.T) {
|
||||
l, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
userAndPass := []byte{0x04, 'u', 's', 'e', 'r', 0x04, 'p', 'a', 's', 's'}
|
||||
sAddr := l.Addr().String()
|
||||
|
||||
// 测试域名
|
||||
addr := "www.163.com"
|
||||
test := func(addr string, proxy string) {
|
||||
p, err := NewProxyClient(fmt.Sprint(proxy))
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
b = append(b, 0x03, byte(len(addr)))
|
||||
b = append(b, []byte(addr)...)
|
||||
go func() {
|
||||
dstIp, dstHost, dstPort, err := Socks4Server(t, l)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13347", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13347", "www.163.com:80")
|
||||
host, port, err := net.SplitHostPort(sAddr)
|
||||
ip := net.ParseIP(host)
|
||||
|
||||
// 测试 ipv4
|
||||
addr = "1.2.3.4"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x01)
|
||||
b = append(b, []byte(net.ParseIP(addr).To4())...)
|
||||
if len(ip) == 0 {
|
||||
if host != dstHost {
|
||||
t.Error("host!=dstHost")
|
||||
return
|
||||
}
|
||||
} else {
|
||||
ip = ip.To4()
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13348", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13348", "1.2.3.4:80")
|
||||
if !reflect.DeepEqual(ip, dstIp) {
|
||||
t.Error("ip!=dstIp")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 测试 ipv6
|
||||
addr = "1:2:3:4::5:6"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x04)
|
||||
b = append(b, []byte(net.ParseIP(addr))...)
|
||||
if port != strconv.Itoa(dstPort) {
|
||||
t.Error("port!=dstPort")
|
||||
return
|
||||
}
|
||||
}()
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13349", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13349", "[1:2:3:4::5:6]:80")
|
||||
c, err := p.Dial("tcp", addr)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
data := []byte{0, 1, 2, 3, 4}
|
||||
_, err = c.Write(data)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
b := make([]byte, len(data))
|
||||
_, err = io.ReadFull(c, b)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
time.Sleep(1 * time.Second)
|
||||
|
||||
if !reflect.DeepEqual(data, b) {
|
||||
t.Errorf("%#v!=%#v", data, b)
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 测试 ip 地址
|
||||
test("1.2.3.4:80", fmt.Sprint("socks4://", sAddr))
|
||||
test("1.2.3.4:80", fmt.Sprint("socks4a://", sAddr))
|
||||
|
||||
// 测试 域名
|
||||
test("www.aaa.com:80", fmt.Sprint("socks4a://", sAddr))
|
||||
}
|
||||
|
||||
func Socks4Server(t *testing.T, l net.Listener) (dstIp net.IP, dstHost string, dstPort int, err error) {
|
||||
/*
|
||||
l, err := net.Listen("tcp", "127.0.0.0:0")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
addr = l.Addr().String()
|
||||
*/
|
||||
cmd := make([]byte, 9, 100)
|
||||
|
||||
var c net.Conn
|
||||
c, err = l.Accept()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
r := bufio.NewReader(c)
|
||||
|
||||
_, err = io.ReadFull(r, cmd)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
vn := cmd[0]
|
||||
cd := cmd[1]
|
||||
dstport := cmd[2 : 2+2]
|
||||
dstip := cmd[4 : 4+4]
|
||||
null := cmd[8]
|
||||
|
||||
if vn != 4 || cd != 1 {
|
||||
t.Error("vn!=4 || cd!=1")
|
||||
return
|
||||
}
|
||||
|
||||
dstPort = int(binary.BigEndian.Uint16(dstport))
|
||||
|
||||
if null != 0 {
|
||||
t.Error("null!=0")
|
||||
return
|
||||
}
|
||||
|
||||
if reflect.DeepEqual(dstip[:3], []byte{0, 0, 0}) {
|
||||
// 域名
|
||||
var b []byte
|
||||
b, err = r.ReadSlice(0)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
if b[len(b)-1] != 0 {
|
||||
t.Fatal("b[len(b)-1:]!=0")
|
||||
return
|
||||
}
|
||||
|
||||
dstHost = string(b[:len(b)-1])
|
||||
} else {
|
||||
dstIp = net.IP(dstip)
|
||||
}
|
||||
|
||||
buf := []byte{0, 90}
|
||||
buf = append(buf, dstport...)
|
||||
buf = append(buf, dstip...)
|
||||
_, err = c.Write(buf)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
_, err = io.Copy(c, r)
|
||||
if err == io.EOF {
|
||||
err = nil
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user