Skip to content

Commit ad3d347

Browse files
authored
XTLS Vision: Apply padding to single XUDP by default at client side
Requires Xray-core v1.8.1+ at server side: 242f3b0
1 parent dd635c7 commit ad3d347

File tree

4 files changed

+12
-10
lines changed

4 files changed

+12
-10
lines changed

proxy/vless/encoding/addons.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,7 @@ func DecodeHeaderAddons(buffer *buf.Buffer, reader io.Reader) (*Addons, error) {
6262
// EncodeBodyAddons returns a Writer that auto-encrypt content written by caller.
6363
func EncodeBodyAddons(writer io.Writer, request *protocol.RequestHeader, requestAddons *Addons, state *proxy.TrafficState, context context.Context) buf.Writer {
6464
if request.Command == protocol.RequestCommandUDP {
65-
w := writer.(buf.Writer)
66-
if requestAddons.Flow == vless.XRV {
67-
w = proxy.NewVisionWriter(w, state, context)
68-
}
69-
return NewMultiLengthPacketWriter(w)
65+
return NewMultiLengthPacketWriter(writer.(buf.Writer))
7066
}
7167
w := buf.NewWriter(writer)
7268
if requestAddons.Flow == vless.XRV {

proxy/vless/encoding/encoding.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,6 @@ func DecodeResponseHeader(reader io.Reader, request *protocol.RequestHeader) (*A
176176
// XtlsRead filter and read xtls protocol
177177
func XtlsRead(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdater, conn net.Conn, input *bytes.Reader, rawInput *bytes.Buffer, trafficState *proxy.TrafficState, ctx context.Context) error {
178178
err := func() error {
179-
visionReader := proxy.NewVisionReader(reader, trafficState, ctx)
180179
for {
181180
if trafficState.ReaderSwitchToDirectCopy {
182181
var writerConn net.Conn
@@ -188,7 +187,7 @@ func XtlsRead(reader buf.Reader, writer buf.Writer, timer signal.ActivityUpdater
188187
}
189188
return proxy.CopyRawConnIfExist(ctx, conn, writerConn, writer, timer)
190189
}
191-
buffer, err := visionReader.ReadMultiBuffer()
190+
buffer, err := reader.ReadMultiBuffer()
192191
if !buffer.IsEmpty() {
193192
timer.Update()
194193
if trafficState.ReaderSwitchToDirectCopy {

proxy/vless/inbound/inbound.go

+1
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
522522

523523
if requestAddons.Flow == vless.XRV {
524524
ctx1 := session.ContextWithInbound(ctx, nil) // TODO enable splice
525+
clientReader = proxy.NewVisionReader(clientReader, trafficState, ctx1)
525526
err = encoding.XtlsRead(clientReader, serverWriter, timer, connection, input, rawInput, trafficState, ctx1)
526527
} else {
527528
// from clientReader.ReadMultiBuffer to serverWriter.WriteMultiBufer

proxy/vless/outbound/outbound.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
138138
if !allowUDP443 && request.Port == 443 {
139139
return newError("XTLS rejected UDP/443 traffic").AtInfo()
140140
}
141-
requestAddons.Flow = ""
142141
case protocol.RequestCommandMux:
143142
fallthrough // let server break Mux connections that contain TCP requests
144143
case protocol.RequestCommandTCP:
@@ -185,7 +184,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
185184
clientReader := link.Reader // .(*pipe.Reader)
186185
clientWriter := link.Writer // .(*pipe.Writer)
187186
trafficState := proxy.NewTrafficState(account.ID.Bytes())
188-
if request.Command == protocol.RequestCommandUDP && h.cone && request.Port != 53 && request.Port != 443 {
187+
if request.Command == protocol.RequestCommandUDP && (requestAddons.Flow == vless.XRV || (h.cone && request.Port != 53 && request.Port != 443)) {
189188
request.Command = protocol.RequestCommandMux
190189
request.Address = net.DomainAddress("v1.mux.cool")
191190
request.Port = net.Port(666)
@@ -266,8 +265,15 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
266265

267266
// default: serverReader := buf.NewReader(conn)
268267
serverReader := encoding.DecodeBodyAddons(conn, request, responseAddons)
268+
if requestAddons.Flow == vless.XRV {
269+
serverReader = proxy.NewVisionReader(serverReader, trafficState, ctx)
270+
}
269271
if request.Command == protocol.RequestCommandMux && request.Port == 666 {
270-
serverReader = xudp.NewPacketReader(conn)
272+
if requestAddons.Flow == vless.XRV {
273+
serverReader = xudp.NewPacketReader(&buf.BufferedReader{Reader: serverReader})
274+
} else {
275+
serverReader = xudp.NewPacketReader(conn)
276+
}
271277
}
272278

273279
if requestAddons.Flow == vless.XRV {

0 commit comments

Comments
 (0)