From a9a746ba2f39290fbfc24429f8c32995bf73865a Mon Sep 17 00:00:00 2001 From: e1732a364fed <75717694+e1732a364fed@users.noreply.github.com> Date: Sat, 1 Jan 2000 00:00:00 +0000 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E9=A1=B9=E5=AF=B9=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9,=E4=B8=BAss=E5=81=9A=E5=87=86?= =?UTF-8?q?=E5=A4=87=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 取消Client的LocalAddr,改为 LocalTCPAddr 和 LocalUDPAddr 删除direct中的对应条目。这样可更清晰地配置双本地地址 将设置sendthrough设置双地址的代码移动到 proxy.newClient函数 这样不仅direct可指定不同的tcp和udp的本地地址,任何client协议都可以了 为ClientCreator 接口 添加 UseUDPAsMsgConn 方法,direct和ss返回true 在ss的client的EstablishUDPChannel进行自行拨号 在ss的server建立后,自动循环监听udp,绕过vs的基本监听机制。因为vs架构的限制,一个代理只能有一个唯一的传输层协议。 ServerCreator 接口 添加 AfterCommonConfServer 方法 --- main.go | 38 +++++++++++++++---------- netLayer/const.go | 4 +-- proxy/base.go | 44 +++++++++++++++++++++++++---- proxy/creator.go | 50 +++++++++++++++++++++++---------- proxy/direct.go | 45 ++++++++--------------------- proxy/dokodemo/server.go | 6 +--- proxy/http/server.go | 6 +--- proxy/proxy.go | 6 +++- proxy/reject.go | 9 ++++-- proxy/shadowsocks/client.go | 56 +++++++++++++++++++++++-------------- proxy/shadowsocks/server.go | 44 +++++++++++++++++++++++++---- proxy/simplesocks/client.go | 7 +++-- proxy/simplesocks/server.go | 6 +--- proxy/socks5/client.go | 9 +++++- proxy/socks5/server.go | 2 +- proxy/socks5http/server.go | 2 +- proxy/trojan/client.go | 8 ++++-- proxy/trojan/server.go | 5 +--- proxy/vless/client.go | 8 ++++-- proxy/vless/server.go | 6 +--- proxy/vmess/client.go | 9 ++++-- proxy/vmess/server.go | 5 +--- tcp_test.go | 6 ++-- 23 files changed, 240 insertions(+), 141 deletions(-) diff --git a/main.go b/main.go index 3fae21f..380f900 100644 --- a/main.go +++ b/main.go @@ -33,7 +33,7 @@ import ( _ "github.com/e1732a364fed/v2ray_simple/proxy/vmess" ) -//statistics +// statistics var ( ActiveConnectionCount int32 AllDownloadBytesSinceStart uint64 @@ -46,7 +46,7 @@ var ( DirectClient, _ = proxy.ClientFromURL(proxy.DirectURL) ) -//用于回落到h2c +// 用于回落到h2c var ( fallback_h2c_transport = &http2.Transport{ DialTLS: func(n, a string, cfg *tls.Config) (net.Conn, error) { @@ -59,7 +59,8 @@ var ( fb_h2c_PROXYprotocolAddrMap_mutex sync.RWMutex ) -/*ListenSer 函数 是本包 最重要的函数。可以 直接使用 本函数 来手动开启新的 自定义的 转发流程。 +/* +ListenSer 函数 是本包 最重要的函数。可以 直接使用 本函数 来手动开启新的 自定义的 转发流程。 监听 inServer, 然后试图转发到一个 proxy.Client。如果env没给出,则会转发到 defaultOutClient。 若 env 不为 nil, 则会 进行分流或回落。具有env的情况下,可能会转发到 非 defaultOutClient 的其他 proxy.Client. @@ -382,7 +383,7 @@ func handleNewIncomeConnection(inServer proxy.Server, defaultClientForThis proxy handshakeInserver_and_passToOutClient(iics) } -//被 handshakeInserver_and_passToOutClient 调用 +// 被 handshakeInserver_and_passToOutClient 调用 func handshakeInserver(iics *incomingInserverConnState) (wlc net.Conn, udp_wlc netLayer.MsgConn, targetAddr netLayer.Addr, err error) { inServer := iics.inServer if inServer == nil { @@ -522,7 +523,7 @@ func handshakeInserver(iics *incomingInserverConnState) (wlc net.Conn, udp_wlc n // // iics 不使用指针, 因为iics不能公用,因为 在多路复用时 iics.wrappedConn 是会变化的。 // -//被 handleNewIncomeConnection 和 ListenSer 调用。 +// 被 handleNewIncomeConnection 和 ListenSer 调用。 func handshakeInserver_and_passToOutClient(iics incomingInserverConnState) { wlc, udp_wlc, targetAddr, err := handshakeInserver(&iics) @@ -558,7 +559,7 @@ func handshakeInserver_and_passToOutClient(iics incomingInserverConnState) { } -//被 handshakeInserver_and_passToOutClient 和 handshakeInserver 的innerMux部分 以及 tproxy 调用。 iics.inServer可能为nil。 +// 被 handshakeInserver_and_passToOutClient 和 handshakeInserver 的innerMux部分 以及 tproxy 调用。 iics.inServer可能为nil。 // 本函数 可能是 本文件中 最长的 函数。分别处理 回落,firstpayload,sniff,dns解析,分流,以及lazy,最终转发到 某个 outClient。 // // 最终会调用 dialClient_andRelay. 若isfallback为true,传入的 wlc 和 udp_wlc 必须为nil,targetAddr必须为空值。 @@ -982,7 +983,7 @@ func passToOutClient(iics incomingInserverConnState, isfallback bool, wlc net.Co dialClient_andRelay(iics, targetAddr, client, isTlsLazy_clientEnd, wlc, udp_wlc) } -//dialClient 对实际client进行拨号,处理传输层, tls层, 高级层等所有层级后,进行代理层握手。 +// dialClient 对实际client进行拨号,处理传输层, tls层, 高级层等所有层级后,进行代理层握手。 // result = 0 表示拨号成功, result = -1 表示 拨号失败, result = 1 表示 拨号成功 并 已经自行处理了转发阶段(用于lazy和 innerMux ); -10 标识 因为 client为reject 而关闭了连接。 // 在 dialClient_andRelay 中被调用。在udp为multi channel时也有用到. func dialClient(iics incomingInserverConnState, targetAddr netLayer.Addr, @@ -1104,13 +1105,12 @@ func dialClient(iics incomingInserverConnState, targetAddr netLayer.Addr, var dialedCommonConn any - not_direct := !(client.Name() == proxy.DirectName) + not_udpSpecial := !(realTargetAddr.Network == "udp" && client.GetCreator().UseUDPAsMsgConn()) /* - direct 的udp 是自己拨号的,因为要考虑到fullcone。 - direct 的tcp也是自己拨号,因为还考虑到 sockopt + shadowsocks的udp是自己拨号的,因为它用到了udp的包特性 - 不是direct的udp的话,也要分情况: + 不是shadowsocks的udp的话,也要分情况: 如果是单路的, 则我们在此dial, 如果是多路复用, 则不行, 因为要复用同一个连接 Instead, 我们要试图 取出已经拨号好了的 连接 */ @@ -1120,7 +1120,7 @@ func dialClient(iics incomingInserverConnState, targetAddr netLayer.Addr, var muxC advLayer.MuxClient - if not_direct { + if not_udpSpecial { if adv != "" && advClient.IsMux() { @@ -1150,7 +1150,14 @@ func dialClient(iics incomingInserverConnState, targetAddr netLayer.Addr, } } - clientConn, err = realTargetAddr.Dial(client.GetSockopt(), client.LocalAddr()) + var na net.Addr + if realTargetAddr.Network == "tcp" { + na = client.LocalTCPAddr() + } else if realTargetAddr.Network == "udp" { + na = client.LocalUDPAddr() + } + + clientConn, err = realTargetAddr.Dial(client.GetSockopt(), na) if err != nil { if err == netLayer.ErrMachineCantConnectToIpv6 { @@ -1175,6 +1182,8 @@ func dialClient(iics incomingInserverConnState, targetAddr netLayer.Addr, return } + } else { + goto shakeStep } if xver := iics.fallbackXver; xver > 0 && xver < 3 { @@ -1340,6 +1349,7 @@ advLayerHandshakeStep: } } +shakeStep: ////////////////////////////// 代理层 握手阶段 ///////////////////////////////////// if !isudp || hasInnerMux { @@ -1405,7 +1415,7 @@ advLayerHandshakeStep: return } //dialClient -//在 dialClient 中调用。 如果调用不成功,则result < 0. 若成功, 则 result == 0. +// 在 dialClient 中调用。 如果调用不成功,则result < 0. 若成功, 则 result == 0. func dialInnerProxy(client proxy.Client, wlc net.Conn, wrc io.ReadWriteCloser, iics incomingInserverConnState, innerProxyName string, targetAddr netLayer.Addr, isudp bool) (realwrc io.ReadWriteCloser, realudp_wrc netLayer.MsgConn, result int) { smuxSession := client.GetClientInnerMuxSession(wrc) diff --git a/netLayer/const.go b/netLayer/const.go index b6ac026..d8302ea 100644 --- a/netLayer/const.go +++ b/netLayer/const.go @@ -14,14 +14,14 @@ const ( ) -//若字符串无法被解析为网络类型,则返回 UnknownNetwork +// 若字符串无法被解析为网络类型,则返回 UnknownNetwork func StrToTransportProtocol(s string) uint16 { switch s { case "tcp", "tcp4", "tcp6", "TCP", "TCP4", "TCP6": return TCP case "udp", "udp4", "udp6", "UDP", "UDP4", "UDP6": return UDP - case "dual", "mix", "mixed", "Mix", "MIX": + case DualNetworkName, "mix", "mixed", "Mix", "MIX": return Dual case "unix", "Unix", "UNIX": return UNIX diff --git a/proxy/base.go b/proxy/base.go index f8cf602..38746f6 100644 --- a/proxy/base.go +++ b/proxy/base.go @@ -88,7 +88,6 @@ type Base struct { DialConf *DialConf Addr string - LA net.Addr //for client's LocalAddr TLS bool Tag string //可用于路由, 见 netLayer.route.go TransportLayer string @@ -115,18 +114,25 @@ type Base struct { Innermux *smux.Session //用于存储 client的已拨号的mux连接 sync.Mutex + + //用于sendthrough + LTA *net.TCPAddr + LUA *net.UDPAddr } func (b *Base) GetBase() *Base { return b } -func (b *Base) Network() string { - return b.TransportLayer +func (b *Base) LocalTCPAddr() *net.TCPAddr { + return b.LTA +} +func (b *Base) LocalUDPAddr() *net.UDPAddr { + return (b.LUA) } -func (b *Base) LocalAddr() net.Addr { - return b.LA +func (b *Base) Network() string { + return b.TransportLayer } func (b *Base) GetXver() int { @@ -445,3 +451,31 @@ func (b *Base) InitAdvLayer() { b.AdvS = advSer } } + +func (d *Base) DialTCP(target netLayer.Addr) (result net.Conn, err error) { + if d.Sockopt != nil { + if d.LTA == nil { + result, err = target.DialWithOpt(d.Sockopt, nil) //避免把nil的 *net.TCPAddr 装箱到 net.Addr里 + + } else { + result, err = target.DialWithOpt(d.Sockopt, d.LTA) + + } + } else { + if d.LTA == nil { + result, err = target.Dial(nil, nil) + + } else { + result, err = target.Dial(nil, d.LTA) + + } + } + return +} + +func (d *Base) DialUDP(target netLayer.Addr) (mc *netLayer.UDPMsgConn, err error) { + + mc, err = netLayer.NewUDPMsgConn(d.LUA, d.IsFullcone, false, d.Sockopt) + return + +} diff --git a/proxy/creator.go b/proxy/creator.go index bfce06b..5572f59 100644 --- a/proxy/creator.go +++ b/proxy/creator.go @@ -1,6 +1,7 @@ package proxy import ( + "net" "net/url" "strings" @@ -35,6 +36,13 @@ func PrintAllClientNames() { } } +type CreatorCommonStruct struct{} + +func (CreatorCommonStruct) MultiTransportLayer() bool { + return false +} +func (CreatorCommonStruct) AfterCommonConfServer(Server) {} + type CreatorCommon interface { //若为true,则表明该协议可同时使用tcp和udp来传输数据。direct, socks5 和 shadowsocks 都为true。 //此时,是否开启udp取决于Network(), 如果为dual, 则均支持; 如果仅为tcp或者udp,则不支持。 @@ -52,6 +60,9 @@ type ClientCreator interface { //iv: initial value, can be nil. URLToDialConf(url *url.URL, iv *DialConf, format int) (*DialConf, error) //DialConfToURL(url *DialConf, format int) (*url.URL, error) + + UseUDPAsMsgConn() bool //默认情况下,UDP会被包装成流式协议,除非指出需要利用udp的固定包长度特性; direct 和 shadowsocks会返回true. + } // 可通过标准配置或url 来初始化。 @@ -59,6 +70,7 @@ type ServerCreator interface { CreatorCommon NewServer(*ListenConf) (Server, error) + AfterCommonConfServer(Server) URLToListenConf(url *url.URL, iv *ListenConf, format int) (*ListenConf, error) //ListenConfToURL(url *ListenConf, format int) (*url.URL, error) @@ -111,26 +123,33 @@ func newClient(creator ClientCreator, dc *DialConf, knownTls bool) (Client, erro e = prepareTLS_forClient(c, dc) } if dc.SendThrough != "" { - - if c.Network() == netLayer.DualNetworkName { - //多个传输层的话,完全由proxy自行配置 localAddr。 - } else { - st, err := netLayer.StrToNetAddr(c.Network(), dc.SendThrough) - - if err != nil { - return nil, utils.ErrInErr{ErrDesc: "parse sendthrough addr failed", ErrDetail: err} - - } else { - c.GetBase().LA = st - - } - } - + setSendThroughByNetwork(c.GetBase(), dc.SendThrough) } return c, e } +func setSendThroughByNetwork(b *Base, throughStr string) error { + + st, err := netLayer.StrToNetAddr(netLayer.DualNetworkName, throughStr) + if err != nil { + return utils.ErrInErr{ErrDesc: "parse sendthrough addr failed", ErrDetail: err} + } + + switch b.Network() { + case netLayer.DualNetworkName: + + b.LTA = st.(*netLayer.TCPUDPAddr).TCPAddr + b.LUA = st.(*netLayer.TCPUDPAddr).UDPAddr + case "tcp": + b.LTA = st.(*net.TCPAddr) + case "udp": + b.LUA = st.(*net.UDPAddr) + } + + return nil +} + // SetAddrStr, ConfigCommon func configCommonForClient(cli BaseInterface, dc *DialConf) error { if cli.Name() != DirectName { @@ -183,6 +202,7 @@ func newServer(creator ServerCreator, lc *ListenConf, knownTls bool) (Server, er } } + creator.AfterCommonConfServer(ser) return ser, nil } diff --git a/proxy/direct.go b/proxy/direct.go index faebddf..7a03b8b 100644 --- a/proxy/direct.go +++ b/proxy/direct.go @@ -16,8 +16,13 @@ const ( ) // implements ClientCreator for direct -type DirectCreator struct{} +type DirectCreator struct{ CreatorCommonStruct } +func (DirectCreator) UseUDPAsMsgConn() bool { + return true +} + +// true func (DirectCreator) MultiTransportLayer() bool { return true } @@ -40,27 +45,17 @@ func (DirectCreator) NewClient(dc *DialConf) (Client, error) { dc.Network = netLayer.DualNetworkName } - if dc.SendThrough != "" { - st, err := netLayer.StrToNetAddr(netLayer.DualNetworkName, dc.SendThrough) - if err != nil { - return nil, err - } - d.localTCPAddr = st.(*netLayer.TCPUDPAddr).TCPAddr - d.localUDPAddr = st.(*netLayer.TCPUDPAddr).UDPAddr - - } - return d, nil } type DirectClient struct { Base - - localTCPAddr *net.TCPAddr - localUDPAddr *net.UDPAddr } func (*DirectClient) Name() string { return DirectName } +func (*DirectClient) GetCreator() ClientCreator { + return DirectCreator{} +} // 若 underlay 为nil,则会对target进行拨号, 否则返回underlay本身 func (d *DirectClient) Handshake(underlay net.Conn, firstPayload []byte, target netLayer.Addr) (result io.ReadWriteCloser, err error) { @@ -70,23 +65,7 @@ func (d *DirectClient) Handshake(underlay net.Conn, firstPayload []byte, target if underlay == nil { - if d.Sockopt != nil { - if d.localTCPAddr == nil { - result, err = target.DialWithOpt(d.Sockopt, nil) //避免把nil的 *net.TCPAddr 装箱到 net.Addr里 - - } else { - result, err = target.DialWithOpt(d.Sockopt, d.localTCPAddr) - - } - } else { - if d.localTCPAddr == nil { - result, err = target.Dial(nil, nil) - - } else { - result, err = target.Dial(nil, d.localTCPAddr) - - } - } + result, err = d.Base.DialTCP(target) } else { result = underlay @@ -114,10 +93,10 @@ func (d *DirectClient) EstablishUDPChannel(_ net.Conn, firstPayload []byte, targ if len(firstPayload) == 0 { - return netLayer.NewUDPMsgConn(d.localUDPAddr, d.IsFullcone, false, d.Sockopt) + return d.Base.DialUDP(target) } else { - mc, err := netLayer.NewUDPMsgConn(d.localUDPAddr, d.IsFullcone, false, d.Sockopt) + mc, err := d.Base.DialUDP(target) if err != nil { return nil, err } diff --git a/proxy/dokodemo/server.go b/proxy/dokodemo/server.go index 6e018df..3c18ed5 100644 --- a/proxy/dokodemo/server.go +++ b/proxy/dokodemo/server.go @@ -52,11 +52,7 @@ func init() { proxy.RegisterServer(name, &ServerCreator{}) } -type ServerCreator struct{} - -func (ServerCreator) MultiTransportLayer() bool { - return false -} +type ServerCreator struct{ proxy.CreatorCommonStruct } func (ServerCreator) URLToListenConf(url *url.URL, lc *proxy.ListenConf, format int) (*proxy.ListenConf, error) { if format != proxy.StandardMode { diff --git a/proxy/http/server.go b/proxy/http/server.go index 027acb0..2894389 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -45,11 +45,7 @@ func init() { proxy.RegisterServer(Name, &ServerCreator{}) } -type ServerCreator struct{} - -func (ServerCreator) MultiTransportLayer() bool { - return false -} +type ServerCreator struct{ proxy.CreatorCommonStruct } func (ServerCreator) URLToListenConf(u *url.URL, lc *proxy.ListenConf, format int) (*proxy.ListenConf, error) { if format != proxy.UrlStandardFormat { diff --git a/proxy/proxy.go b/proxy/proxy.go index 5e0cda9..2b240f4 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -60,7 +60,11 @@ type Client interface { InnerMuxEstablished() bool CloseInnerMuxSession() - LocalAddr() net.Addr //用于在拨号时选用一个特定的ip拨号。 + //用于在拨号时选用一个特定的ip拨号。 + LocalTCPAddr() *net.TCPAddr + LocalUDPAddr() *net.UDPAddr + + GetCreator() ClientCreator sync.Locker //用于锁定 innerMux } diff --git a/proxy/reject.go b/proxy/reject.go index 4ecff39..856d4fe 100644 --- a/proxy/reject.go +++ b/proxy/reject.go @@ -56,12 +56,11 @@ func tryRejectWithHttpRespAndClose(rejectType string, underlay net.Conn) { } // implements ClientCreator and ServerCreator for reject -type RejectCreator struct{} +type RejectCreator struct{ CreatorCommonStruct } -func (RejectCreator) MultiTransportLayer() bool { +func (RejectCreator) UseUDPAsMsgConn() bool { return false } - func (RejectCreator) NewClient(dc *DialConf) (Client, error) { r := &RejectClient{} @@ -132,6 +131,10 @@ type RejectClient struct { rejectCommon } +func (*RejectClient) GetCreator() ClientCreator { + return RejectCreator{} +} + // optionally response 403 and close the underlay, return io.EOF. func (c *RejectClient) Handshake(underlay net.Conn, _ []byte, _ netLayer.Addr) (result io.ReadWriteCloser, err error) { tryRejectWithHttpRespAndClose(c.theType, underlay) diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 89e7949..47cf0f0 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -15,10 +15,13 @@ func init() { proxy.RegisterClient(Name, ClientCreator{}) } -type ClientCreator struct{} +type ClientCreator struct{ proxy.CreatorCommonStruct } +func (ClientCreator) UseUDPAsMsgConn() bool { + return true +} func (ClientCreator) MultiTransportLayer() bool { - return false + return true } func (ClientCreator) URLToDialConf(u *url.URL, dc *proxy.DialConf, format int) (*proxy.DialConf, error) { if format != proxy.UrlStandardFormat { @@ -59,7 +62,9 @@ func newClient(mp MethodPass) *Client { cipher: initShadowCipher(mp), } } - +func (*Client) GetCreator() proxy.ClientCreator { + return ClientCreator{} +} func (*Client) Name() string { return Name } @@ -83,25 +88,34 @@ func (c *Client) Handshake(underlay net.Conn, firstPayload []byte, target netLay } func (c *Client) EstablishUDPChannel(underlay net.Conn, firstPayload []byte, target netLayer.Addr) (mc netLayer.MsgConn, err error) { + var ok bool + var pc net.PacketConn - pc, ok := underlay.(net.PacketConn) - if ok { - if c.cipher != nil { - pc = c.cipher.PacketConn(pc) - } - - mc = &shadowUDPPacketConn{ - PacketConn: pc, - raddr: underlay.RemoteAddr(), - taddr: target.ToUDPAddr(), - } - - if firstPayload != nil { - err = mc.WriteMsgTo(firstPayload, target) - } - - return + if underlay != nil { + pc, ok = underlay.(net.PacketConn) } - return nil, utils.ErrUnImplemented + if !ok { + pc, err = c.Base.DialUDP(target) + if err != nil { + return + } + } + + if c.cipher != nil { + pc = c.cipher.PacketConn(pc) + } + + mc = &shadowUDPPacketConn{ + PacketConn: pc, + raddr: underlay.RemoteAddr(), + taddr: target.ToUDPAddr(), + } + + if firstPayload != nil { + err = mc.WriteMsgTo(firstPayload, target) + } + + return + } diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index bdd770e..ede899e 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -16,10 +16,10 @@ func init() { proxy.RegisterServer(Name, &ServerCreator{}) } -type ServerCreator struct{} +type ServerCreator struct{ proxy.CreatorCommonStruct } func (ServerCreator) MultiTransportLayer() bool { - return false + return true } func (ServerCreator) NewServer(lc *proxy.ListenConf) (proxy.Server, error) { @@ -31,7 +31,7 @@ func (ServerCreator) NewServer(lc *proxy.ListenConf) (proxy.Server, error) { var mp MethodPass if mp.InitWithStr(uuidStr) { - return newServer(mp), nil + return newServer(mp, lc), nil } @@ -54,6 +54,38 @@ func (ServerCreator) URLToListenConf(u *url.URL, lc *proxy.ListenConf, format in } +// loop read udp +// func (ServerCreator) AfterCommonConfServer(s proxy.Server) { +// if s.Network() == "udp" || s.Network() == netLayer.DualNetworkName { +// ss := s.(*Server) +// uc, err := net.ListenUDP("udp", ss.LUA) +// if err != nil { +// log.Panicln("shadowsocks listen udp failed", err) +// } +// pc := ss.cipher.PacketConn(uc) +// for { +// buf := utils.GetPacket() +// defer utils.PutPacket(buf) +// n, saddr, err := pc.ReadFrom(buf) +// if err != nil { +// if ce := utils.CanLogErr("shadowsocks read udp failed"); ce != nil { +// ce.Write(zap.Error(err)) +// } +// return +// } +// r := bytes.NewBuffer(buf[:n]) +// taddr, err := GetAddrFrom(r) +// if err != nil { +// if ce := utils.CanLogErr("shadowsocks GetAddrFrom failed"); ce != nil { +// ce.Write(zap.Error(err)) +// } +// return +// } + +// } +// } +// } + type Server struct { proxy.Base @@ -62,10 +94,12 @@ type Server struct { cipher core.Cipher } -func newServer(info MethodPass) *Server { - return &Server{ +func newServer(info MethodPass, lc *proxy.ListenConf) *Server { + s := &Server{ cipher: initShadowCipher(info), } + + return s } func (*Server) Name() string { return Name diff --git a/proxy/simplesocks/client.go b/proxy/simplesocks/client.go index 9162eb5..2746f7c 100644 --- a/proxy/simplesocks/client.go +++ b/proxy/simplesocks/client.go @@ -16,9 +16,9 @@ func init() { proxy.RegisterClient(Name, ClientCreator{}) } -type ClientCreator struct{} +type ClientCreator struct{ proxy.CreatorCommonStruct } -func (ClientCreator) MultiTransportLayer() bool { +func (ClientCreator) UseUDPAsMsgConn() bool { return false } @@ -38,6 +38,9 @@ type Client struct { proxy.Base } +func (*Client) GetCreator() proxy.ClientCreator { + return ClientCreator{} +} func (c *Client) Name() string { return Name } diff --git a/proxy/simplesocks/server.go b/proxy/simplesocks/server.go index 9fcbb0e..4e23a27 100644 --- a/proxy/simplesocks/server.go +++ b/proxy/simplesocks/server.go @@ -15,11 +15,7 @@ func init() { proxy.RegisterServer(Name, &ServerCreator{}) } -type ServerCreator struct{} - -func (ServerCreator) MultiTransportLayer() bool { - return false -} +type ServerCreator struct{ proxy.CreatorCommonStruct } func (ServerCreator) NewServer(lc *proxy.ListenConf) (proxy.Server, error) { s := &Server{} diff --git a/proxy/socks5/client.go b/proxy/socks5/client.go index 1ded878..de7062f 100644 --- a/proxy/socks5/client.go +++ b/proxy/socks5/client.go @@ -15,7 +15,11 @@ func init() { proxy.RegisterClient(Name, &ClientCreator{}) } -type ClientCreator struct{} +type ClientCreator struct{ proxy.CreatorCommonStruct } + +func (ClientCreator) UseUDPAsMsgConn() bool { + return false +} // true func (ClientCreator) MultiTransportLayer() bool { @@ -50,6 +54,9 @@ type Client struct { utils.UserPass } +func (*Client) GetCreator() proxy.ClientCreator { + return ClientCreator{} +} func (*Client) Name() string { return Name } diff --git a/proxy/socks5/server.go b/proxy/socks5/server.go index 9a5e4b6..ddde1a1 100644 --- a/proxy/socks5/server.go +++ b/proxy/socks5/server.go @@ -39,7 +39,7 @@ func NewServer() *Server { return s } -type ServerCreator struct{} +type ServerCreator struct{ proxy.CreatorCommonStruct } // true func (ServerCreator) MultiTransportLayer() bool { diff --git a/proxy/socks5http/server.go b/proxy/socks5http/server.go index c95e583..5c6a6e3 100644 --- a/proxy/socks5http/server.go +++ b/proxy/socks5http/server.go @@ -40,7 +40,7 @@ func init() { proxy.RegisterServer(Name, &ServerCreator{}) } -type ServerCreator struct{} +type ServerCreator struct{ proxy.CreatorCommonStruct } // true func (ServerCreator) MultiTransportLayer() bool { diff --git a/proxy/trojan/client.go b/proxy/trojan/client.go index d1f8fac..96d5b6a 100644 --- a/proxy/trojan/client.go +++ b/proxy/trojan/client.go @@ -18,11 +18,12 @@ func init() { //作为对照,可以参考 https://github.com/p4gefau1t/trojan-go/blob/master/tunnel/trojan/client.go -type ClientCreator struct{} +type ClientCreator struct{ proxy.CreatorCommonStruct } -func (ClientCreator) MultiTransportLayer() bool { +func (ClientCreator) UseUDPAsMsgConn() bool { return false } + func (ClientCreator) URLToDialConf(url *url.URL, dc *proxy.DialConf, format int) (*proxy.DialConf, error) { switch format { case proxy.UrlStandardFormat: @@ -56,6 +57,9 @@ type Client struct { use_mux bool } +func (*Client) GetCreator() proxy.ClientCreator { + return ClientCreator{} +} func (*Client) Name() string { return Name } diff --git a/proxy/trojan/server.go b/proxy/trojan/server.go index 9c80f60..35b5427 100644 --- a/proxy/trojan/server.go +++ b/proxy/trojan/server.go @@ -15,11 +15,8 @@ func init() { proxy.RegisterServer(Name, &ServerCreator{}) } -type ServerCreator struct{} +type ServerCreator struct{ proxy.CreatorCommonStruct } -func (ServerCreator) MultiTransportLayer() bool { - return false -} func (ServerCreator) NewServer(lc *proxy.ListenConf) (proxy.Server, error) { uuidStr := lc.Uuid diff --git a/proxy/vless/client.go b/proxy/vless/client.go index 9e82eef..7820c6a 100644 --- a/proxy/vless/client.go +++ b/proxy/vless/client.go @@ -16,11 +16,12 @@ func init() { proxy.RegisterClient(Name, ClientCreator{}) } -type ClientCreator struct{} +type ClientCreator struct{ proxy.CreatorCommonStruct } -func (ClientCreator) MultiTransportLayer() bool { +func (ClientCreator) UseUDPAsMsgConn() bool { return false } + func (ClientCreator) NewClient(dc *proxy.DialConf) (proxy.Client, error) { uuidStr := dc.Uuid @@ -87,6 +88,9 @@ type Client struct { use_mux bool } +func (*Client) GetCreator() proxy.ClientCreator { + return ClientCreator{} +} func (c *Client) Name() string { if c.version == 0 { return Name diff --git a/proxy/vless/server.go b/proxy/vless/server.go index 2d1533a..a8fb5b5 100644 --- a/proxy/vless/server.go +++ b/proxy/vless/server.go @@ -18,11 +18,7 @@ func init() { proxy.RegisterServer(Name, &ServerCreator{}) } -type ServerCreator struct{} - -func (ServerCreator) MultiTransportLayer() bool { - return false -} +type ServerCreator struct{ proxy.CreatorCommonStruct } // 如果 lc.Version==0, 则只支持 v0. func (ServerCreator) NewServer(lc *proxy.ListenConf) (proxy.Server, error) { diff --git a/proxy/vmess/client.go b/proxy/vmess/client.go index 9520944..2da6dff 100644 --- a/proxy/vmess/client.go +++ b/proxy/vmess/client.go @@ -47,11 +47,12 @@ func GetEncryptAlgo(dc *proxy.DialConf) (result string) { return result } -type ClientCreator struct{} +type ClientCreator struct{ proxy.CreatorCommonStruct } -func (ClientCreator) MultiTransportLayer() bool { +func (ClientCreator) UseUDPAsMsgConn() bool { return false } + func (ClientCreator) URLToDialConf(url *url.URL, dc *proxy.DialConf, format int) (*proxy.DialConf, error) { if format != proxy.UrlStandardFormat { return dc, utils.ErrUnImplemented @@ -95,6 +96,10 @@ type Client struct { security byte } +func (*Client) GetCreator() proxy.ClientCreator { + return ClientCreator{} +} + func (c *Client) specifySecurityByStr(security string) error { security = strings.ToLower(security) switch security { diff --git a/proxy/vmess/server.go b/proxy/vmess/server.go index 91145b0..9cea0ab 100644 --- a/proxy/vmess/server.go +++ b/proxy/vmess/server.go @@ -67,11 +67,8 @@ func authUserByAuthPairList(bs []byte, authPairList []authPair, antiReplayMachin return } -type ServerCreator struct{} +type ServerCreator struct{ proxy.CreatorCommonStruct } -func (ServerCreator) MultiTransportLayer() bool { - return false -} func (ServerCreator) URLToListenConf(url *url.URL, lc *proxy.ListenConf, format int) (*proxy.ListenConf, error) { switch format { diff --git a/tcp_test.go b/tcp_test.go index 2d8afd7..ee74bcf 100644 --- a/tcp_test.go +++ b/tcp_test.go @@ -3,7 +3,7 @@ package v2ray_simple_test import ( "crypto/tls" "fmt" - "io/ioutil" + "io" "net/http" "net/url" "testing" @@ -26,7 +26,7 @@ func TestTCP_trojan_mux(t *testing.T) { testTCP(t, "trojan", 0, "tcp", true) } -//tcp测试我们直接使用http请求来测试 +// tcp测试我们直接使用http请求来测试 func testTCP(t *testing.T, protocol string, version int, network string, innermux bool) { utils.LogLevel = utils.Log_debug utils.InitLog("") @@ -157,7 +157,7 @@ func tryGetHttp(t *testing.T, client *http.Client, path string) { t.Log("Got response, start read") - bs, err := ioutil.ReadAll(resp.Body) + bs, err := io.ReadAll(resp.Body) if err != nil { t.Log("get http failed read", err) t.FailNow()