fix #16 socks4 错误

This commit is contained in:
GameXG
2017-10-08 16:30:46 +08:00
parent 58a3319ee0
commit d4299b9428
2 changed files with 165 additions and 31 deletions

View File

@@ -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
}

View File

@@ -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
}