mirror of https://github.com/XTLS/Xray-core
				
				
				
			Freedom: Add `maxSplit` fragment option; Add `applyTo` noises option (#4998)
							parent
							
								
									5dce7e4e25
								
							
						
					
					
						commit
						cde6e33ec9
					
				| 
						 | 
				
			
			@ -27,12 +27,14 @@ type Fragment struct {
 | 
			
		|||
	Packets  string      `json:"packets"`
 | 
			
		||||
	Length   *Int32Range `json:"length"`
 | 
			
		||||
	Interval *Int32Range `json:"interval"`
 | 
			
		||||
	MaxSplit *Int32Range `json:"maxSplit"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Noise struct {
 | 
			
		||||
	Type   string      `json:"type"`
 | 
			
		||||
	Packet string      `json:"packet"`
 | 
			
		||||
	Delay  *Int32Range `json:"delay"`
 | 
			
		||||
	Type    string      `json:"type"`
 | 
			
		||||
	Packet  string      `json:"packet"`
 | 
			
		||||
	Delay   *Int32Range `json:"delay"`
 | 
			
		||||
	ApplyTo string      `json:"applyTo"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Build implements Buildable
 | 
			
		||||
| 
						 | 
				
			
			@ -108,6 +110,13 @@ func (c *FreedomConfig) Build() (proto.Message, error) {
 | 
			
		|||
			config.Fragment.IntervalMin = uint64(c.Fragment.Interval.From)
 | 
			
		||||
			config.Fragment.IntervalMax = uint64(c.Fragment.Interval.To)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			if c.Fragment.MaxSplit != nil {
 | 
			
		||||
				config.Fragment.MaxSplitMin = uint64(c.Fragment.MaxSplit.From)
 | 
			
		||||
				config.Fragment.MaxSplitMax = uint64(c.Fragment.MaxSplit.To)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.Noise != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -193,5 +202,15 @@ func ParseNoise(noise *Noise) (*freedom.Noise, error) {
 | 
			
		|||
		NConfig.DelayMin = uint64(noise.Delay.From)
 | 
			
		||||
		NConfig.DelayMax = uint64(noise.Delay.To)
 | 
			
		||||
	}
 | 
			
		||||
	switch strings.ToLower(noise.ApplyTo) {
 | 
			
		||||
	case "", "ip", "all":
 | 
			
		||||
		NConfig.ApplyTo = "ip"
 | 
			
		||||
	case "ipv4":
 | 
			
		||||
		NConfig.ApplyTo = "ipv4"
 | 
			
		||||
	case "ipv6":
 | 
			
		||||
		NConfig.ApplyTo = "ipv6"
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, errors.New("Invalid applyTo, only ip/ipv4/ipv6 are supported")
 | 
			
		||||
	}
 | 
			
		||||
	return NConfig, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -150,6 +150,8 @@ type Fragment struct {
 | 
			
		|||
	LengthMax   uint64 `protobuf:"varint,4,opt,name=length_max,json=lengthMax,proto3" json:"length_max,omitempty"`
 | 
			
		||||
	IntervalMin uint64 `protobuf:"varint,5,opt,name=interval_min,json=intervalMin,proto3" json:"interval_min,omitempty"`
 | 
			
		||||
	IntervalMax uint64 `protobuf:"varint,6,opt,name=interval_max,json=intervalMax,proto3" json:"interval_max,omitempty"`
 | 
			
		||||
	MaxSplitMin uint64 `protobuf:"varint,7,opt,name=max_split_min,json=maxSplitMin,proto3" json:"max_split_min,omitempty"`
 | 
			
		||||
	MaxSplitMax uint64 `protobuf:"varint,8,opt,name=max_split_max,json=maxSplitMax,proto3" json:"max_split_max,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Fragment) Reset() {
 | 
			
		||||
| 
						 | 
				
			
			@ -224,6 +226,20 @@ func (x *Fragment) GetIntervalMax() uint64 {
 | 
			
		|||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Fragment) GetMaxSplitMin() uint64 {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.MaxSplitMin
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Fragment) GetMaxSplitMax() uint64 {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.MaxSplitMax
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Noise struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
| 
						 | 
				
			
			@ -234,6 +250,7 @@ type Noise struct {
 | 
			
		|||
	DelayMin  uint64 `protobuf:"varint,3,opt,name=delay_min,json=delayMin,proto3" json:"delay_min,omitempty"`
 | 
			
		||||
	DelayMax  uint64 `protobuf:"varint,4,opt,name=delay_max,json=delayMax,proto3" json:"delay_max,omitempty"`
 | 
			
		||||
	Packet    []byte `protobuf:"bytes,5,opt,name=packet,proto3" json:"packet,omitempty"`
 | 
			
		||||
	ApplyTo   string `protobuf:"bytes,6,opt,name=apply_to,json=applyTo,proto3" json:"apply_to,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Noise) Reset() {
 | 
			
		||||
| 
						 | 
				
			
			@ -301,6 +318,13 @@ func (x *Noise) GetPacket() []byte {
 | 
			
		|||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (x *Noise) GetApplyTo() string {
 | 
			
		||||
	if x != nil {
 | 
			
		||||
		return x.ApplyTo
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Config struct {
 | 
			
		||||
	state         protoimpl.MessageState
 | 
			
		||||
	sizeCache     protoimpl.SizeCache
 | 
			
		||||
| 
						 | 
				
			
			@ -399,7 +423,7 @@ var file_proxy_freedom_config_proto_rawDesc = []byte{
 | 
			
		|||
	0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x78, 0x72, 0x61,
 | 
			
		||||
	0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
 | 
			
		||||
	0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
 | 
			
		||||
	0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0xd0, 0x01, 0x0a, 0x08, 0x46, 0x72, 0x61,
 | 
			
		||||
	0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x98, 0x02, 0x0a, 0x08, 0x46, 0x72, 0x61,
 | 
			
		||||
	0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73,
 | 
			
		||||
	0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x70, 0x61, 0x63,
 | 
			
		||||
	0x6b, 0x65, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b,
 | 
			
		||||
| 
						 | 
				
			
			@ -412,57 +436,63 @@ var file_proxy_freedom_config_proto_rawDesc = []byte{
 | 
			
		|||
	0x6c, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x69, 0x6e, 0x74,
 | 
			
		||||
	0x65, 0x72, 0x76, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65,
 | 
			
		||||
	0x72, 0x76, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b,
 | 
			
		||||
	0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x4d, 0x61, 0x78, 0x22, 0x97, 0x01, 0x0a, 0x05,
 | 
			
		||||
	0x4e, 0x6f, 0x69, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f,
 | 
			
		||||
	0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6c, 0x65, 0x6e, 0x67, 0x74,
 | 
			
		||||
	0x68, 0x4d, 0x69, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6d,
 | 
			
		||||
	0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
 | 
			
		||||
	0x4d, 0x61, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6e,
 | 
			
		||||
	0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6e,
 | 
			
		||||
	0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20,
 | 
			
		||||
	0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x61, 0x78, 0x12, 0x16, 0x0a,
 | 
			
		||||
	0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70,
 | 
			
		||||
	0x61, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x97, 0x04, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
 | 
			
		||||
	0x12, 0x52, 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74,
 | 
			
		||||
	0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x78, 0x72, 0x61, 0x79,
 | 
			
		||||
	0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x43,
 | 
			
		||||
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61,
 | 
			
		||||
	0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61,
 | 
			
		||||
	0x74, 0x65, 0x67, 0x79, 0x12, 0x5a, 0x0a, 0x14, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74,
 | 
			
		||||
	0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e,
 | 
			
		||||
	0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74,
 | 
			
		||||
	0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x13, 0x64, 0x65, 0x73,
 | 
			
		||||
	0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65,
 | 
			
		||||
	0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04,
 | 
			
		||||
	0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12,
 | 
			
		||||
	0x38, 0x0a, 0x08, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28,
 | 
			
		||||
	0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66,
 | 
			
		||||
	0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52,
 | 
			
		||||
	0x08, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x6f,
 | 
			
		||||
	0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28,
 | 
			
		||||
	0x0d, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
 | 
			
		||||
	0x12, 0x31, 0x0a, 0x06, 0x6e, 0x6f, 0x69, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b,
 | 
			
		||||
	0x32, 0x19, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72,
 | 
			
		||||
	0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x4e, 0x6f, 0x69, 0x73, 0x65, 0x52, 0x06, 0x6e, 0x6f, 0x69,
 | 
			
		||||
	0x73, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74,
 | 
			
		||||
	0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x53, 0x5f, 0x49, 0x53, 0x10,
 | 
			
		||||
	0x00, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a,
 | 
			
		||||
	0x07, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x53,
 | 
			
		||||
	0x45, 0x5f, 0x49, 0x50, 0x36, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x45, 0x5f, 0x49,
 | 
			
		||||
	0x50, 0x34, 0x36, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x36,
 | 
			
		||||
	0x34, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x10,
 | 
			
		||||
	0x06, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x07,
 | 
			
		||||
	0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x10, 0x08, 0x12,
 | 
			
		||||
	0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x36, 0x10, 0x09, 0x12,
 | 
			
		||||
	0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x34, 0x10, 0x0a, 0x42,
 | 
			
		||||
	0x58, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78,
 | 
			
		||||
	0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74,
 | 
			
		||||
	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61,
 | 
			
		||||
	0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x66, 0x72, 0x65,
 | 
			
		||||
	0x65, 0x64, 0x6f, 0x6d, 0xaa, 0x02, 0x12, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78,
 | 
			
		||||
	0x79, 0x2e, 0x46, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 | 
			
		||||
	0x33,
 | 
			
		||||
	0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x4d, 0x61, 0x78, 0x12, 0x22, 0x0a, 0x0d, 0x6d,
 | 
			
		||||
	0x61, 0x78, 0x5f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01,
 | 
			
		||||
	0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x69, 0x6e, 0x12,
 | 
			
		||||
	0x22, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x78,
 | 
			
		||||
	0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x53, 0x70, 0x6c, 0x69, 0x74,
 | 
			
		||||
	0x4d, 0x61, 0x78, 0x22, 0xb2, 0x01, 0x0a, 0x05, 0x4e, 0x6f, 0x69, 0x73, 0x65, 0x12, 0x1d, 0x0a,
 | 
			
		||||
	0x0a, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
 | 
			
		||||
	0x04, 0x52, 0x09, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x69, 0x6e, 0x12, 0x1d, 0x0a, 0x0a,
 | 
			
		||||
	0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04,
 | 
			
		||||
	0x52, 0x09, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x61, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x64,
 | 
			
		||||
	0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08,
 | 
			
		||||
	0x64, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x61,
 | 
			
		||||
	0x79, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x64, 0x65, 0x6c,
 | 
			
		||||
	0x61, 0x79, 0x4d, 0x61, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x18,
 | 
			
		||||
	0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x19, 0x0a,
 | 
			
		||||
	0x08, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
			
		||||
	0x07, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x22, 0x97, 0x04, 0x0a, 0x06, 0x43, 0x6f, 0x6e,
 | 
			
		||||
	0x66, 0x69, 0x67, 0x12, 0x52, 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x74,
 | 
			
		||||
	0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x78,
 | 
			
		||||
	0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f,
 | 
			
		||||
	0x6d, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53,
 | 
			
		||||
	0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53,
 | 
			
		||||
	0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x5a, 0x0a, 0x14, 0x64, 0x65, 0x73, 0x74, 0x69,
 | 
			
		||||
	0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18,
 | 
			
		||||
	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f,
 | 
			
		||||
	0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69,
 | 
			
		||||
	0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x13,
 | 
			
		||||
	0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72,
 | 
			
		||||
	0x69, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65,
 | 
			
		||||
	0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76,
 | 
			
		||||
	0x65, 0x6c, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05,
 | 
			
		||||
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78,
 | 
			
		||||
	0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65,
 | 
			
		||||
	0x6e, 0x74, 0x52, 0x08, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e,
 | 
			
		||||
	0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06,
 | 
			
		||||
	0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f,
 | 
			
		||||
	0x63, 0x6f, 0x6c, 0x12, 0x31, 0x0a, 0x06, 0x6e, 0x6f, 0x69, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20,
 | 
			
		||||
	0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79,
 | 
			
		||||
	0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x4e, 0x6f, 0x69, 0x73, 0x65, 0x52, 0x06,
 | 
			
		||||
	0x6e, 0x6f, 0x69, 0x73, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69,
 | 
			
		||||
	0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x53, 0x5f,
 | 
			
		||||
	0x49, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x10, 0x01,
 | 
			
		||||
	0x12, 0x0b, 0x0a, 0x07, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x02, 0x12, 0x0b, 0x0a,
 | 
			
		||||
	0x07, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53,
 | 
			
		||||
	0x45, 0x5f, 0x49, 0x50, 0x34, 0x36, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x45, 0x5f,
 | 
			
		||||
	0x49, 0x50, 0x36, 0x34, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f,
 | 
			
		||||
	0x49, 0x50, 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50,
 | 
			
		||||
	0x34, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x36,
 | 
			
		||||
	0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x36,
 | 
			
		||||
	0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x34,
 | 
			
		||||
	0x10, 0x0a, 0x42, 0x58, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x70,
 | 
			
		||||
	0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x50, 0x01, 0x5a, 0x27,
 | 
			
		||||
	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f,
 | 
			
		||||
	0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f,
 | 
			
		||||
	0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0xaa, 0x02, 0x12, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x50,
 | 
			
		||||
	0x72, 0x6f, 0x78, 0x79, 0x2e, 0x46, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x62, 0x06, 0x70, 0x72,
 | 
			
		||||
	0x6f, 0x74, 0x6f, 0x33,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,8 @@ message Fragment {
 | 
			
		|||
  uint64 length_max = 4;
 | 
			
		||||
  uint64 interval_min = 5;
 | 
			
		||||
  uint64 interval_max = 6;
 | 
			
		||||
  uint64 max_split_min = 7;
 | 
			
		||||
  uint64 max_split_max = 8;
 | 
			
		||||
}
 | 
			
		||||
message Noise {
 | 
			
		||||
  uint64 length_min = 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +28,7 @@ message Noise {
 | 
			
		|||
  uint64 delay_min = 3;
 | 
			
		||||
  uint64 delay_max = 4;
 | 
			
		||||
  bytes packet = 5;
 | 
			
		||||
  string apply_to = 6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message Config {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -194,7 +194,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
 | 
			
		|||
		if destination.Network == net.Network_TCP {
 | 
			
		||||
			if h.config.Fragment != nil {
 | 
			
		||||
				errors.LogDebug(ctx, "FRAGMENT", h.config.Fragment.PacketsFrom, h.config.Fragment.PacketsTo, h.config.Fragment.LengthMin, h.config.Fragment.LengthMax,
 | 
			
		||||
					h.config.Fragment.IntervalMin, h.config.Fragment.IntervalMax)
 | 
			
		||||
					h.config.Fragment.IntervalMin, h.config.Fragment.IntervalMax, h.config.Fragment.MaxSplitMin, h.config.Fragment.MaxSplitMax)
 | 
			
		||||
				writer = buf.NewWriter(&FragmentWriter{
 | 
			
		||||
					fragment: h.config.Fragment,
 | 
			
		||||
					writer:   conn,
 | 
			
		||||
| 
						 | 
				
			
			@ -211,6 +211,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
 | 
			
		|||
					noises:      h.config.Noises,
 | 
			
		||||
					firstWrite:  true,
 | 
			
		||||
					UDPOverride: UDPOverride,
 | 
			
		||||
					remoteAddr:  net.DestinationFromAddr(conn.RemoteAddr()).Address,
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -289,14 +290,13 @@ func NewPacketReader(conn net.Conn, UDPOverride net.Destination, DialDest net.De
 | 
			
		|||
		if UDPOverride.Address != nil || UDPOverride.Port != 0 {
 | 
			
		||||
			isOverridden = true
 | 
			
		||||
		}
 | 
			
		||||
		changedAddress, _, _ := net.SplitHostPort(conn.RemoteAddr().String())
 | 
			
		||||
 | 
			
		||||
		return &PacketReader{
 | 
			
		||||
			PacketConnWrapper: c,
 | 
			
		||||
			Counter:           counter,
 | 
			
		||||
			IsOverridden:      isOverridden,
 | 
			
		||||
			InitUnchangedAddr: DialDest.Address,
 | 
			
		||||
			InitChangedAddr:   net.ParseAddress(changedAddress),
 | 
			
		||||
			InitChangedAddr:   net.DestinationFromAddr(conn.RemoteAddr()).Address,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return &buf.PacketReader{Reader: conn}
 | 
			
		||||
| 
						 | 
				
			
			@ -354,8 +354,7 @@ func NewPacketWriter(conn net.Conn, h *Handler, ctx context.Context, UDPOverride
 | 
			
		|||
		// check this behavior and add it to map
 | 
			
		||||
		resolvedUDPAddr := utils.NewTypedSyncMap[string, net.Address]()
 | 
			
		||||
		if DialDest.Address.Family().IsDomain() {
 | 
			
		||||
			RemoteAddress, _, _ := net.SplitHostPort(conn.RemoteAddr().String())
 | 
			
		||||
			resolvedUDPAddr.Store(DialDest.Address.String(), net.ParseAddress(RemoteAddress))
 | 
			
		||||
			resolvedUDPAddr.Store(DialDest.Address.Domain(), net.DestinationFromAddr(conn.RemoteAddr()).Address)
 | 
			
		||||
		}
 | 
			
		||||
		return &PacketWriter{
 | 
			
		||||
			PacketConnWrapper: c,
 | 
			
		||||
| 
						 | 
				
			
			@ -456,6 +455,7 @@ type NoisePacketWriter struct {
 | 
			
		|||
	noises      []*Noise
 | 
			
		||||
	firstWrite  bool
 | 
			
		||||
	UDPOverride net.Destination
 | 
			
		||||
	remoteAddr  net.Address
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MultiBuffer writer with Noise before first packet
 | 
			
		||||
| 
						 | 
				
			
			@ -468,8 +468,24 @@ func (w *NoisePacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
 | 
			
		|||
		}
 | 
			
		||||
		var noise []byte
 | 
			
		||||
		var err error
 | 
			
		||||
		if w.remoteAddr.Family().IsDomain() {
 | 
			
		||||
			panic("impossible, remoteAddr is always IP")
 | 
			
		||||
		}
 | 
			
		||||
		for _, n := range w.noises {
 | 
			
		||||
			//User input string or base64 encoded string
 | 
			
		||||
			switch n.ApplyTo {
 | 
			
		||||
			case "ipv4":
 | 
			
		||||
				if w.remoteAddr.Family().IsIPv6() {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
			case "ipv6":
 | 
			
		||||
				if w.remoteAddr.Family().IsIPv4() {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
			case "ip":
 | 
			
		||||
			default:
 | 
			
		||||
				panic("unreachable, applyTo is ip/ipv4/ipv6")
 | 
			
		||||
			}
 | 
			
		||||
			//User input string or base64 encoded string or hex string
 | 
			
		||||
			if n.Packet != nil {
 | 
			
		||||
				noise = n.Packet
 | 
			
		||||
			} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -509,23 +525,29 @@ func (f *FragmentWriter) Write(b []byte) (int, error) {
 | 
			
		|||
			return f.writer.Write(b)
 | 
			
		||||
		}
 | 
			
		||||
		data := b[5:recordLen]
 | 
			
		||||
		buf := make([]byte, 1024)
 | 
			
		||||
		buff := make([]byte, 2048)
 | 
			
		||||
		var hello []byte
 | 
			
		||||
		maxSplit := crypto.RandBetween(int64(f.fragment.MaxSplitMin), int64(f.fragment.MaxSplitMax))
 | 
			
		||||
		var splitNum int64
 | 
			
		||||
		for from := 0; ; {
 | 
			
		||||
			to := from + int(crypto.RandBetween(int64(f.fragment.LengthMin), int64(f.fragment.LengthMax)))
 | 
			
		||||
			if to > len(data) {
 | 
			
		||||
			splitNum++
 | 
			
		||||
			if to > len(data) || (maxSplit > 0 && splitNum >= maxSplit) {
 | 
			
		||||
				to = len(data)
 | 
			
		||||
			}
 | 
			
		||||
			copy(buf[:3], b)
 | 
			
		||||
			copy(buf[5:], data[from:to])
 | 
			
		||||
			l := to - from
 | 
			
		||||
			if 5+l > len(buff) {
 | 
			
		||||
				buff = make([]byte, 5+l)
 | 
			
		||||
			}
 | 
			
		||||
			copy(buff[:3], b)
 | 
			
		||||
			copy(buff[5:], data[from:to])
 | 
			
		||||
			from = to
 | 
			
		||||
			buf[3] = byte(l >> 8)
 | 
			
		||||
			buf[4] = byte(l)
 | 
			
		||||
			buff[3] = byte(l >> 8)
 | 
			
		||||
			buff[4] = byte(l)
 | 
			
		||||
			if f.fragment.IntervalMax == 0 { // combine fragmented tlshello if interval is 0
 | 
			
		||||
				hello = append(hello, buf[:5+l]...)
 | 
			
		||||
				hello = append(hello, buff[:5+l]...)
 | 
			
		||||
			} else {
 | 
			
		||||
				_, err := f.writer.Write(buf[:5+l])
 | 
			
		||||
				_, err := f.writer.Write(buff[:5+l])
 | 
			
		||||
				time.Sleep(time.Duration(crypto.RandBetween(int64(f.fragment.IntervalMin), int64(f.fragment.IntervalMax))) * time.Millisecond)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return 0, err
 | 
			
		||||
| 
						 | 
				
			
			@ -552,17 +574,20 @@ func (f *FragmentWriter) Write(b []byte) (int, error) {
 | 
			
		|||
	if f.fragment.PacketsFrom != 0 && (f.count < f.fragment.PacketsFrom || f.count > f.fragment.PacketsTo) {
 | 
			
		||||
		return f.writer.Write(b)
 | 
			
		||||
	}
 | 
			
		||||
	maxSplit := crypto.RandBetween(int64(f.fragment.MaxSplitMin), int64(f.fragment.MaxSplitMax))
 | 
			
		||||
	var splitNum int64
 | 
			
		||||
	for from := 0; ; {
 | 
			
		||||
		to := from + int(crypto.RandBetween(int64(f.fragment.LengthMin), int64(f.fragment.LengthMax)))
 | 
			
		||||
		if to > len(b) {
 | 
			
		||||
		splitNum++
 | 
			
		||||
		if to > len(b) || (maxSplit > 0 && splitNum >= maxSplit) {
 | 
			
		||||
			to = len(b)
 | 
			
		||||
		}
 | 
			
		||||
		n, err := f.writer.Write(b[from:to])
 | 
			
		||||
		from += n
 | 
			
		||||
		time.Sleep(time.Duration(crypto.RandBetween(int64(f.fragment.IntervalMin), int64(f.fragment.IntervalMax))) * time.Millisecond)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return from, err
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(time.Duration(crypto.RandBetween(int64(f.fragment.IntervalMin), int64(f.fragment.IntervalMax))) * time.Millisecond)
 | 
			
		||||
		if from >= len(b) {
 | 
			
		||||
			return from, nil
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue