| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 | 
							- package main
 
- import (
 
- 	"net/netip"
 
- 	"testing"
 
- 	C "github.com/sagernet/sing-box/constant"
 
- 	"github.com/sagernet/sing-box/option"
 
- 	"github.com/sagernet/sing-shadowsocks/shadowaead_2022"
 
- 	"github.com/sagernet/sing/common"
 
- 	"github.com/sagernet/sing/common/json/badoption"
 
- 	"github.com/gofrs/uuid/v5"
 
- )
 
- func TestBrutalShadowsocks(t *testing.T) {
 
- 	method := shadowaead_2022.List[0]
 
- 	password := mkBase64(t, 16)
 
- 	startInstance(t, option.Options{
 
- 		Inbounds: []option.Inbound{
 
- 			{
 
- 				Type: C.TypeMixed,
 
- 				Tag:  "mixed-in",
 
- 				Options: &option.HTTPMixedInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
 
- 						ListenPort: clientPort,
 
- 					},
 
- 				},
 
- 			},
 
- 			{
 
- 				Type: C.TypeShadowsocks,
 
- 				Options: &option.ShadowsocksInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
 
- 						ListenPort: serverPort,
 
- 					},
 
- 					Method:   method,
 
- 					Password: password,
 
- 					Multiplex: &option.InboundMultiplexOptions{
 
- 						Enabled: true,
 
- 						Brutal: &option.BrutalOptions{
 
- 							Enabled:  true,
 
- 							UpMbps:   100,
 
- 							DownMbps: 100,
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 		Outbounds: []option.Outbound{
 
- 			{
 
- 				Type: C.TypeDirect,
 
- 			},
 
- 			{
 
- 				Type: C.TypeShadowsocks,
 
- 				Tag:  "ss-out",
 
- 				Options: &option.ShadowsocksOutboundOptions{
 
- 					ServerOptions: option.ServerOptions{
 
- 						Server:     "127.0.0.1",
 
- 						ServerPort: serverPort,
 
- 					},
 
- 					Method:   method,
 
- 					Password: password,
 
- 					Multiplex: &option.OutboundMultiplexOptions{
 
- 						Enabled:  true,
 
- 						Protocol: "smux",
 
- 						Padding:  true,
 
- 						Brutal: &option.BrutalOptions{
 
- 							Enabled:  true,
 
- 							UpMbps:   100,
 
- 							DownMbps: 100,
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 		Route: &option.RouteOptions{
 
- 			Rules: []option.Rule{
 
- 				{
 
- 					Type: C.RuleTypeDefault,
 
- 					DefaultOptions: option.DefaultRule{
 
- 						RawDefaultRule: option.RawDefaultRule{
 
- 							Inbound: []string{"mixed-in"},
 
- 						},
 
- 						RuleAction: option.RuleAction{
 
- 							Action: C.RuleActionTypeRoute,
 
- 							RouteOptions: option.RouteActionOptions{
 
- 								Outbound: "ss-out",
 
- 							},
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 	})
 
- 	testSuit(t, clientPort, testPort)
 
- }
 
- func TestBrutalTrojan(t *testing.T) {
 
- 	_, certPem, keyPem := createSelfSignedCertificate(t, "example.org")
 
- 	password := mkBase64(t, 16)
 
- 	startInstance(t, option.Options{
 
- 		Inbounds: []option.Inbound{
 
- 			{
 
- 				Type: C.TypeMixed,
 
- 				Tag:  "mixed-in",
 
- 				Options: &option.HTTPMixedInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
 
- 						ListenPort: clientPort,
 
- 					},
 
- 				},
 
- 			},
 
- 			{
 
- 				Type: C.TypeTrojan,
 
- 				Options: &option.TrojanInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
 
- 						ListenPort: serverPort,
 
- 					},
 
- 					Users: []option.TrojanUser{{Password: password}},
 
- 					Multiplex: &option.InboundMultiplexOptions{
 
- 						Enabled: true,
 
- 						Brutal: &option.BrutalOptions{
 
- 							Enabled:  true,
 
- 							UpMbps:   100,
 
- 							DownMbps: 100,
 
- 						},
 
- 					},
 
- 					InboundTLSOptionsContainer: option.InboundTLSOptionsContainer{
 
- 						TLS: &option.InboundTLSOptions{
 
- 							Enabled:         true,
 
- 							ServerName:      "example.org",
 
- 							CertificatePath: certPem,
 
- 							KeyPath:         keyPem,
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 		Outbounds: []option.Outbound{
 
- 			{
 
- 				Type: C.TypeDirect,
 
- 			},
 
- 			{
 
- 				Type: C.TypeTrojan,
 
- 				Tag:  "ss-out",
 
- 				Options: &option.TrojanOutboundOptions{
 
- 					ServerOptions: option.ServerOptions{
 
- 						Server:     "127.0.0.1",
 
- 						ServerPort: serverPort,
 
- 					},
 
- 					Password: password,
 
- 					Multiplex: &option.OutboundMultiplexOptions{
 
- 						Enabled:  true,
 
- 						Protocol: "yamux",
 
- 						Padding:  true,
 
- 						Brutal: &option.BrutalOptions{
 
- 							Enabled:  true,
 
- 							UpMbps:   100,
 
- 							DownMbps: 100,
 
- 						},
 
- 					},
 
- 					OutboundTLSOptionsContainer: option.OutboundTLSOptionsContainer{
 
- 						TLS: &option.OutboundTLSOptions{
 
- 							Enabled:         true,
 
- 							ServerName:      "example.org",
 
- 							CertificatePath: certPem,
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 		Route: &option.RouteOptions{
 
- 			Rules: []option.Rule{
 
- 				{
 
- 					Type: C.RuleTypeDefault,
 
- 					DefaultOptions: option.DefaultRule{
 
- 						RawDefaultRule: option.RawDefaultRule{
 
- 							Inbound: []string{"mixed-in"},
 
- 						},
 
- 						RuleAction: option.RuleAction{
 
- 							Action: C.RuleActionTypeRoute,
 
- 							RouteOptions: option.RouteActionOptions{
 
- 								Outbound: "ss-out",
 
- 							},
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 	})
 
- 	testSuit(t, clientPort, testPort)
 
- }
 
- func TestBrutalVMess(t *testing.T) {
 
- 	user, _ := uuid.NewV4()
 
- 	startInstance(t, option.Options{
 
- 		Inbounds: []option.Inbound{
 
- 			{
 
- 				Type: C.TypeMixed,
 
- 				Tag:  "mixed-in",
 
- 				Options: &option.HTTPMixedInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
 
- 						ListenPort: clientPort,
 
- 					},
 
- 				},
 
- 			},
 
- 			{
 
- 				Type: C.TypeVMess,
 
- 				Options: &option.VMessInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
 
- 						ListenPort: serverPort,
 
- 					},
 
- 					Users: []option.VMessUser{{UUID: user.String()}},
 
- 					Multiplex: &option.InboundMultiplexOptions{
 
- 						Enabled: true,
 
- 						Brutal: &option.BrutalOptions{
 
- 							Enabled:  true,
 
- 							UpMbps:   100,
 
- 							DownMbps: 100,
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 		Outbounds: []option.Outbound{
 
- 			{
 
- 				Type: C.TypeDirect,
 
- 			},
 
- 			{
 
- 				Type: C.TypeVMess,
 
- 				Tag:  "ss-out",
 
- 				Options: &option.VMessOutboundOptions{
 
- 					ServerOptions: option.ServerOptions{
 
- 						Server:     "127.0.0.1",
 
- 						ServerPort: serverPort,
 
- 					},
 
- 					UUID: user.String(),
 
- 					Multiplex: &option.OutboundMultiplexOptions{
 
- 						Enabled:  true,
 
- 						Protocol: "h2mux",
 
- 						Padding:  true,
 
- 						Brutal: &option.BrutalOptions{
 
- 							Enabled:  true,
 
- 							UpMbps:   100,
 
- 							DownMbps: 100,
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 		Route: &option.RouteOptions{
 
- 			Rules: []option.Rule{
 
- 				{
 
- 					Type: C.RuleTypeDefault,
 
- 					DefaultOptions: option.DefaultRule{
 
- 						RawDefaultRule: option.RawDefaultRule{
 
- 							Inbound: []string{"mixed-in"},
 
- 						},
 
- 						RuleAction: option.RuleAction{
 
- 							Action: C.RuleActionTypeRoute,
 
- 							RouteOptions: option.RouteActionOptions{
 
- 								Outbound: "ss-out",
 
- 							},
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 	})
 
- 	testSuit(t, clientPort, testPort)
 
- }
 
- func TestBrutalVLESS(t *testing.T) {
 
- 	user, _ := uuid.NewV4()
 
- 	startInstance(t, option.Options{
 
- 		Inbounds: []option.Inbound{
 
- 			{
 
- 				Type: C.TypeMixed,
 
- 				Tag:  "mixed-in",
 
- 				Options: &option.HTTPMixedInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
 
- 						ListenPort: clientPort,
 
- 					},
 
- 				},
 
- 			},
 
- 			{
 
- 				Type: C.TypeVLESS,
 
- 				Options: &option.VLESSInboundOptions{
 
- 					ListenOptions: option.ListenOptions{
 
- 						Listen:     common.Ptr(badoption.Addr(netip.IPv4Unspecified())),
 
- 						ListenPort: serverPort,
 
- 					},
 
- 					Users: []option.VLESSUser{{UUID: user.String()}},
 
- 					Multiplex: &option.InboundMultiplexOptions{
 
- 						Enabled: true,
 
- 						Brutal: &option.BrutalOptions{
 
- 							Enabled:  true,
 
- 							UpMbps:   100,
 
- 							DownMbps: 100,
 
- 						},
 
- 					},
 
- 					InboundTLSOptionsContainer: option.InboundTLSOptionsContainer{
 
- 						TLS: &option.InboundTLSOptions{
 
- 							Enabled:    true,
 
- 							ServerName: "google.com",
 
- 							Reality: &option.InboundRealityOptions{
 
- 								Enabled: true,
 
- 								Handshake: option.InboundRealityHandshakeOptions{
 
- 									ServerOptions: option.ServerOptions{
 
- 										Server:     "google.com",
 
- 										ServerPort: 443,
 
- 									},
 
- 								},
 
- 								ShortID:    []string{"0123456789abcdef"},
 
- 								PrivateKey: "UuMBgl7MXTPx9inmQp2UC7Jcnwc6XYbwDNebonM-FCc",
 
- 							},
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 		Outbounds: []option.Outbound{
 
- 			{
 
- 				Type: C.TypeDirect,
 
- 			},
 
- 			{
 
- 				Type: C.TypeVLESS,
 
- 				Tag:  "ss-out",
 
- 				Options: &option.VLESSOutboundOptions{
 
- 					ServerOptions: option.ServerOptions{
 
- 						Server:     "127.0.0.1",
 
- 						ServerPort: serverPort,
 
- 					},
 
- 					UUID: user.String(),
 
- 					OutboundTLSOptionsContainer: option.OutboundTLSOptionsContainer{
 
- 						TLS: &option.OutboundTLSOptions{
 
- 							Enabled:    true,
 
- 							ServerName: "google.com",
 
- 							Reality: &option.OutboundRealityOptions{
 
- 								Enabled:   true,
 
- 								ShortID:   "0123456789abcdef",
 
- 								PublicKey: "jNXHt1yRo0vDuchQlIP6Z0ZvjT3KtzVI-T4E7RoLJS0",
 
- 							},
 
- 							UTLS: &option.OutboundUTLSOptions{
 
- 								Enabled: true,
 
- 							},
 
- 						},
 
- 					},
 
- 					Multiplex: &option.OutboundMultiplexOptions{
 
- 						Enabled:  true,
 
- 						Protocol: "h2mux",
 
- 						Padding:  true,
 
- 						Brutal: &option.BrutalOptions{
 
- 							Enabled:  true,
 
- 							UpMbps:   100,
 
- 							DownMbps: 100,
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 		Route: &option.RouteOptions{
 
- 			Rules: []option.Rule{
 
- 				{
 
- 					Type: C.RuleTypeDefault,
 
- 					DefaultOptions: option.DefaultRule{
 
- 						RawDefaultRule: option.RawDefaultRule{
 
- 							Inbound: []string{"mixed-in"},
 
- 						},
 
- 						RuleAction: option.RuleAction{
 
- 							Action: C.RuleActionTypeRoute,
 
- 							RouteOptions: option.RouteActionOptions{
 
- 								Outbound: "ss-out",
 
- 							},
 
- 						},
 
- 					},
 
- 				},
 
- 			},
 
- 		},
 
- 	})
 
- 	testSuit(t, clientPort, testPort)
 
- }
 
 
  |