From 052c86d12c022e847c97d3f1ced7d8c1279bb86c Mon Sep 17 00:00:00 2001 From: GuoYuefei Date: Wed, 14 Aug 2019 22:01:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dudp=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=B8=AD=E3=80=82=E3=80=82=E3=80=82=E4=B8=BA=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bard-plugin | 2 +- bard/TCSubProtocol.go | 15 ++-- bard/conn.go | 17 ++++- bard/request.go | 7 +- bard/udpconn.go | 125 ++++++++++++++++++++++++--------- client/debug/config/config.yml | 8 +-- 6 files changed, 124 insertions(+), 50 deletions(-) diff --git a/bard-plugin b/bard-plugin index e797830..5a48567 160000 --- a/bard-plugin +++ b/bard-plugin @@ -1 +1 @@ -Subproject commit e797830cca79ad6ce68cd86a81c20dffc54ec7c7 +Subproject commit 5a48567a4584bd94ffdc9d6335d15cb9df926bff diff --git a/bard/TCSubProtocol.go b/bard/TCSubProtocol.go index 2b22ee2..1776d85 100644 --- a/bard/TCSubProtocol.go +++ b/bard/TCSubProtocol.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io" - "net" "os" "path/filepath" "plugin" @@ -24,10 +23,10 @@ var SubProtocol_ZERO = errors.New("No valid SubProtocol Plugin under the folder type TCSPReadDo interface { // @describe 根据协议从conn中读取控制信息 - // @param conn net.Conn 可以读取的连接 + // @param conn io.Reader 可以读取的连接 // @return []byte 本函数从conn中读取的内容 // @return uint 得到接下来数据包的长度 - ReadDo(conn net.Conn) ([]byte, int) + ReadDo(conn io.Reader) ([]byte, int) } type TCSPWriteDo interface { @@ -114,13 +113,13 @@ func SubProtocolsFromDir(subProtocolsPath string) (ts *TCSubProtocols, e error) } // 一个默认的TCSubProtocol的Do函数 -func DefaultTCSPReadDo(conn net.Conn) ([]byte, int) { +func DefaultTCSPReadDo(reader io.Reader) ([]byte, int) { // default len is two byte lslice := make([]byte, 2) - _, err := ReadFull(conn, lslice) - //fmt.Println("err:", err) - if err != nil && err != io.EOF { - //fmt.Println("readdo readfull") + _, err := io.ReadFull(reader, lslice) + //fmt.Println("err:", err) && err != io.EOF + if err != nil { + //fmt.Println(err) return nil, 0 } // 大端 diff --git a/bard/conn.go b/bard/conn.go index 050225d..ab7f9bc 100644 --- a/bard/conn.go +++ b/bard/conn.go @@ -114,6 +114,14 @@ Write: func (c *Conn) Read(b []byte) (n int, err error) { // 如果没插件那就正常读取 if c.plugin == nil { + if c.protocol != nil { + _, n = c.protocol.ReadDo(c.Conn) + + if n == 0 { + return 0, errors.New("read package len error or io.EOF") + } + // 这里的protocol没有用处(无plugin),仅处理好控制信息,但是对读取信息过程不影响 + } n, err = c.Conn.Read(b) _ = c.SetDeadline(c.GetDeadline()) return @@ -139,9 +147,14 @@ func (c *Conn) Read(b []byte) (n int, err error) { } } - // io.EOF会返回[0,0], 0. 其他错误nil, 0 - _, n = c.protocol.ReadDo(c.Conn) + if c.protocol == nil { + // 在有plugin下,必须配置子协议 + panic("conn read: Subprotocols must be configured in the presence of plug-ins") + } + // io.EOF和其他错误[], 0 + _, n = c.protocol.ReadDo(c.Conn) + //fmt.Println(do, n) if n == 0 { return 0, errors.New("read package len error or io.EOF") } diff --git a/bard/request.go b/bard/request.go index de068b6..4c47c83 100644 --- a/bard/request.go +++ b/bard/request.go @@ -83,17 +83,20 @@ func (c *Client)PipeUdp() { // c.RemoteConn 主要是把含有plugin的一个连接传入 此时Packet类型中的client就是远程代理服务器的监听地址了。 因为udp交流是双方是平等的,也可以将远程服务器理解成本udp连接的客户端 packet, e := NewPacket(/*c.LocalConn*/c.RemoteConn, localPacket, c.PCRsp.SAddr.PortToInt()) if e != nil { + Logln(e) return } packet.SetTimeout(c.config.Timeout) if addr, ok := c.LocalConn.RemoteAddr().(*net.TCPAddr); ok { udpAddr, err := net.ResolveUDPAddr("udp", addr.IP.String()+":"+strconv.Itoa(c.PCQI.Dst.PortToInt())) if err != nil { + Logln(e) return } packet.AddServer("local", udpAddr) } else { - Deb.Println("c.LocalConn.RemoteAddr() is not a TCPAddr") + Logln("c.LocalConn.RemoteAddr() is not a TCPAddr") + return } wg := new(sync.WaitGroup) wg. Add(2) @@ -109,7 +112,7 @@ func (c *Client)PipeUdp() { err = packet.ListenToFixedTarget("local") if err != nil { // 记录到日志 可能以后会出现其他错误 如果只是udp关闭的话就是正确的逻辑 - Slog.Println("packet.listen close:", err) + Logln("packet.listen close:", err) close(packet.message) break } diff --git a/bard/udpconn.go b/bard/udpconn.go index 5131290..edd801d 100644 --- a/bard/udpconn.go +++ b/bard/udpconn.go @@ -52,6 +52,7 @@ type Packet struct { Socks *Conn // 插件类型一般是由Socks带入Packet的 message chan *UdpMessage Frag uint8 // udp分段 + buf map[string] []byte } func (p *Packet) GetDeadline() time.Time { @@ -76,6 +77,7 @@ func NewPacket(conn *Conn, p *net.UDPConn, cport int) (*Packet, error) { packet.Packet = p packet.Servers = make(map[string]*net.UDPAddr) packet.message = make(chan *UdpMessage, MESSAGESIZE) + packet.buf = make(map[string] []byte) if addr, ok := caddr.(*net.TCPAddr); ok { packet.Client, err = net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", addr.IP, cport)) @@ -112,7 +114,7 @@ func (p *Packet) Request() (n int, err error) { func (p *Packet) Listen() error { var message = &UdpMessage{} - var buf = make([]byte, BUFSIZE) + var buf = make([]byte, ReadBUFSIZE) nr, addr, err := p.ReadFrom(buf) if err != nil { @@ -133,9 +135,13 @@ func (p *Packet) Listen() error { if p.Client.String() != uaddr.String() { p.Client = uaddr //改变p.client的port } - // endtodo 消息来自客户端就需要进行解密 + // node 1 消息来自客户端就需要进行解密 解密就可能存在多余数据或者少数据的情况,这时候就需要用p.buf将其存起来 if p.Socks.plugin != nil { - _, nr = p.Socks.plugin.Ornament(buf[0:nr], RECEIVE) + //_, nr = p.Socks.plugin.Ornament(buf[0:nr], RECEIVE) + buf, nr = p.Decode(buf[0:nr], addr) + if nr == 0 { + return nil + } } reader := bufio.NewReader(bytes.NewReader(buf[0:nr])) // 客户端发来的消息 @@ -144,6 +150,7 @@ func (p *Packet) Listen() error { Deb.Println(err) return err } + fmt.Println(udpreqs) // 如果原本远程servers列表存在该远程主机,就直接提取 if dst, ok := p.Servers[udpreqs.String()]; ok { message.dst = dst @@ -189,9 +196,10 @@ func (p *Packet) Listen() error { head = append(head, uint8(src.Port>>8), uint8(src.Port)) data = append(head, data...) - // endtodo 数据要加密 对于远程主机发来的消息就应该加密发送给客户端 虽然可能插件不一定存在加密过程 + // node 2 数据要加密 对于远程主机发来的消息就应该加密发送给客户端 虽然可能插件不一定存在加密过程 if p.Socks.plugin != nil { - data, _ = p.Socks.plugin.Ornament(data, SEND) + //data, _ = p.Socks.plugin.Ornament(data, SEND) + data, _ = p.Encode(data) } return data, len(data) @@ -233,10 +241,14 @@ func (p *Packet) ListenToFixedTarget(serverKey string) error { uaddr, _ = addr.(*net.UDPAddr) if uaddr.String() == p.Client.String() { // 是远程代理服务器发来的消息 此时远程代理服务器在客户端看来它就是一个客户端 - // 远程代理服务器发来的消息需要解密 + // node 3 远程代理服务器发来的消息需要解密 if p.Socks.plugin != nil { // 这里的RECEIVE都是本软件的客户端和服务器端的相对关系,与其他软件不相关 - _, nr = p.Socks.plugin.Ornament(buf[0:nr], RECEIVE) + //_, nr = p.Socks.plugin.Ornament(buf[0:nr], RECEIVE) + buf, nr = p.Decode(buf[0:nr], addr) + if nr == 0 { + return nil + } } if src, ok := p.Servers[serverKey]; ok { message.dst = src @@ -260,9 +272,11 @@ func (p *Packet) ListenToFixedTarget(serverKey string) error { message.dst = p.Client Deb.Printf("Processing UDP messages from client host %s", src) + // node 4 客户端来的消息应该要加密 if p.Socks.plugin != nil { // 这里的RECEIVE都是本软件的客户端和服务器端的相对关系,与其他软件不相关 - _, nr = p.Socks.plugin.Ornament(buf[0:nr], SEND) + //_, nr = p.Socks.plugin.Ornament(buf[0:nr], SEND) + buf, nr = p.Encode(buf[0:nr]) } message.Data = buf[0:nr] @@ -281,6 +295,76 @@ func (p *Packet) ListenToFixedTarget(serverKey string) error { return err } +// @describe 根据p配置内容决定要不要加密, 如果不加密就原样输出 +// @param []byte 原文 +// @return res []byte 密文 +// @return n int 长度 +func (p *Packet) Encode(src []byte) (res []byte, n int) { + res, n = src, len(src) + if p.Socks.plugin == nil { + if p.Socks.protocol != nil { + res, n = p.Socks.protocol.WriteDo(res) + } + return + } + // 当plugin存在 + + if p.Socks.protocol == nil { + panic("packet encode: Subprotocols must be configured in the presence of plug-ins") + } + // 这时候是正常情况 + res, n = p.Socks.plugin.AntiSniffing(res, SEND) + res, n = p.Socks.protocol.WriteDo(res[0:n]) + return +} + +// node 解密 解密就可能存在多余数据或者少数据的情况,这时候就需要用p.buf将其存起来 当没有plugin时,就不会用到p.buf +// @describe 根据p配置内容决定要不要解密, 如果不解密就原样输出 +// @param []byte 密文 +// @param net.Addr 密文来源 +// @return res []byte 原文 +// @return n int 长度 +func (p *Packet) Decode(src []byte, addr net.Addr) (res []byte, n int) { + res, n = src, len(src) + + if p.Socks.plugin == nil { + reader := bytes.NewReader(res) + if p.Socks.protocol != nil { + // 在无plugin下子协议并无软用 + _, _ = p.Socks.protocol.ReadDo(reader) + } + return + } + + if p.Socks.protocol == nil { + // 在有plugin下,必须配置子协议 + panic("packet decode: Subprotocols must be configured in the presence of plug-ins") + } + + if v, ok := p.buf[addr.String()]; ok { + res = append(v, res...) + fmt.Println(res) + + } + reader := bytes.NewReader(res) + + do, n := p.Socks.protocol.ReadDo(reader) + fmt.Println(do, n) + dolen := len(do) + + if dolen+n > len(res) { + // res 如果超过长度了应该不返回等下次返回 + p.buf[addr.String()] = res + return nil, 0 + } + + // 如果没超过长度就正常返回 + p.buf[addr.String()] = res[dolen+n:] + + + return res[dolen:dolen+n], n +} + func (p *Packet) ReadFrom(b []byte) (n int, addr net.Addr, err error) { n, addr, err = p.Packet.ReadFrom(b) @@ -288,37 +372,12 @@ func (p *Packet) ReadFrom(b []byte) (n int, addr net.Addr, err error) { return } - // endtodo 不加入处理混淆 udp设计时不加入混淆,但是加入加密 - // todo 处理加密 - plugin := p.Socks.plugin - - if plugin != nil { - uaddr, _ := addr.(*net.UDPAddr) - fmt.Println("ip: -------- ", uaddr) - if uaddr.IP.String() == p.Client.IP.String() { - // 如果是客户端发来的消息就做处理 - //_, n = plugin.Camouflage(b[0:n], RECEIVE) - _, n = plugin.AntiSniffing(b[0:n], RECEIVE) - } - } - _ = p.SetDeadline(p.GetDeadline()) return } func (p *Packet) WriteTo(b []byte, addr net.Addr) (n int, err error) { - // todo 处理加密 - plugin := p.Socks.plugin - if plugin != nil { - uaddr, _ := addr.(*net.UDPAddr) - - if uaddr.IP.String() == p.Client.IP.String() { - // 如果是发送给客户端的就进行加密等动作 - b, n = plugin.AntiSniffing(b, SEND) - } - } - n, err = p.Packet.WriteTo(b, addr) _ = p.SetDeadline(p.GetDeadline()) return diff --git a/client/debug/config/config.yml b/client/debug/config/config.yml index 0513a61..37c68b8 100644 --- a/client/debug/config/config.yml +++ b/client/debug/config/config.yml @@ -1,11 +1,11 @@ # Current server public network IP Or IP for local testing and Port -server: 198.46.183.156 -# 47.100.167.83 -server_port: 9696 +server: 47.100.167.83 +# 198.46.183.156 +server_port: 1081 # Discontinuation time after no request timeout: 60 -local_address: 127.0.0.1 +local_address: 192.168.1.99 local_port: 1082 From f6c44c26bc6ccb962667181321debb87aeea58bd Mon Sep 17 00:00:00 2001 From: Solomon Guo Date: Wed, 14 Aug 2019 23:42:06 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fixed=20udp,=20=E8=BF=98=E6=9C=AA=E6=95=B4?= =?UTF-8?q?=E7=90=86=E4=B8=80=E4=BA=9Blog=E5=92=8Cprint=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bard/pcqi.go | 2 +- bard/request.go | 2 +- bard/udpconn.go | 22 ++++++++++++---------- client/debug/config/config.yml | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/bard/pcqi.go b/bard/pcqi.go index 023c2c5..33c9132 100644 --- a/bard/pcqi.go +++ b/bard/pcqi.go @@ -146,7 +146,7 @@ func (p *PCQInfo) HandleConn(conn *Conn, config *Config) (e error) { udpPacket, e := net.ListenUDP("udp", udpaddr) //fmt.Println("p.dst.port", p.Dst.PortToInt()) - //fmt.Println(udpPacket.LocalAddr()) + fmt.Println(udpPacket.LocalAddr()) if e != nil { Logff(ExceptionUDPChannelOpen.Error()+"%v", LOG_WARNING, e) diff --git a/bard/request.go b/bard/request.go index 4c47c83..64a74b5 100644 --- a/bard/request.go +++ b/bard/request.go @@ -59,7 +59,7 @@ func (c *Client)Pipe() { func (c *Client)PipeUdp() { // do something with udp channel //remoteUdpAddr, err := net.ResolveUDPAddr("udp", c.PCRsp.SAddr.AddrString()) - localUdpAddr, err := net.ResolveUDPAddr("udp", c.config.GetLocalString()+":"+ + localUdpAddr, err := net.ResolveUDPAddr("udp", ":"+ strconv.Itoa(c.PCQI.Dst.PortToInt()+2)) if err != nil { Deb.Println("UDP parse error,", err) diff --git a/bard/udpconn.go b/bard/udpconn.go index edd801d..502263a 100644 --- a/bard/udpconn.go +++ b/bard/udpconn.go @@ -325,10 +325,11 @@ func (p *Packet) Encode(src []byte) (res []byte, n int) { // @return res []byte 原文 // @return n int 长度 func (p *Packet) Decode(src []byte, addr net.Addr) (res []byte, n int) { - res, n = src, len(src) + var temp []byte + temp, n = src, len(src) if p.Socks.plugin == nil { - reader := bytes.NewReader(res) + reader := bytes.NewReader(temp) if p.Socks.protocol != nil { // 在无plugin下子协议并无软用 _, _ = p.Socks.protocol.ReadDo(reader) @@ -342,27 +343,28 @@ func (p *Packet) Decode(src []byte, addr net.Addr) (res []byte, n int) { } if v, ok := p.buf[addr.String()]; ok { - res = append(v, res...) - fmt.Println(res) + temp = append(v, temp...) + //fmt.Println("lalalalallalallaal") } - reader := bytes.NewReader(res) + reader := bytes.NewReader(temp) do, n := p.Socks.protocol.ReadDo(reader) fmt.Println(do, n) dolen := len(do) - if dolen+n > len(res) { - // res 如果超过长度了应该不返回等下次返回 - p.buf[addr.String()] = res + if dolen+n > len(temp) { + // temp 如果超过长度了应该不返回等下次返回 + p.buf[addr.String()] = temp return nil, 0 } // 如果没超过长度就正常返回 - p.buf[addr.String()] = res[dolen+n:] + p.buf[addr.String()] = temp[dolen+n:] + res, n = p.Socks.plugin.AntiSniffing(temp[dolen:dolen+n], RECEIVE) - return res[dolen:dolen+n], n + return res, n } func (p *Packet) ReadFrom(b []byte) (n int, addr net.Addr, err error) { diff --git a/client/debug/config/config.yml b/client/debug/config/config.yml index 37c68b8..0316b2c 100644 --- a/client/debug/config/config.yml +++ b/client/debug/config/config.yml @@ -5,7 +5,7 @@ server_port: 1081 # Discontinuation time after no request timeout: 60 -local_address: 192.168.1.99 +local_address: 127.0.0.1 local_port: 1082 From 4f7d45a0c2e114c446888e99dd5309dd03e5548f Mon Sep 17 00:00:00 2001 From: GuoYuefei Date: Thu, 15 Aug 2019 10:46:09 +0800 Subject: [PATCH 3/3] =?UTF-8?q?udp=E5=8F=AF=E7=94=A8=EF=BC=8C=20log?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=94=B9=E5=8F=98=EF=BC=8C=E5=B0=91=E8=AE=B8?= =?UTF-8?q?=E6=94=B9=E5=8F=98=E4=BB=A3=E7=A0=81=E4=B8=AD=E7=9A=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bard/pcqi.go | 5 ++--- bard/protocol.go | 4 ++-- bard/request.go | 21 +++++++++++---------- bard/udpconn.go | 16 +++++++--------- client/client.go | 4 ++-- server/server.go | 5 +++-- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/bard/pcqi.go b/bard/pcqi.go index 33c9132..c37da04 100644 --- a/bard/pcqi.go +++ b/bard/pcqi.go @@ -2,7 +2,6 @@ package bard import ( "errors" - "fmt" "net" "strconv" "sync" @@ -49,7 +48,7 @@ func (p *PCQInfo) Response(conn *Conn, server string) error { // 主要响应socks5最后的请求 cmd 为udp // 服务器端server 一般只有一个ip todo 先别管多IP吧 而且还只支持ipv4 var ip = net.ParseIP(server) - fmt.Println("ip is .............", ip.To4()) + //fmt.Println("ip is .............", ip.To4()) // 遵照回应udp的写法 resp = append([]byte{0x05, 0x00, 0x00, 0x01}, ip.To4()...) resp = append(resp, p.Dst.Port[0], p.Dst.Port[1]+2) @@ -146,7 +145,7 @@ func (p *PCQInfo) HandleConn(conn *Conn, config *Config) (e error) { udpPacket, e := net.ListenUDP("udp", udpaddr) //fmt.Println("p.dst.port", p.Dst.PortToInt()) - fmt.Println(udpPacket.LocalAddr()) + //fmt.Println(udpPacket.LocalAddr()) if e != nil { Logff(ExceptionUDPChannelOpen.Error()+"%v", LOG_WARNING, e) diff --git a/bard/protocol.go b/bard/protocol.go index e276958..596ec0a 100644 --- a/bard/protocol.go +++ b/bard/protocol.go @@ -86,7 +86,7 @@ func ServerHandShake(r *bufio.Reader, conn net.Conn, config *Config) (error, *Co Logf("Connection request from client IP %v, permission authentication failed", conn.RemoteAddr()) } - // endtodo 丢弃缓冲区中所有内容,准备下轮对话 + // 丢弃缓冲区中所有内容,准备下轮对话 r.Reset(conn) _, err = conn.Write(resp) if err != nil { @@ -127,7 +127,7 @@ func CommConfigRegisterToConn(conn *Conn, config *CommConfig, plugins *Plugins, } } - // node 只有配置了传输控制子协议才能注册 + // 只有配置了传输控制子协议才能注册 if protocol != nil { if len(ps.Pmap) != 0 { conn.Register(ps.ToBigIPlugin(), protocol) diff --git a/bard/request.go b/bard/request.go index 64a74b5..00126ae 100644 --- a/bard/request.go +++ b/bard/request.go @@ -21,9 +21,9 @@ type Client struct { LocalConn *Conn //CSMessage chan *Message - PCQI *PCQInfo // node 这是LocalConn得到的请求 这个内容其实只要原封不动传给远程代理就行 + PCQI *PCQInfo // 这是LocalConn得到的请求 这个内容其实只要原封不动传给远程代理就行 // todo 以下addr需要改成PCRspInfo类型 - PCRsp *PCRspInfo // node 这是RemoteConn远程服务器发回的响应 服务器返回响应,仅udp代理时有用,先不考虑udp + PCRsp *PCRspInfo // 这是RemoteConn远程服务器发回的响应 服务器返回响应,仅udp代理时有用 //SCMessage chan *Message RemoteConn *Conn @@ -62,20 +62,20 @@ func (c *Client)PipeUdp() { localUdpAddr, err := net.ResolveUDPAddr("udp", ":"+ strconv.Itoa(c.PCQI.Dst.PortToInt()+2)) if err != nil { - Deb.Println("UDP parse error,", err) + Logln("UDP addr parse error,", err) return } // node 这个udpPacket是客户端处理一个udp连接时的唯一通道,包括与客户端的客户端通讯和客户端的服务器端 localPacket, err := net.ListenUDP("udp", localUdpAddr) if err != nil { - Deb.Println(err) + Logln(err) RefuseRequest(c.LocalConn) return } err = c.PCQI.Response(c.LocalConn, c.config.GetLocalString()) if err != nil { - Deb.Println(err) + Logln(err) //RefuseRequest(c.LocalConn) // 没回复成功成功,不知要不要回复失败,因为可能回复失败也失败 return } @@ -129,7 +129,7 @@ func (c *Client)PipeUdp() { } _, err = packet.Request() if err != nil { - Slog.Println("packet.request close:", err) + Logln("packet.request close:", err) break } } @@ -143,7 +143,7 @@ func (c *Client)PipeTcp() { wg.Add(2) e := c.PCQI.Response(c.LocalConn, c.config.GetLocalString()) if e != nil { - Deb.Println(e) + Logln(e) c.Close() wg.Done(); wg.Done() // 发生错误还需要解锁的 return @@ -190,7 +190,6 @@ func (c *Client)PipeTcp() { /** 定义Client的能力 1、可以根据配置文件连接远程代理服务器,做到第一次握手 - 2、初始化两个Message的通道 -------------以上应该在初始化时完成---------------- 3、两个conn各自对自己的通道操作。 每个函数2协程 4、外层调用,开两个协程。 over 一共一次连接7协程 @@ -199,6 +198,8 @@ func (c *Client)PipeTcp() { @param localConn 一定要是已经建立起本地socks5连接的conn @param pcqi 是localConn接收到的请求信息 @param config 配置文件信息 + @param plugins 插件信息集 + @param protocols 子协议集 */ func NewClient(localConn *Conn, pcqi *PCQInfo, config *Config, plugins *Plugins, protocols *TCSubProtocols) (c *Client, err error){ c = &Client{} @@ -257,7 +258,7 @@ func ClientHandleShakeWithRemote(r *bufio.Reader, conn *Conn, pcqi *PCQInfo, con if b != SocksVersion { e = ErrorSocksVersion - Deb.Println("version byte is", b) + //Deb.Println("version byte is", b) return } method, e := r.ReadByte() @@ -278,7 +279,7 @@ func ClientHandleShakeWithRemote(r *bufio.Reader, conn *Conn, pcqi *PCQInfo, con } r.Reset(conn) // 清空缓存 - // node 在发送请求前需要重新注册通讯配置信息 + // 在发送请求前需要重新注册通讯配置信息 ok := CommConfigRegisterToConn(conn, config.Users[0].ComConfig, plugins, protocols) if !ok { e = errors.New("User Communication Configuration Not Found! ") diff --git a/bard/udpconn.go b/bard/udpconn.go index 502263a..80cfcd7 100644 --- a/bard/udpconn.go +++ b/bard/udpconn.go @@ -135,7 +135,7 @@ func (p *Packet) Listen() error { if p.Client.String() != uaddr.String() { p.Client = uaddr //改变p.client的port } - // node 1 消息来自客户端就需要进行解密 解密就可能存在多余数据或者少数据的情况,这时候就需要用p.buf将其存起来 + // endtodo 1 消息来自客户端就需要进行解密 解密就可能存在多余数据或者少数据的情况,这时候就需要用p.buf将其存起来 if p.Socks.plugin != nil { //_, nr = p.Socks.plugin.Ornament(buf[0:nr], RECEIVE) buf, nr = p.Decode(buf[0:nr], addr) @@ -150,7 +150,7 @@ func (p *Packet) Listen() error { Deb.Println(err) return err } - fmt.Println(udpreqs) + //fmt.Println(udpreqs) // 如果原本远程servers列表存在该远程主机,就直接提取 if dst, ok := p.Servers[udpreqs.String()]; ok { message.dst = dst @@ -196,7 +196,7 @@ func (p *Packet) Listen() error { head = append(head, uint8(src.Port>>8), uint8(src.Port)) data = append(head, data...) - // node 2 数据要加密 对于远程主机发来的消息就应该加密发送给客户端 虽然可能插件不一定存在加密过程 + // endtodo 2 数据要加密 对于远程主机发来的消息就应该加密发送给客户端 虽然可能插件不一定存在加密过程 if p.Socks.plugin != nil { //data, _ = p.Socks.plugin.Ornament(data, SEND) data, _ = p.Encode(data) @@ -241,7 +241,7 @@ func (p *Packet) ListenToFixedTarget(serverKey string) error { uaddr, _ = addr.(*net.UDPAddr) if uaddr.String() == p.Client.String() { // 是远程代理服务器发来的消息 此时远程代理服务器在客户端看来它就是一个客户端 - // node 3 远程代理服务器发来的消息需要解密 + // endtodo 3 远程代理服务器发来的消息需要解密 if p.Socks.plugin != nil { // 这里的RECEIVE都是本软件的客户端和服务器端的相对关系,与其他软件不相关 //_, nr = p.Socks.plugin.Ornament(buf[0:nr], RECEIVE) @@ -272,7 +272,7 @@ func (p *Packet) ListenToFixedTarget(serverKey string) error { message.dst = p.Client Deb.Printf("Processing UDP messages from client host %s", src) - // node 4 客户端来的消息应该要加密 + // endtodo 4 客户端来的消息应该要加密 if p.Socks.plugin != nil { // 这里的RECEIVE都是本软件的客户端和服务器端的相对关系,与其他软件不相关 //_, nr = p.Socks.plugin.Ornament(buf[0:nr], SEND) @@ -318,7 +318,7 @@ func (p *Packet) Encode(src []byte) (res []byte, n int) { return } -// node 解密 解密就可能存在多余数据或者少数据的情况,这时候就需要用p.buf将其存起来 当没有plugin时,就不会用到p.buf +// endtodo 解密 解密就可能存在多余数据或者少数据的情况,这时候就需要用p.buf将其存起来 当没有plugin时,就不会用到p.buf // @describe 根据p配置内容决定要不要解密, 如果不解密就原样输出 // @param []byte 密文 // @param net.Addr 密文来源 @@ -344,13 +344,11 @@ func (p *Packet) Decode(src []byte, addr net.Addr) (res []byte, n int) { if v, ok := p.buf[addr.String()]; ok { temp = append(v, temp...) - //fmt.Println("lalalalallalallaal") - } reader := bytes.NewReader(temp) do, n := p.Socks.protocol.ReadDo(reader) - fmt.Println(do, n) + //fmt.Println(do, n) dolen := len(do) if dolen+n > len(temp) { diff --git a/client/client.go b/client/client.go index ddeb6a7..db77856 100644 --- a/client/client.go +++ b/client/client.go @@ -75,9 +75,9 @@ func localServerHandleConn(localConn *bard.Conn, config *bard.Config, plugins *b client, err := bard.NewClient(localConn, pcq, config, plugins, protocols) if err != nil || client.PCRsp.Rep != 0x00 { if err != nil { - bard.Deb.Println(err) + bard.Logln(err) } else { - bard.Deb.Println("refused by remote server") + bard.Logln("refused by remote server") } bard.RefuseRequest(localConn) return diff --git a/server/server.go b/server/server.go index 6b9a400..2f94c43 100644 --- a/server/server.go +++ b/server/server.go @@ -69,7 +69,7 @@ func remoteServerHandleConn(conn *bard.Conn, config *bard.Config, plugins *bard. return } - // node 客户端在收到认证成功消息后就应该使用其通讯插件进行通讯 只有配置了相同的插件接下来的通讯才会有"共同语言",才会成功进行 + // 客户端在收到认证成功消息后就应该使用其通讯插件进行通讯 只有配置了相同的插件接下来的通讯才会有"共同语言",才会成功进行 pcq, err := bard.ReadPCQInfo(r) if err != nil { @@ -113,7 +113,8 @@ func doPlugin() *bard.Plugins { ps, err := bard.PluginsFromDir(PluginDir) if err != nil { // 上面函数已有错误处理 - return nil + ps = &bard.Plugins{} + ps.Init() } //plugin := ps.ToBigIPlugin() return ps