Просмотр исходного кода

Add MeekTrafficShaping[Probability|LimitProtocols]

Rod Hynes 7 лет назад
Родитель
Сommit
69ab3b4af4
2 измененных файлов с 38 добавлено и 22 удалено
  1. 11 6
      psiphon/common/parameters/clientParameters.go
  2. 27 16
      psiphon/meekConn.go

+ 11 - 6
psiphon/common/parameters/clientParameters.go

@@ -161,13 +161,10 @@ const (
 	MeekDialDomainsOnly                              = "MeekDialDomainsOnly"
 	MeekLimitBufferSizes                             = "MeekLimitBufferSizes"
 	MeekCookieMaxPadding                             = "MeekCookieMaxPadding"
-	MeekMinLimitRequestPayloadLength                 = "MeekMinLimitRequestPayloadLength"
-	MeekMaxLimitRequestPayloadLength                 = "MeekMaxLimitRequestPayloadLength"
 	MeekFullReceiveBufferLength                      = "MeekFullReceiveBufferLength"
 	MeekReadPayloadChunkLength                       = "MeekReadPayloadChunkLength"
 	MeekLimitedFullReceiveBufferLength               = "MeekLimitedFullReceiveBufferLength"
 	MeekLimitedReadPayloadChunkLength                = "MeekLimitedReadPayloadChunkLength"
-	MeekRedialTLSProbability                         = "MeekRedialTLSProbability"
 	MeekMinPollInterval                              = "MeekMinPollInterval"
 	MeekMinPollIntervalJitter                        = "MeekMinPollIntervalJitter"
 	MeekMaxPollInterval                              = "MeekMaxPollInterval"
@@ -180,6 +177,11 @@ const (
 	MeekRoundTripRetryMaxDelay                       = "MeekRoundTripRetryMaxDelay"
 	MeekRoundTripRetryMultiplier                     = "MeekRoundTripRetryMultiplier"
 	MeekRoundTripTimeout                             = "MeekRoundTripTimeout"
+	MeekTrafficShapingProbability                    = "MeekTrafficShapingProbability"
+	MeekTrafficShapingLimitProtocols                 = "MeekTrafficShapingLimitProtocols"
+	MeekMinLimitRequestPayloadLength                 = "MeekMinLimitRequestPayloadLength"
+	MeekMaxLimitRequestPayloadLength                 = "MeekMaxLimitRequestPayloadLength"
+	MeekRedialTLSProbability                         = "MeekRedialTLSProbability"
 	TransformHostNameProbability                     = "TransformHostNameProbability"
 	PickUserAgentProbability                         = "PickUserAgentProbability"
 	LivenessTestMinUpstreamBytes                     = "LivenessTestMinUpstreamBytes"
@@ -378,13 +380,10 @@ var defaultClientParameters = map[string]struct {
 	MeekDialDomainsOnly:                        {value: false},
 	MeekLimitBufferSizes:                       {value: false},
 	MeekCookieMaxPadding:                       {value: 256, minimum: 0},
-	MeekMinLimitRequestPayloadLength:           {value: 65536, minimum: 1},
-	MeekMaxLimitRequestPayloadLength:           {value: 65536, minimum: 1},
 	MeekFullReceiveBufferLength:                {value: 4194304, minimum: 1024},
 	MeekReadPayloadChunkLength:                 {value: 65536, minimum: 1024},
 	MeekLimitedFullReceiveBufferLength:         {value: 131072, minimum: 1024},
 	MeekLimitedReadPayloadChunkLength:          {value: 4096, minimum: 1024},
-	MeekRedialTLSProbability:                   {value: 0.0, minimum: 0.0},
 	MeekMinPollInterval:                        {value: 100 * time.Millisecond, minimum: 1 * time.Millisecond},
 	MeekMinPollIntervalJitter:                  {value: 0.3, minimum: 0.0},
 	MeekMaxPollInterval:                        {value: 5 * time.Second, minimum: 1 * time.Millisecond},
@@ -398,6 +397,12 @@ var defaultClientParameters = map[string]struct {
 	MeekRoundTripRetryMultiplier:               {value: 2.0, minimum: 0.0},
 	MeekRoundTripTimeout:                       {value: 20 * time.Second, minimum: 1 * time.Second, flags: useNetworkLatencyMultiplier},
 
+	MeekTrafficShapingProbability:    {value: 1.0, minimum: 0.0},
+	MeekTrafficShapingLimitProtocols: {value: protocol.TunnelProtocols{}},
+	MeekMinLimitRequestPayloadLength: {value: 65536, minimum: 1},
+	MeekMaxLimitRequestPayloadLength: {value: 65536, minimum: 1},
+	MeekRedialTLSProbability:         {value: 0.0, minimum: 0.0},
+
 	TransformHostNameProbability: {value: 0.5, minimum: 0.0},
 	PickUserAgentProbability:     {value: 0.5, minimum: 0.0},
 

+ 27 - 16
psiphon/meekConn.go

@@ -105,6 +105,8 @@ type MeekConfig struct {
 	// included in the meek cookie for optional use by the server, in
 	// cases where the server cannot unambiguously determine the
 	// tunnel protocol.
+	// ClientTunnelProtocol is used when selecting tactics targeted at
+	// specific protocols.
 	ClientTunnelProtocol string
 
 	// RoundTripperOnly sets the MeekConn to operate in round tripper
@@ -1327,25 +1329,34 @@ func makeMeekObfuscationValues(
 		Name:  string(byte(A + letterIndex)),
 		Value: base64.StdEncoding.EncodeToString(obfuscatedCookie)}
 
-	limitRequestPayloadLengthPRNG, err := obfuscator.GetDerivedPRNG(
-		"meek-limit-request-payload-length")
-	if err != nil {
-		return nil, 0, 0, common.ContextError(err)
-	}
+	limitRequestPayloadLength = MEEK_MAX_REQUEST_PAYLOAD_LENGTH
+	redialTLSProbability = 0.0
 
-	minLength := p.Int(parameters.MeekMinLimitRequestPayloadLength)
-	if minLength > MEEK_MAX_REQUEST_PAYLOAD_LENGTH {
-		minLength = MEEK_MAX_REQUEST_PAYLOAD_LENGTH
-	}
-	maxLength := p.Int(parameters.MeekMaxLimitRequestPayloadLength)
-	if maxLength > MEEK_MAX_REQUEST_PAYLOAD_LENGTH {
-		maxLength = MEEK_MAX_REQUEST_PAYLOAD_LENGTH
-	}
+	tunnelProtocols := p.TunnelProtocols(parameters.MeekTrafficShapingLimitProtocols)
+	if (len(tunnelProtocols) == 0 ||
+		common.Contains(tunnelProtocols, clientTunnelProtocol)) &&
+		p.WeightedCoinFlip(parameters.MeekTrafficShapingProbability) {
+
+		limitRequestPayloadLengthPRNG, err := obfuscator.GetDerivedPRNG(
+			"meek-limit-request-payload-length")
+		if err != nil {
+			return nil, 0, 0, common.ContextError(err)
+		}
+
+		minLength := p.Int(parameters.MeekMinLimitRequestPayloadLength)
+		if minLength > MEEK_MAX_REQUEST_PAYLOAD_LENGTH {
+			minLength = MEEK_MAX_REQUEST_PAYLOAD_LENGTH
+		}
+		maxLength := p.Int(parameters.MeekMaxLimitRequestPayloadLength)
+		if maxLength > MEEK_MAX_REQUEST_PAYLOAD_LENGTH {
+			maxLength = MEEK_MAX_REQUEST_PAYLOAD_LENGTH
+		}
 
-	limitRequestPayloadLength = limitRequestPayloadLengthPRNG.Range(
-		minLength, maxLength)
+		limitRequestPayloadLength = limitRequestPayloadLengthPRNG.Range(
+			minLength, maxLength)
 
-	redialTLSProbability = p.Float(parameters.MeekRedialTLSProbability)
+		redialTLSProbability = p.Float(parameters.MeekRedialTLSProbability)
+	}
 
 	return cookie, limitRequestPayloadLength, redialTLSProbability, nil
 }