From 8381a5a8a6c94d853d6ebe0ada427ee7c815260a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Sat, 2 May 2026 23:27:30 +0800 Subject: [PATCH] Block/Blackhole outbound: Better blocking UDP (#6057) https://github.com/XTLS/Xray-core/issues/6051#issuecomment-4364008008 Fixes https://github.com/XTLS/Xray-core/issues/6052 --------- Co-authored-by: Meo597 <197331664+Meo597@users.noreply.github.com> Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com> --- proxy/blackhole/blackhole.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/proxy/blackhole/blackhole.go b/proxy/blackhole/blackhole.go index 998666cb..17350d15 100644 --- a/proxy/blackhole/blackhole.go +++ b/proxy/blackhole/blackhole.go @@ -6,7 +6,11 @@ import ( "time" "github.com/xtls/xray-core/common" + "github.com/xtls/xray-core/common/buf" + "github.com/xtls/xray-core/common/dice" + "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/session" + "github.com/xtls/xray-core/common/signal" "github.com/xtls/xray-core/transport" "github.com/xtls/xray-core/transport/internet" ) @@ -38,7 +42,17 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte // Sleep a little here to make sure the response is sent to client. time.Sleep(time.Second) } - common.Interrupt(link.Writer) + defer common.Interrupt(link.Writer) + defer common.Interrupt(link.Reader) + // wait to drain all the possible incoming UDP data + if ob.Target.Network == net.Network_UDP { + ctx, cancel := context.WithCancel(ctx) + timer := signal.CancelAfterInactivity(ctx, func() { + cancel() + }, time.Duration(30+dice.Roll(61))*time.Second) + go buf.Copy(link.Reader, buf.Discard, buf.UpdateActivity(timer)) + <-ctx.Done() + } return nil }