Skip to content

Commit

Permalink
FixedBUG: AddOutboundRequest to shadowsocks by gRPC
Browse files Browse the repository at this point in the history
  • Loading branch information
wuhanqing committed May 20, 2024
1 parent 904ffb9 commit 9bcd837
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 60 deletions.
25 changes: 24 additions & 1 deletion v2rayapi/freedom.go
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
8 changes: 7 additions & 1 deletion v2rayapi/shadowsocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
45 changes: 45 additions & 0 deletions v2rayapi/streamconfig.go
Original file line number Diff line number Diff line change
@@ -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
}
62 changes: 4 additions & 58 deletions v2rayapi/v2rayapi.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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"
Expand Down Expand Up @@ -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
}

Expand All @@ -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 {
Expand Down
4 changes: 4 additions & 0 deletions v2raypool.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 9bcd837

Please sign in to comment.