mirror of
https://github.com/XTLS/Xray-core.git
synced 2025-04-30 17:38:41 +00:00
UDP noise (#3711)
* added udp noise * adding protobuf settings * freedom json parser and clean up * resolve confict * fix and clean up * use net.conn instead of packetconnwrapper * avoid constructing SequentialWriter directly --------- Co-authored-by: mmmray <142015632+mmmray@users.noreply.github.com>
This commit is contained in:
parent
8674ed5a0d
commit
002d08bf83
4 changed files with 295 additions and 37 deletions
|
@ -208,6 +208,16 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
|||
}
|
||||
} else {
|
||||
writer = NewPacketWriter(conn, h, ctx, UDPOverride)
|
||||
if h.config.Noise != nil {
|
||||
errors.LogDebug(ctx, "NOISE", h.config.Noise.StrNoise, h.config.Noise.LengthMin, h.config.Noise.LengthMax,
|
||||
h.config.Noise.DelayMin, h.config.Noise.DelayMax)
|
||||
writer = &NoisePacketWriter{
|
||||
Writer: writer,
|
||||
noise: h.config.Noise,
|
||||
firstWrite: true,
|
||||
UDPOverride: UDPOverride,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err := buf.Copy(input, writer, buf.UpdateActivity(timer)); err != nil {
|
||||
|
@ -329,6 +339,7 @@ func NewPacketWriter(conn net.Conn, h *Handler, ctx context.Context, UDPOverride
|
|||
UDPOverride: UDPOverride,
|
||||
Conn: iConn,
|
||||
}
|
||||
|
||||
}
|
||||
return &buf.SequentialWriter{Writer: conn}
|
||||
}
|
||||
|
@ -385,6 +396,45 @@ func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
type NoisePacketWriter struct {
|
||||
buf.Writer
|
||||
noise *Noise
|
||||
firstWrite bool
|
||||
UDPOverride net.Destination
|
||||
}
|
||||
|
||||
// MultiBuffer writer with Noise in first packet
|
||||
func (w *NoisePacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
||||
if w.firstWrite {
|
||||
w.firstWrite = false
|
||||
//Do not send Noise for dns requests(just to be safe)
|
||||
if w.UDPOverride.Port == 53 {
|
||||
return w.Writer.WriteMultiBuffer(mb)
|
||||
}
|
||||
var noise []byte
|
||||
var err error
|
||||
//User input string
|
||||
if w.noise.StrNoise != "" {
|
||||
noise = []byte(w.noise.StrNoise)
|
||||
} else {
|
||||
//Random noise
|
||||
noise, err = GenerateRandomBytes(randBetween(int64(w.noise.LengthMin),
|
||||
int64(w.noise.LengthMax)))
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
w.Writer.WriteMultiBuffer(buf.MultiBuffer{buf.FromBytes(noise)})
|
||||
|
||||
if w.noise.DelayMin != 0 {
|
||||
time.Sleep(time.Duration(randBetween(int64(w.noise.DelayMin), int64(w.noise.DelayMax))) * time.Millisecond)
|
||||
}
|
||||
|
||||
}
|
||||
return w.Writer.WriteMultiBuffer(mb)
|
||||
}
|
||||
|
||||
type FragmentWriter struct {
|
||||
fragment *Fragment
|
||||
writer io.Writer
|
||||
|
@ -471,3 +521,13 @@ func randBetween(left int64, right int64) int64 {
|
|||
bigInt, _ := rand.Int(rand.Reader, big.NewInt(right-left))
|
||||
return left + bigInt.Int64()
|
||||
}
|
||||
func GenerateRandomBytes(n int64) ([]byte, error) {
|
||||
b := make([]byte, n)
|
||||
_, err := rand.Read(b)
|
||||
// Note that err == nil only if we read len(b) bytes.
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return b, nil
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue