diff --git a/v2rayapi/freedom.go b/v2rayapi/freedom.go index c0bc266..ecfc4df 100644 --- a/v2rayapi/freedom.go +++ b/v2rayapi/freedom.go @@ -8,9 +8,32 @@ import ( "github.com/v2fly/v2ray-core/v5/common/protocol" "github.com/v2fly/v2ray-core/v5/common/serial" "github.com/v2fly/v2ray-core/v5/proxy/freedom" + "github.com/v2fly/v2ray-core/v5/transport/internet/tls" + "google.golang.org/protobuf/types/known/anypb" ) -func GetFreedomOutbound(sender *proxyman.SenderConfig, addr, outag string, port uint32) *pros.AddOutboundRequest { +func GetFreedomOutboundOfShadowsocks(network, path, addr, outag, security string, port uint32) *pros.AddOutboundRequest { + if path == "" { + path = "/" + } + streamConf, _ := GetTransportStreamConfig(network, path, "cloudflare.com") + sender := &proxyman.SenderConfig{ + StreamSettings: streamConf, + MultiplexSettings: &proxyman.MultiplexingConfig{ + Enabled: true, + Concurrency: 1, + }, + } + + if security == "tls" { + tlsconf := &tls.Config{ + AllowInsecure: true, + } + sender.StreamSettings.SecurityType = serial.GetMessageType(&tls.Config{}) + sender.StreamSettings.SecuritySettings = []*anypb.Any{ + serial.ToTypedMessage(tlsconf), + } + } return &pros.AddOutboundRequest{Outbound: &v5.OutboundHandlerConfig{ Tag: outag, SenderSettings: serial.ToTypedMessage(sender), diff --git a/v2rayapi/shadowsocks.go b/v2rayapi/shadowsocks.go index da99ad3..0f3131b 100644 --- a/v2rayapi/shadowsocks.go +++ b/v2rayapi/shadowsocks.go @@ -10,9 +10,15 @@ import ( "github.com/v2fly/v2ray-core/v5/common/protocol" "github.com/v2fly/v2ray-core/v5/common/serial" "github.com/v2fly/v2ray-core/v5/proxy/shadowsocks" + "github.com/v2fly/v2ray-core/v5/transport/internet" ) -func GetShadowsocksOutbound(sender *proxyman.SenderConfig, addr, password, cipher, outag string, port uint32) *pros.AddOutboundRequest { +func GetShadowsocksOutbound(addr, password, cipher, outag, proxytag string, port uint32) *pros.AddOutboundRequest { + sender := &proxyman.SenderConfig{ + ProxySettings: &internet.ProxyConfig{ + Tag: proxytag, + }, + } ssAccount := serial.ToTypedMessage(&shadowsocks.Account{ Password: password, CipherType: func() shadowsocks.CipherType { diff --git a/v2rayapi/streamconfig.go b/v2rayapi/streamconfig.go new file mode 100644 index 0000000..f4be9b3 --- /dev/null +++ b/v2rayapi/streamconfig.go @@ -0,0 +1,45 @@ +package v2rayapi + +import ( + "fmt" + + "github.com/golang/protobuf/proto" + "github.com/v2fly/v2ray-core/v5/common/serial" + "github.com/v2fly/v2ray-core/v5/transport/internet" + "github.com/v2fly/v2ray-core/v5/transport/internet/tcp" + "github.com/v2fly/v2ray-core/v5/transport/internet/websocket" +) + +func GetTransportStreamConfig(network, path, hdhost string) (conf *internet.StreamConfig, err error) { + transproto := network + var transptl internet.TransportProtocol + var protoconf proto.Message + switch transproto { + case "ws", "websocket": + transptl = internet.TransportProtocol_WebSocket + wsconf := websocket.Config{Path: path} + if hdhost != "" { + // wsconf.UseBrowserForwarding = true + wsconf.Header = []*websocket.Header{{Key: "Host", Value: hdhost}} + } + protoconf = &wsconf + case "tcp": + transptl = internet.TransportProtocol_TCP + protoconf = &tcp.Config{} + default: + err = fmt.Errorf("outbound network or transport not support %s. only support tcp, ws or websocket", transproto) + } + if err != nil { + return + } + conf = &internet.StreamConfig{ + Protocol: transptl, + TransportSettings: []*internet.TransportConfig{ + { + Protocol: transptl, + Settings: serial.ToTypedMessage(protoconf), + }, + }, + } + return +} diff --git a/v2rayapi/v2rayapi.go b/v2rayapi/v2rayapi.go index 04d4b66..689fbc6 100644 --- a/v2rayapi/v2rayapi.go +++ b/v2rayapi/v2rayapi.go @@ -6,7 +6,6 @@ import ( "strconv" "strings" - "github.com/golang/protobuf/proto" "github.com/v2fly/v2ray-core/v5/app/proxyman" pros "github.com/v2fly/v2ray-core/v5/app/proxyman/command" @@ -25,52 +24,10 @@ import ( // "google.golang.org/grpc/credentials/insecure" "github.com/v2fly/v2ray-core/v5/transport/internet" - "github.com/v2fly/v2ray-core/v5/transport/internet/tcp" "github.com/v2fly/v2ray-core/v5/transport/internet/tls" - "github.com/v2fly/v2ray-core/v5/transport/internet/websocket" - "google.golang.org/protobuf/types/known/anypb" ) -type V2rayNode struct { - Protocol, Add, Host, Id, Net, Path, Ps, Tls, Type string - V, Aid, Port json.Number -} - -func GetTransportStreamConfig(network, path, hdhost string) (conf *internet.StreamConfig, err error) { - transproto := network - var transptl internet.TransportProtocol - var protoconf proto.Message - switch transproto { - case "ws", "websocket": - transptl = internet.TransportProtocol_WebSocket - wsconf := websocket.Config{Path: path} - if hdhost != "" { - // wsconf.UseBrowserForwarding = true - wsconf.Header = []*websocket.Header{{Key: "Host", Value: hdhost}} - } - protoconf = &wsconf - case "tcp": - transptl = internet.TransportProtocol_TCP - protoconf = &tcp.Config{} - default: - err = fmt.Errorf("outbound network or transport not support %s. only support ws or websocket", transproto) - } - if err != nil { - return - } - conf = &internet.StreamConfig{ - Protocol: transptl, - TransportSettings: []*internet.TransportConfig{ - { - Protocol: transptl, - Settings: serial.ToTypedMessage(protoconf), - }, - }, - } - return -} - const PROTO_VMESS = "vmess" const PROTO_SHADOWSOCKS = "shadowsocks" const PROTO_TROJAN = "trojan" @@ -126,7 +83,7 @@ func GetOutboundRequest(port, aid json.Number, outproto, addr, sni, password, ne var proxyport int64 proxyport, err = port.Int64() if err != nil { - err = fmt.Errorf("err AddOutboundByV2rayNode 端口数据解析错误 port val(%v)--err(%v)", port, err) + err = fmt.Errorf("err GetOutboundRequest 端口数据解析错误 port val(%v)--err(%v)", port, err) return } @@ -137,20 +94,9 @@ func GetOutboundRequest(port, aid json.Number, outproto, addr, sni, password, ne } if outproto == PROTO_SHADOWSOCKS { - sender.ProxySettings = &internet.ProxyConfig{ - Tag: outag + "-dialer", - } - reqs = []*pros.AddOutboundRequest{GetShadowsocksOutbound(&sender, addr, password, cipher, outag, uint32(proxyport))} - - streamConf, _ = GetTransportStreamConfig(network, password, "cloudflare.com") - sender := proxyman.SenderConfig{ - StreamSettings: streamConf, - MultiplexSettings: &proxyman.MultiplexingConfig{ - Enabled: true, - Concurrency: 1, - }, - } - reqs = append(reqs, GetFreedomOutbound(&sender, addr, outag+"-dialer", uint32(proxyport))) + reqs = []*pros.AddOutboundRequest{GetShadowsocksOutbound(addr, password, cipher, outag, outag+"-dialer", uint32(proxyport))} + + reqs = append(reqs, GetFreedomOutboundOfShadowsocks(network, path, addr, outag+"-dialer", security, uint32(proxyport))) } if outproto == PROTO_TROJAN { diff --git a/v2raypool.go b/v2raypool.go index 44ec198..9aca03a 100644 --- a/v2raypool.go +++ b/v2raypool.go @@ -413,6 +413,10 @@ func (p *ProxyPool) SetLocalAddr(n *ProxyNode, port int) string { } func (p *ProxyPool) testOneNode(n *ProxyNode, i int) bool { + remotePort, _ := n.v2rayNode.Port.Int64() + if remotePort < 11 { + return false + } speed, ok := testProxyNode(p.testUrl, p.GetLocalAddr(*n), i, p.testMaxDuration) n.Speed = speed fmt.Printf("-----testOneNode--ok(%v)--speed(%.4f)--nodeTestUrl(%s)-----ProxyPool.testUrl(%s)-----\n", ok, speed.Seconds(), n.TestUrl, p.testUrl)