Skip to content

Commit 363e86c

Browse files
dragonbreath2000Fanglidingmmmray
authored
UDP noises: Add base64 and multi-packet support (#3794)
#3794 (comment) --------- Co-authored-by: 风扇滑翔翼 <[email protected]> Co-authored-by: mmmray <[email protected]>
1 parent b1c6471 commit 363e86c

File tree

4 files changed

+130
-119
lines changed

4 files changed

+130
-119
lines changed

infra/conf/freedom.go

Lines changed: 77 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package conf
22

33
import (
4+
"encoding/base64"
45
"net"
56
"strconv"
67
"strings"
@@ -19,6 +20,7 @@ type FreedomConfig struct {
1920
UserLevel uint32 `json:"userLevel"`
2021
Fragment *Fragment `json:"fragment"`
2122
Noise *Noise `json:"noise"`
23+
Noises []*Noise `json:"noises"`
2224
ProxyProtocol uint32 `json:"proxyProtocol"`
2325
}
2426

@@ -29,8 +31,9 @@ type Fragment struct {
2931
}
3032

3133
type Noise struct {
32-
Packet string `json:"packet"`
33-
Delay string `json:"delay"`
34+
Type string `json:"type"`
35+
Packet string `json:"packet"`
36+
Delay *Int32Range `json:"delay"`
3437
}
3538

3639
// Build implements Buildable
@@ -149,74 +152,18 @@ func (c *FreedomConfig) Build() (proto.Message, error) {
149152
}
150153
}
151154
}
152-
if c.Noise != nil {
153-
config.Noise = new(freedom.Noise)
154-
var err, err2 error
155-
p := strings.Split(strings.ToLower(c.Noise.Packet), ":")
156-
if len(p) != 2 {
157-
return nil, errors.New("invalid type for packet")
158-
}
159-
switch p[0] {
160-
case "rand":
161-
randValue := strings.Split(p[1], "-")
162-
if len(randValue) > 2 {
163-
return nil, errors.New("Only 2 values are allowed for rand")
164-
}
165-
if len(randValue) == 2 {
166-
config.Noise.LengthMin, err = strconv.ParseUint(randValue[0], 10, 64)
167-
config.Noise.LengthMax, err2 = strconv.ParseUint(randValue[1], 10, 64)
168-
}
169-
if len(randValue) == 1 {
170-
config.Noise.LengthMin, err = strconv.ParseUint(randValue[0], 10, 64)
171-
config.Noise.LengthMax = config.Noise.LengthMin
172-
}
173-
if err != nil {
174-
return nil, errors.New("invalid value for rand LengthMin").Base(err)
175-
}
176-
if err2 != nil {
177-
return nil, errors.New("invalid value for rand LengthMax").Base(err2)
178-
}
179-
if config.Noise.LengthMin > config.Noise.LengthMax {
180-
config.Noise.LengthMin, config.Noise.LengthMax = config.Noise.LengthMax, config.Noise.LengthMin
181-
}
182-
if config.Noise.LengthMin == 0 {
183-
return nil, errors.New("rand lengthMin or lengthMax cannot be 0")
184-
}
185-
186-
case "str":
187-
//user input string
188-
config.Noise.StrNoise = strings.TrimSpace(p[1])
189155

190-
default:
191-
return nil, errors.New("Invalid packet,only rand and str are supported")
192-
}
193-
if c.Noise.Delay != "" {
194-
d := strings.Split(strings.ToLower(c.Noise.Delay), "-")
195-
if len(d) > 2 {
196-
return nil, errors.New("Invalid delay value")
197-
}
198-
if len(d) == 2 {
199-
config.Noise.DelayMin, err = strconv.ParseUint(d[0], 10, 64)
200-
config.Noise.DelayMax, err2 = strconv.ParseUint(d[1], 10, 64)
156+
if c.Noise != nil {
157+
return nil, errors.PrintRemovedFeatureError("noise = { ... }", "noises = [ { ... } ]")
158+
}
201159

202-
} else {
203-
config.Noise.DelayMin, err = strconv.ParseUint(d[0], 10, 64)
204-
config.Noise.DelayMax = config.Noise.DelayMin
205-
}
160+
if c.Noises != nil {
161+
for _, n := range c.Noises {
162+
NConfig, err := ParseNoise(n)
206163
if err != nil {
207-
return nil, errors.New("Invalid value for DelayMin").Base(err)
208-
}
209-
if err2 != nil {
210-
return nil, errors.New("Invalid value for DelayMax").Base(err2)
164+
return nil, err
211165
}
212-
if config.Noise.DelayMin > config.Noise.DelayMax {
213-
config.Noise.DelayMin, config.Noise.DelayMax = config.Noise.DelayMax, config.Noise.DelayMin
214-
}
215-
if config.Noise.DelayMin == 0 {
216-
return nil, errors.New("DelayMin or DelayMax cannot be 0")
217-
}
218-
} else {
219-
config.Noise.DelayMin = 0
166+
config.Noises = append(config.Noises, NConfig)
220167
}
221168
}
222169

@@ -248,3 +195,67 @@ func (c *FreedomConfig) Build() (proto.Message, error) {
248195
}
249196
return config, nil
250197
}
198+
199+
func ParseNoise(noise *Noise) (*freedom.Noise, error) {
200+
var err, err2 error
201+
NConfig := new(freedom.Noise)
202+
203+
switch strings.ToLower(noise.Type) {
204+
case "rand":
205+
randValue := strings.Split(noise.Packet, "-")
206+
if len(randValue) > 2 {
207+
return nil, errors.New("Only 2 values are allowed for rand")
208+
}
209+
if len(randValue) == 2 {
210+
NConfig.LengthMin, err = strconv.ParseUint(randValue[0], 10, 64)
211+
NConfig.LengthMax, err2 = strconv.ParseUint(randValue[1], 10, 64)
212+
}
213+
if len(randValue) == 1 {
214+
NConfig.LengthMin, err = strconv.ParseUint(randValue[0], 10, 64)
215+
NConfig.LengthMax = NConfig.LengthMin
216+
}
217+
if err != nil {
218+
return nil, errors.New("invalid value for rand LengthMin").Base(err)
219+
}
220+
if err2 != nil {
221+
return nil, errors.New("invalid value for rand LengthMax").Base(err2)
222+
}
223+
if NConfig.LengthMin > NConfig.LengthMax {
224+
NConfig.LengthMin, NConfig.LengthMax = NConfig.LengthMax, NConfig.LengthMin
225+
}
226+
if NConfig.LengthMin == 0 {
227+
return nil, errors.New("rand lengthMin or lengthMax cannot be 0")
228+
}
229+
230+
case "str":
231+
//user input string
232+
NConfig.StrNoise = []byte(strings.TrimSpace(noise.Packet))
233+
234+
case "base64":
235+
//user input base64
236+
NConfig.StrNoise, err = base64.StdEncoding.DecodeString(strings.TrimSpace(noise.Packet))
237+
if err != nil {
238+
return nil, errors.New("Invalid base64 string")
239+
}
240+
241+
default:
242+
return nil, errors.New("Invalid packet,only rand,str,base64 are supported")
243+
}
244+
245+
if noise.Delay != nil {
246+
if noise.Delay.From != 0 && noise.Delay.To != 0 {
247+
NConfig.DelayMin = uint64(noise.Delay.From)
248+
NConfig.DelayMax = uint64(noise.Delay.To)
249+
if NConfig.DelayMin > NConfig.LengthMax {
250+
NConfig.DelayMin, NConfig.DelayMax = NConfig.LengthMax, NConfig.DelayMin
251+
}
252+
} else {
253+
return nil, errors.New("DelayMin or DelayMax cannot be zero")
254+
}
255+
256+
} else {
257+
NConfig.DelayMin = 0
258+
NConfig.DelayMax = 0
259+
}
260+
return NConfig, nil
261+
}

proxy/freedom/config.pb.go

Lines changed: 30 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proxy/freedom/config.proto

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ message Noise {
2525
uint64 length_max = 2;
2626
uint64 delay_min = 3;
2727
uint64 delay_max = 4;
28-
string str_noise = 5;
28+
bytes str_noise = 5;
2929
}
3030

3131
message Config {
@@ -48,5 +48,5 @@ message Config {
4848
uint32 user_level = 4;
4949
Fragment fragment = 5;
5050
uint32 proxy_protocol = 6;
51-
Noise noise = 7;
51+
repeated Noise noises = 7;
5252
}

proxy/freedom/freedom.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -208,12 +208,11 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
208208
}
209209
} else {
210210
writer = NewPacketWriter(conn, h, ctx, UDPOverride)
211-
if h.config.Noise != nil {
212-
errors.LogDebug(ctx, "NOISE", h.config.Noise.StrNoise, h.config.Noise.LengthMin, h.config.Noise.LengthMax,
213-
h.config.Noise.DelayMin, h.config.Noise.DelayMax)
211+
if h.config.Noises != nil {
212+
errors.LogDebug(ctx, "NOISE", h.config.Noises)
214213
writer = &NoisePacketWriter{
215214
Writer: writer,
216-
noise: h.config.Noise,
215+
noises: h.config.Noises,
217216
firstWrite: true,
218217
UDPOverride: UDPOverride,
219218
}
@@ -396,12 +395,12 @@ func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
396395

397396
type NoisePacketWriter struct {
398397
buf.Writer
399-
noise *Noise
398+
noises []*Noise
400399
firstWrite bool
401400
UDPOverride net.Destination
402401
}
403402

404-
// MultiBuffer writer with Noise in first packet
403+
// MultiBuffer writer with Noise before first packet
405404
func (w *NoisePacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
406405
if w.firstWrite {
407406
w.firstWrite = false
@@ -411,22 +410,23 @@ func (w *NoisePacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
411410
}
412411
var noise []byte
413412
var err error
414-
//User input string
415-
if w.noise.StrNoise != "" {
416-
noise = []byte(w.noise.StrNoise)
417-
} else {
418-
//Random noise
419-
noise, err = GenerateRandomBytes(randBetween(int64(w.noise.LengthMin),
420-
int64(w.noise.LengthMax)))
421-
}
422-
423-
if err != nil {
424-
return err
425-
}
426-
w.Writer.WriteMultiBuffer(buf.MultiBuffer{buf.FromBytes(noise)})
413+
for _, n := range w.noises {
414+
//User input string or base64 encoded string
415+
if n.StrNoise != nil {
416+
noise = n.StrNoise
417+
} else {
418+
//Random noise
419+
noise, err = GenerateRandomBytes(randBetween(int64(n.LengthMin),
420+
int64(n.LengthMax)))
421+
}
422+
if err != nil {
423+
return err
424+
}
425+
w.Writer.WriteMultiBuffer(buf.MultiBuffer{buf.FromBytes(noise)})
427426

428-
if w.noise.DelayMin != 0 {
429-
time.Sleep(time.Duration(randBetween(int64(w.noise.DelayMin), int64(w.noise.DelayMax))) * time.Millisecond)
427+
if n.DelayMin != 0 {
428+
time.Sleep(time.Duration(randBetween(int64(n.DelayMin), int64(n.DelayMax))) * time.Millisecond)
429+
}
430430
}
431431

432432
}

0 commit comments

Comments
 (0)